Moja aplikacja C++ musi obliczyć wartość mieszania MD5, obecnie jest to zrobione przez OpenSSL i chcę przenieść ją do wykorzystania WinAPI - aby uniknąć zależności w zewnętrznych bibliotekach.
Napisałem ten kod:Oblicz wartość mieszania MD5 przez C++ WinAPI
HCRYPTPROV hCryptProv = NULL;
HCRYPTHASH hHash = NULL;
HCRYPTHASH hHexHash = NULL;
HASH HA1;
HASHHEX HA1HEX;
DWORD data = HASHLEN;
// Get a handle to a cryptography provider context.
if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0))
{
goto err;
}
// Acquire a hash object handle.
if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
{
goto err;
}
CryptHashData(hHash, (const BYTE *)str, strlen(str), 0);
teraz, dziwne jest to, że somtimes to działa dobrze, ale w innych czasach powrót CryptAcquireContext z błędu NTE_BAD_KEYSET że zgodnie MSDN:
Kluczem pojemnik nie może być otwartym. Częstą przyczyną tego błędu jest to, że kontener klucza nie istnieje. Aby utworzyć kontener klucza, wywołaj CryptAcquireContext za pomocą flagi CRYPT_NEWKEYSET. Ten kod błędu może również wskazywać, że dostęp do istniejącego kontenera kluczy jest zabroniony. Prawa dostępu do kontenera mogą być nadane przez twórcę zestawu kluczy za pomocą CryptSetProvParam.
Blockquote
Teraz moje pytania to:
- jeśli zadzwonię do CryptSetProvParam, co exceactly to robi? czy to normalne, że prosta aplikacja zmieni ustawienia systemu operacyjnego?
- Czy istnieje mniej trudny sposób wykonywania obliczeń MD5 w oknach C++?
Zatwierdzam, jeśli ktoś będzie mógł mi doradzić, co robić.
Dzięki
Implementacja dedykowana domenie publicznej [można znaleźć tutaj] (http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5). –
dziękuję, ale na razie wolę go nie wdrażać. – RRR
Nie wdrożysz tego samodzielnie. Po prostu upuść md5.c i md5.h do swojego projektu i wywołaj funkcje. –