C# RSA 解密间歇性故障



我有以下用于解密值的实现。此实现有效,但在一些小情况下,我尝试解密的值会引发加密异常,并显示消息"参数不正确"。这发生在我在下面的私钥上调用 Decrypt 方法的地方。

所有值都使用公钥加密,在传输过程中编码 base64,并以相同的方式传递给此方法,所以我不明白为什么它有时会爆炸。如果我使用公钥重新加密,该新值通常可以成功取消加密。

在本例中,以下证书是 X509Certificate2

public string Decrypt(CertificateType certificateType, byte[] encryptedString)
{
string result = null;
var certificate = GetCertificate(certificateType);
var privateKey = certificate?.GetRSAPrivateKey();
if (privateKey != null)
{
var decryptedBytes = privateKey.Decrypt(encryptedString, RSAEncryptionPadding.Pkcs1);
result = Encoding.Default.GetString(decryptedBytes);
}
return result;
}

关于什么会导致这种例外的任何想法?

您应该运行它 1000 倍并记录所有错误,查看这些base64输入字符串的共同点以及传递字符串的作用 - 我的猜测是它与base64编码相关的填充(有些编码器会在字符串末尾用等号填充,有些不会,然后一些解码器期望填充,有些能够处理它(。当它正确排列时,解密工作,当它不对齐(base64字符串的长度(时,该方法会引发异常。 另一种选择是 而不是base64,你应该做base64url编码。当它起作用时,是因为base64(x) == base64url(x),当它不起作用时,是因为base64(x) != base64url(x)

看起来是使用 Base64 编码。谢谢你的帮助!

这篇文章的答案确实消除了我遇到的解密问题: RSA 加密和解密在 JS 中成功,但在 C# 中解密失败

最新更新