[英]RSACryptoServiceProvider error occurred while decoding OAEP padding
我已经阅读了很多关于这个问题的文章,但似乎找不到解决我的错误的答案。
我有一个 WCF 服务; 我的应用程序发送生成的公共 RSA 密钥,服务返回一组使用公共密钥加密的 AES 密钥 + IV,但是当我的应用程序尝试解密密钥时,我要么得到“解码 OAEP 填充时出错”(如果我将 true 传递给 useOAEP)或“参数不正确”(如果我将 false 传递给 useOAEP)。 为简单起见,这是将使用的全部代码放在一起,将异常处理放在一边:
public static string EncryptAES(byte[] aesKey, byte[] aesIV, string publicRSAKey)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicRSAKey);
byte[] encryptedKey = rsa.Encrypt(aesKey, true);
byte[] encryptedIV = rsa.Encrypt(aesIV, true);
return string.Format("{0}{1}{2}", Convert.ToBase64String(encryptedKey), "\n", Convert.ToBase64String(encryptedIV));
}
}
public static byte[] Decrypt(string aesKeyorIV)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
byte[] buffer = Convert.FromBase64String(aesKeyorIV);
rsa.FromXmlString(RSA_Private_Key);
return rsa.Decrypt(buffer, true); //Exception thrown here
}
}
( RSA_Private_Key
是在静态构造函数中使用rsa.ToXmlString(true)
)
( publicRSAKey
通过在静态构造rsa.ToXmlString(false)
发送rsa.ToXmlString(false)
传递给服务)
我尝试使用Encrypt/Decrypt(byte[], false)
但它没有任何区别。 我也试过Array.Reverse(encryptedKey)
然后是Array.Reverse(buffer)
。
私钥在设置后永远不会发送/修改,因此不可能。
我没有想法,调试 WCF 服务非常糟糕。
您所描述的问题很可能是由于使用不同的私钥到公钥引起的。
如果您使用 RSA 提供程序的同一实例生成公钥和公钥+私钥,则密钥将匹配。 例如
string publicRSAKey = null;
string publicPlusPrivateRSAKey = null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicRSAKey = rsa.ToXmlString(false);
publicPlusPrivateRSAKey = rsa.ToXmlString(true);
}
如果您从 RSA 提供程序的两个不同实例创建密钥,则公钥和公钥+私钥将不匹配。 例如
string publicRSAKey = null;
string publicPlusPrivateRSAKey = null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicRSAKey = rsa.ToXmlString(false);
}
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicPlusPrivateRSAKey = rsa.ToXmlString(true);
}
当密钥匹配时,我可以毫无问题地往返。 当密钥不匹配时,我收到“解码 OAEP 填充时发生错误。”。
您能在运行时验证密钥是否匹配吗?
由于私钥也将包含公钥,因此您可以以 xml 字符串形式查看每个密钥变量的内容,特别是 /RSAKeyValue/Modulus 和 /RSAKeyValue/Exponent 的 XML 路径,因为它们应该在两者之间匹配。
我终于发现了错误所在。 我的实现如下,简化了:
我改变了我的实现,例如:
由于我使用一个 Visual Studio 实例来调试 2 个进程(服务的和 Visual Studio 调试器的),我没有意识到私钥/公钥是不同的。
感谢@zespri 的测试想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.