4 Stimmen

Verwendung eines SHA1 mit Microsoft CAPI

Ich habe einen SHA1-Hash und muss ihn signieren. Die Methode CryptSignHash() erfordert ein HCRYPTHASH-Handle zum Signieren. Ich erstelle es, und da ich den tatsächlichen Hash-Wert bereits habe, setze ich ihn:

CryptCreateHash(cryptoProvider, CALG_SHA1, 0, 0, &hash);
CryptSetHashParam(hash, HP_HASHVAL, hashBytes, 0);

Die HashBytes sind ein Array von 20 Bytes.

Das Problem ist jedoch, dass die von diesem HCRYPTHASH-Handle erzeugte Signatur falsch ist. Ich habe das Problem auf die Tatsache zurückgeführt, dass CAPI nicht alle 20 Bytes meines HashBytes-Arrays verwendet. Aus irgendeinem Grund denkt es, dass SHA1 nur 4 Bytes umfasst.

Um dies zu überprüfen, habe ich dieses kleine Programm geschrieben:

HCRYPTPROV cryptoProvider;
CryptAcquireContext(&cryptoProvider, NULL, NULL, PROV_RSA_FULL, 0);

HCRYPTHASH hash;
HCRYPTKEY keyForHash;
CryptCreateHash(cryptoProvider, CALG_SHA1, keyForHash, 0, &hash);

DWORD hashLength;
CryptGetHashParam(hash, HP_HASHSIZE, NULL, &hashLength, 0);
printf("hashLength: %d\n", hashLength);

Das Ergebnis ist: hashLength: 4 !

Kann mir jemand erklären, was ich falsch mache oder warum Microsoft CAPI denkt, dass SHA1 4 Bytes (32 Bits) statt 20 Bytes (160 Bits) ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X