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.

questionAnswers(1)

yourAnswerToTheQuestion