Windows CryptoAPI: CryptSignHash mit CALG_SHA_256 und privaten Schlüssel von MEINEM keystore

Ich versuche das erzeugen digitaler Signaturen auf Windows (ab XP SP3, aber derzeit getestet mit Windows 7) mit CryptoAPI-kompatibel mit dem folgenden openssl-Kommandos:

openssl dgst -sha256 -sign <parameters> (for signing)
openssl dgst -sha256 -verify <parameters> (for validation)

Möchte ich mit einem privaten Schlüssel aus der Windows - "MEINE" - keystore zum signieren.

Schaffte ich es zum signieren von Dateien verwenden der SHA1-digest-Algorithmus mit der folgenden CryptoAPI-Funktionen (weglassen von Parametern für die Kürze):

CertOpenStore
CertFindCertificateInStore
CryptAcquireCertificatePrivateKey
CryptCreateHash (with CALG_SHA1)
CryptHashData
CryptSignHash

Die erzeugte Signatur ist kompatibel mit "openssl dgst -sha1 -überprüfen" (einmal die byte-Reihenfolge Umgekehrt).

Mein problem ist: wenn ich versuche, mit CALG_SHA_256 mit CryptCreateHash, es schlägt fehl mit Fehler 80090008 (NTE_BAD_ALGID). Durch googeln um, ich fand, dass ich brauchte, um einen bestimmten Anbieter (PROV_RSA_AES) anstelle des Standard ein. Da hätte ich einen Anbieter Griff, würde ich auch ersetzen müssen CryptAcquireCertificatePrivateKey von CryptGetUserKey. Also modifizierte ich mein Programm so Aussehen:

CryptAcquireContext (with PROV_RSA_AES)
CertOpenStore
CertFindCertificateInStore
CryptGetUserKey
CryptCreateHash (with CALG_SHA256)
CryptHashData
CryptSignHash

Leider hat dies nicht wie erwartet funktioniert: CryptGetUserKey fehlgeschlagen mit Fehler 8009000D (NTE_NO_KEY). Wenn ich entfernen Sie die CryptGetUserKey nennen, das Programm läuft bis CryptSignHash, die schlägt fehl mit Fehler 80090016 (NTE_BAD_KEYSET). Ich weiß, der Schlüsselsatz ist vorhanden und funktioniert einwandfrei, da war ich in der Lage, es zu benutzen, um Zeichen der SHA1-digest.

Ich habe versucht, den Erwerb der Kontext wieder mit Informationen aus dem Zertifikat Zusammenhang habe ich von CertFindCertificateInStore: das beste was ich tun konnte, war eine erfolgreiche CryptGetUserKey nennen, aber CryptSignHash würde immer Fehler mit dem gleichen Fehler.

Den private key ich bin versucht, ist 2048 bit lang, aber ich erwarte nicht, dass es ein problem zu sein, da klappt es mit dem SHA1-digest. Ich bin an einem Verlust, so dass jeder Vorschlag wäre sehr willkommen!

wie Sie die umgekehrte byte-Reihenfolge. war es 128-bit-Umkehrung

InformationsquelleAutor Dominique Eav | 2010-11-16

Schreibe einen Kommentar