使用 RSACryptoServiceProvider 的错误密钥异常

Bad Key Exception using RSACryptoServiceProvider

密钥交换方式为:RSA-PKCS1-KeyEx

所以我认为其他类似问题的答案不适用,而且我无法控制证书 - 它有效并且应该有效。

.NET 框架 3.5

代码:

        RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
        byte[] bytestodecrypt = Convert.FromBase64String(SignatureValue);
        byte[] plainbytes = rsa.Decrypt(bytestodecrypt, false); 

rsa对象的属性截图:

虽然 RSA 可以同时进行签名和加密,但它们不能互换使用(除了算法的原始/"no padding" 版本,.NET 不支持;即使那样,密钥是 "backwards").

签名 blob 由 "encrypting" 使用私钥计算得出。它通过public键得到"decrypted",然后底层系统将其与提供的散列和散列算法进行比较。如果它们都匹配,则 returns 为真;否则它 returns false(或者如果它真的很困惑可能会抛出异常)。

所以你想要 rsa.VerifyHash(hash, signature, hashAlgorithm, RSASignaturePadding.Pkcs1) 而不是 rsa.Decrypt(signature, false),returns 一个布尔值。

"bad key"异常是因为你只有一个public密钥(足以验证)但调用了解密(这需要私钥)。