Цифровая подпись, сделанная в C #, не проверяется в C ++
У меня есть приложение на C #, которое подписывает данные с помощью RSA. Код выглядит следующим образом:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(privateKeyBlob);
SHA1 sha1 = new SHA1CryptoServiceProvider();
sha1.ComputeHash(myData);
byte[] signature = rsa.SignHash(sha1.Hash, CryptoConfig.MapNameToOID("SHA1"));
Я не могу проверить подпись в C ++. Код выглядит следующим образом:
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);
Подтверждение возвращает 0,GetLastError()
возвращает 2148073478 «Неверная подпись». Хеши одинаковы. Я попробовал с и безCRYPT_NOHASHOID
флаг.
Я попытался подписать данные в C ++ (просто для сравнения результатов). Я удалилCRYPT_VERIFYCONTEXT
флаг. Но импорт закрытого ключа BLOB завершается с ошибкой 1008 «Была сделана попытка сослаться на несуществующий токен». Генерация нового ключа завершается с той же ошибкой.