Podpis cyfrowy wykonany w języku C # nie weryfikuje w C ++
Mam aplikację C #, która cyfrowo podpisuje dane za pomocą RSA. Kod jest następujący:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(privateKeyBlob);
SHA1 sha1 = new SHA1CryptoServiceProvider();
sha1.ComputeHash(myData);
byte[] signature = rsa.SignHash(sha1.Hash, CryptoConfig.MapNameToOID("SHA1"));
Nie mogę zweryfikować podpisu w C ++. Kod jest następujący:
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);
Weryfikacja zwraca 0,GetLastError()
zwraca 2148073478 „Nieprawidłowy podpis”. Hasze są takie same. Próbowałem tego z i bezCRYPT_NOHASHOID
flaga.
Próbowałem podpisać dane w C ++ (tylko w celu porównania wyników). UsunąłemCRYPT_VERIFYCONTEXT
flaga. Ale importowanie klucza prywatnego BLOB kończy się niepowodzeniem z 1008 „Próbowano odwołać się do tokena, który nie istnieje”. Wygenerowanie nowego klucza kończy się niepowodzeniem z tym samym błędem.