Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Win32 API | Криптография : Какая-то засада с MD5 хэшем (http://forum.oszone.net/showthread.php?t=75048)

hasherfrog 23-11-2006 00:12 515693

Win32 API | Криптография : Какая-то засада с MD5 хэшем
 
Вот текст:
Код:

        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 515713

Ага, тут понял. в чём дело. 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 515877

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


Время: 06:38.

Время: 06:38.
© OSzone.net 2001-