|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
С нами:
9023100
Репутация:
395
|
|
MD5 на основе Crypto API
Понадобилось генерировать 128-ми битные ключи для RC4 шифрования, вспомнил про MD5.
вариант с использованием динамически выделяемой памяти
Код:
#include <wincrypt.h>
// на выходе адрес буфера 16 байтного хеша
// после использования выполни VirtualFree(LPVOID lpAddress,0,MEM_RELEASE);
unsigned char *md5(unsigned char *string,DWORD count)
{
HCRYPTPROV hProv;
HCRYPTHASH hHash;
unsigned char *hash_value;
// Инициализация контекста криптопровайдера
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
// Cоздание хеш-объекта
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Передача хешируемых данных хэш-объекту.
if (CryptHashData(hHash, string, count, 0))
{
// Получение хеш-значения
count = 0;
if (CryptGetHashParam(hHash, HP_HASHVAL, NULL, &count, 0))
{
hash_value=(unsigned char *)VirtualAlloc(NULL,count,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
if (CryptGetHashParam(hHash, HP_HASHVAL, hash_value, &count, 0))
{
return hash_value;
}
}
}
}
}
return NULL;
}
но хеш-то всегда 16 байт поэтому можно оптимизировать так
Код:
// hash_value указатель на >=16 байтный буфер (напр. char hash[16];)
BOOL md5(unsigned char *hash_value,unsigned char *string,DWORD count)
{
HCRYPTPROV hProv;
HCRYPTHASH hHash;
// Инициализация контекста криптопровайдера
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
// Cоздание хеш-объекта
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Передача хешируемых данных хэш-объекту.
if (CryptHashData(hHash, string, count, 0))
{
// Получение хеш-значения
count = 16;
if (CryptGetHashParam(hHash, HP_HASHVAL, hash_value, &count, 0)) return TRUE;
}
}
}
return FALSE;
}
Последний раз редактировалось Gar|k; 19.04.2010 в 00:14..
Причина: хммм а нафига динамически выделять...
|