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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить максимальное количество идущих подряд чётных чисел http://www.cyberforum.ru/cpp-beginners/thread976263.html
Как определить максимальное количество идущих подряд чётных чисел для такого, к примеру, ряда чисел: 1 2 2 23 4 2 14 9 18 88 4 5 2 2 34 0
C++ Вывести на экран сначала все цифры, входящие в текст, а затем все остальные литеры написать программу на C++ нужно Задан текст, заканчивающийся точкой. Вывести на экран сначала все цифры, входящие в него, а затем все остальные литеры. При написании программы нельзя пользоваться стандартными функциями обработки строк http://www.cyberforum.ru/cpp-beginners/thread976261.html
C++ Ввод из файла не работает
Здравствуйте, помогите пожалуйста решить проблему. Программа должна ввести данные из файла в массив структур. Но до этого дело так и не доходит: файл не открывается, срабатывает конструкция If для отлова ошибки открытия. Внизу сокращённый текст программы с проблемным участком: void main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale (LC_ALL, "RUS"); // вызов функции...
C++ Перевести программу с языка С++
С языком Си плохо знаком, ну очень плохо, переведите программу с языка С++ на язык Си #include <iostream> #include <vector> #include <cmath> #include <iomanip> double number(); double factor();
C++ Виртуальные методы http://www.cyberforum.ru/cpp-beginners/thread976240.html
Всем доброго времени суток! Вопрос следующий. Как я могу функцией делать подмену виртуального метода у класса?
C++ Передача параметров в функцию по умолчанию Здравствуйте! Вот в этом коде: #include <iostream> #include <fstream> #include <string> using namespace std; struct Book { подробнее

Показать сообщение отдельно
Limb0
 Аватар для Limb0
19 / 19 / 0
Регистрация: 22.01.2012
Сообщений: 88
13.10.2013, 15:09     Проблемы с выделением памяти
Здравствуйте, я в своем проекте использую эту функцию
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]; Как решить это?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru