In C # erstellte digitale Signaturen werden in C ++ nicht überprüft

Ich habe eine C # -Anwendung, die Daten mit RSA digital signiert. Der Code lautet wie folgt:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(privateKeyBlob);

SHA1 sha1 = new SHA1CryptoServiceProvider();
sha1.ComputeHash(myData);

byte[] signature = rsa.SignHash(sha1.Hash, CryptoConfig.MapNameToOID("SHA1"));

Ich kann die Signatur in C ++ nicht überprüfen. Der Code lautet wie folgt:

HCRYPTPROV cryptProvider;
CryptAcquireContext(&cryptProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
// PROV_RSA_SIG does not work

HCRYPTKEY publicKey;
CryptImportKey(cryptProvider, publicKeyBlob, publicKeyBlobLength, 0, 0, &publicKey);

HCRYPTHASH hash;
CryptCreateHash(cryptProvider, CALG_SHA1, 0, 0, &hash);
CryptHashData(hash, myData, myDataLength, 0);

BOOL isSigOk = CryptVerifySignature(hash, signature, signatureLength, publicKey, NULL, CRYPT_NOHASHOID);

Die Überprüfung gibt 0 zurück,GetLastError() gibt 2148073478 "Ungültige Signatur" zurück. Die Hashes sind die gleichen. Ich habe es mit und ohne versuchtCRYPT_NOHASHOID Flagge.

Ich habe versucht, die Daten in C ++ zu signieren (nur um die Ergebnisse zu vergleichen). Ich habe das entferntCRYPT_VERIFYCONTEXT Flagge. Das Importieren des privaten BLOB-Schlüssels schlägt jedoch mit 1008 "Es wurde versucht, auf ein nicht vorhandenes Token zu verweisen" fehl. Das Generieren eines neuen Schlüssels schlägt mit demselben Fehler fehl.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage