Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Limb0
19 / 19 / 0
Регистрация: 22.01.2012
Сообщений: 88
#1

Проблемы с выделением памяти - C++

13.10.2013, 15:09. Просмотров 322. Ответов 0
Метки нет (Все метки)

Здравствуйте, я в своем проекте использую эту функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
#include "windows.h"
#include <wincrypt.h>
 
#ifndef CALG_HMAC
#define CALG_HMAC (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_HMAC)
#endif
 
#ifndef CRYPT_IPSEC_HMAC_KEY
#define CRYPT_IPSEC_HMAC_KEY 0x00000100
#endif
 
#pragma comment(lib, "crypt32.lib")
 
using namespace std;
 
char * HMAC(char * str, char * password, DWORD AlgId);
 
 
typedef struct _my_blob{
BLOBHEADER header;
DWORD len;
BYTE key[0];
}my_blob;
 
 
int main(int argc, _TCHAR* argv[])
{
 
     char * hash_sha1 = HMAC("ROSDEVIL", "password", CALG_SHA1);
     char * hash_md5 = HMAC("ROSDEVIL", "password", CALG_MD5);
     
     cout<<"Hash HMAC-SHA1: "<<hash_sha1<<" ( "<<strlen(hash_sha1)<<" )"<<endl;
     cout<<"Hash HMAC-MD5: "<<hash_md5<<" ( "<<strlen(hash_md5)<<" )"<<endl;
     
     cin.get();
     return 0;
}
 
char * HMAC(char * str, char * password, DWORD AlgId = CALG_MD5){
 
   HCRYPTPROV  hProv = 0;
   HCRYPTHASH  hHash = 0;
   HCRYPTKEY   hKey = 0;
   HCRYPTHASH  hHmacHash = 0;
   BYTE    * pbHash = 0;
   DWORD       dwDataLen = 0;
   HMAC_INFO   HmacInfo;
 
   int err = 0;
   
   ZeroMemory(&HmacInfo, sizeof(HmacInfo));
   
   if (AlgId == CALG_MD5){
        HmacInfo.HashAlgid = CALG_MD5;
        pbHash = new BYTE[16];
        dwDataLen = 16;
   }else if(AlgId == CALG_SHA1){
        HmacInfo.HashAlgid = CALG_SHA1;
        pbHash = new BYTE[20];
        dwDataLen = 20;
   }else{
        return 0;     
   }
   
   ZeroMemory(pbHash, sizeof(dwDataLen));
   char * res = new char[dwDataLen * 2];
   
   my_blob * kb = NULL;
   DWORD kbSize = sizeof(my_blob) + strlen(password);
 
   kb = (my_blob*)malloc(kbSize);
   kb->header.bType = PLAINTEXTKEYBLOB;
   kb->header.bVersion = CUR_BLOB_VERSION;
   kb->header.reserved = 0;
   kb->header.aiKeyAlg = CALG_RC2;
   memcpy(&kb->key, password, strlen(password));
   kb->len = strlen(password);
 
 
   if (!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL,CRYPT_VERIFYCONTEXT | CRYPT_NEWKEYSET)){
      err = 1;
      goto Exit;
   }
 
 
   if (!CryptImportKey(hProv,  (BYTE*)kb, kbSize, 0, CRYPT_IPSEC_HMAC_KEY, &hKey)){
       err = 1;
       goto Exit;
   }
 
   if (!CryptCreateHash(hProv, CALG_HMAC, hKey, 0, &hHmacHash)){
       err = 1;
       goto Exit;
   }
   
   
   if (!CryptSetHashParam(hHmacHash, HP_HMAC_INFO, (BYTE*)&HmacInfo, 0)){
       err = 1;
       goto Exit;
   }
 
   if (!CryptHashData(hHmacHash, (BYTE*)str, strlen(str), 0)){
       err = 1;
       goto Exit;
   }
   
   if (!CryptGetHashParam(hHmacHash, HP_HASHVAL, pbHash, &dwDataLen, 0)){
       err = 1;
       goto Exit;
   }
 
   ZeroMemory(res, dwDataLen * 2);
   char * temp;
   temp = new char[3];
   ZeroMemory(temp, 3);
   for (unsigned int m = 0; m < dwDataLen; m++){
       sprintf(temp, "%2x", pbHash[m]);
       if (temp [1] == ' ') temp [1] = '0';  // note these two: they are two CORRECTIONS to the conversion in HEX, sometimes the Zeros are
       if (temp [0] == ' ') temp [0] = '0';  // printed with a space, so we replace spaces with zeros; (this error occurs mainly in HMAC-SHA1)
       sprintf(res,"%s%s", res,temp);  
   }
   
   delete [] temp;
 
    Exit:
    free(kb);
    if(hHmacHash)
        CryptDestroyHash(hHmacHash);
    if(hKey)
        CryptDestroyKey(hKey);
    if(hHash)
        CryptDestroyHash(hHash);    
    if(hProv)
        CryptReleaseContext(hProv, 0);
   
     
    if (err == 1){
        delete [] res;
        return "";      
    }
     
    return res;
}
Но проблема в том что когда я просто создаю проект с этим кодом тогда при любой длине строки char * str у меня все работает нормально, но когда я использую функцию в своем проекте, тогда все коректно работает только при небольшой длине (10-15 символов), а при большей длине, у меня эта функция выводит ошибку при любом выделении памяти с помощью оператора new "crypto_test.exe вызвал срабатывание точки останова." И открывается в вкладка в Visual studio 2012 malloc.c с вот таким кодом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
__forceinline void * __cdecl _heap_alloc (size_t size)
 
{
 
    if (_crtheap == 0) {
        _FF_MSGBANNER();    /* write run-time error banner */
 
        _NMSG_WRITE(_RT_CRT_NOTINIT);  /* write message */
        __crtExitProcess(255);  /* normally _exit(255) */
    }
 
    return HeapAlloc(_crtheap, 0, size ? size : 1);
}
То есть у меня ошибка сначала при этой строке 60 pbHash = new BYTE[20]; а если вынести это выделения за функцию, немного переделав ее, тогда появляется уже в этой строке ошибка char * res = new char[dwDataLen * 2]; Как решить это?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2013, 15:09     Проблемы с выделением памяти
Посмотрите здесь:

Проблемы с выделением памяти - C++
Здравствуйте. Есть контейнер QList &lt;Node *&gt; В Node свой QList &lt;Node *&gt;. Строю программное дерево разбора выражение. На небольших...

ошибка с выделением памяти - C++
выдает ошибку в выделении памяти. никто не подскажет почему? если что -задача звучит так примерно вводим веественные числа пока не...

Конструктор с выделением памяти - C++
Среди всех данных есть указатель, память для которого выделяется в конструкторе, необходимый размер передается в параметрах конструктора....

Проблема с выделением памяти - C++
Всем привет! Нужна помощь. Создаю класс и при компиляции возникает ошибка. Не пойму причину. Помогите пожалуйста. Конструктор должен...

Работа со строками и выделением памяти - C++
Задание написать класс строк (что-то типа String). #define MAX 100 class ascii { private: char* str; int len; ...

Задача на строки с выделением памяти - C++
Добрый вечер, помогите с задачкой Выводит на экран только строки, состоящие из заданного количества слов. Возвращает количество прочих...

Строки с выделением динамической памяти - C++
Привет всем! Помогите решить вот такую задачу: Ввести две строки. Определить совпадение их слов (Первое слово 1 строки сравнить с первым...

Динамическое выделением памяти для массивов - C++
Даны три массива вещественных чисел X(25), B(30), Y(25). Из исходных массивов сформировать массив К, элементы которого равны количеству...

Обращение к структуре в классе с выделением памяти - C++
Добрый день уважаемые форумчане. Столкнулся с такой проблемой. Есть класс: class Components { struct comps{ // -- База компонентов ...

Двумерный массив с динамическим выделением памяти - C++
Помогите пожалуйста вставить вот в эту вот задачу динамическое выделение памяти: #include &lt;iostream&gt; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru