使用 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密钥(足以验证)但调用了解密(这需要私钥)。
密钥交换方式为: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密钥(足以验证)但调用了解密(这需要私钥)。