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.