PDA

Показать полную графическую версию : Win32 API | Криптография : Какая-то засада с MD5 хэшем


hasherfrog
23-11-2006, 00:12
Вот текст:

HCRYPTPROV hCryptProv;
HCRYPTKEY hKey;
HCRYPTHASH hHash;

//--------------------------------------------------------------------
// Get a handle to the default provider.
if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
MyHandleError("Error during CryptAcquireContext!");

//--------------------------------------------------------------------
// Create a hash object.
if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
MyHandleError("Error during CryptCreateHash!");

//Теперь внимание!
BYTE Data[20] = { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 };
DWORD wDataLen = 20;
CryptGetHashParam(hHash, HP_HASHSIZE, 0, &wDataLen, 0);
printf("size: %d\n", wDataLen);

Почему размер получается 4???

hasherfrog
23-11-2006, 01:32
Ага, тут понял. в чём дело. 4 - это размер. А само значение получается 16, всё правильно.


Следующая проблема. Как вручную задать точное значение хэша?


проблема тут вот в чё:
если делать так:

UINT mkey[4];
mkey[0] = (UINT)0x....;
mkey[1] = (UINT)0x....;
mkey[2] = (UINT)0x....;
mkey[3] = (UINT)0x....;

if (!CryptHashData(hHash, (BYTE*)mkey, 16, 0))
MyHandleError("Error during CryptHashData!");

то хэш (ключ) будет перефигачен.

а если так,
UINT mkey[4];
mkey[0] = (UINT)0x....;
mkey[1] = (UINT)0x....;
mkey[2] = (UINT)0x....;
mkey[3] = (UINT)0x....;

if (!CryptSetHashParam(hHash, HP_HASHVAL, (BYTE*)mkey, 0))
MyHandleError("Error during CryptSetHashParam!");

, то потом этот хэш не всовывается в CryptDeriveKeyЖ
if(!CryptDeriveKey(hCryptProv, CALG_RC4, hHash, 0x00800000 | CRYPT_NO_SALT, &hKey))
MyHandleError("Error during CryptDeriveKey!");
даёт ошибку "плохой хэш".

Что делать?

hasherfrog
23-11-2006, 11:47
Прочитал, что хэш, созданный через HP_HASHVAL надо подписывать.
Но не получается, бред-какой-то... Ыыы...




© OSzone.net 2001-2012