La firma digital hecha en C # no verifica en C ++
Tengo una aplicación de C # que firma digitalmente los datos mediante RSA. El código es el siguiente:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(privateKeyBlob);
SHA1 sha1 = new SHA1CryptoServiceProvider();
sha1.ComputeHash(myData);
byte[] signature = rsa.SignHash(sha1.Hash, CryptoConfig.MapNameToOID("SHA1"));
No puedo verificar la firma en C ++. El código es el siguiente:
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);
La verificación devuelve 0,GetLastError()
Devuelve 2148073478 "Firma inválida". Los hashes son los mismos. Lo probé con y sin elCRYPT_NOHASHOID
bandera.
Intenté firmar los datos en C ++ (solo para comparar los resultados). Quité elCRYPT_VERIFYCONTEXT
bandera. Pero la importación de la clave privada BLOB falla con 1008 "Se intentó hacer referencia a un token que no existe". La generación de una nueva clave falla con el mismo error.