Assinatura digital feita em C # não verifica em C ++
Eu tenho um aplicativo c # que assina digitalmente dados usando o RSA. O código é o seguinte:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(privateKeyBlob);
SHA1 sha1 = new SHA1CryptoServiceProvider();
sha1.ComputeHash(myData);
byte[] signature = rsa.SignHash(sha1.Hash, CryptoConfig.MapNameToOID("SHA1"));
Não consigo verificar a assinatura em C ++. O código é o seguinte:
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);
A verificação retorna 0,GetLastError()
devolve 2148073478 "Assinatura inválida". Os hashes são os mesmos. Eu tentei com e sem oCRYPT_NOHASHOID
bandeira.
Eu tentei assinar os dados em C ++ (apenas para comparar os resultados). Eu removi oCRYPT_VERIFYCONTEXT
bandeira. Mas a importação da chave privada BLOB falha com 1008 "Foi feita uma tentativa de referenciar um token que não existe". Gerar uma nova chave falha com o mesmo erro.