繁体   English   中英

解码 OAEP 填充时出现 RSACryptoServiceProvider 错误

[英]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 路径,因为它们应该在两者之间匹配。

我终于发现了错误所在。 我的实现如下,简化了:

  1. 应用创建公钥+私钥并将公钥发送给服务
  2. 该服务使用 AES 生成的用公钥加密的密钥进行响应。
  3. 然后,该服务尝试在引发事件以提醒应用程序之前解密密钥

我改变了我的实现,例如:

  1. 该服务使用加密消息引发事件
  2. 应用程序使用私钥解密消息。

由于我使用一个 Visual Studio 实例来调试 2 个进程(服务的和 Visual Studio 调试器的),我没有意识到私钥/公钥是不同的。

感谢@zespri 的测试想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM