Показать сообщение отдельно

MD5 на основе Crypto API
  #6  
Старый 18.04.2010, 23:32
Gar|k
Постоянный
Регистрация: 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.. Причина: хммм а нафига динамически выделять...
 
Ответить с цитированием