C# 解码OAEP填充时发生RSACryptServiceProvider错误
我已经读了很多关于这个问题的文章,但我似乎找不到解决我的bug的答案C# 解码OAEP填充时发生RSACryptServiceProvider错误,c#,wcf,encryption,rsa,C#,Wcf,Encryption,Rsa,我已经读了很多关于这个问题的文章,但我似乎找不到解决我的bug的答案我有WCF服务;我的应用程序发送生成的RSA公钥,服务返回一组使用公钥加密的AES密钥+IV,但当我的应用程序尝试解密密钥时,我会得到“解码OAEP填充时出错”(如果我将true传递给USEOEP)或“参数不正确”(如果我将false传递给USEOEP)。为简单起见,这是所使用的全部代码,将异常处理放在一边: public static string EncryptAES(byte[] aesKey, byte[] aesIV,
我有WCF服务;我的应用程序发送生成的RSA公钥,服务返回一组使用公钥加密的AES密钥+IV,但当我的应用程序尝试解密密钥时,我会得到“解码OAEP填充时出错”(如果我将true传递给USEOEP)或“参数不正确”(如果我将false传递给USEOEP)。为简单起见,这是所使用的全部代码,将异常处理放在一边:
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\u Private\u Key
在静态构造函数中使用RSA.ToXmlString(true)
生成)(
publicsakey
通过在静态构造函数中发送rsa.ToXmlString(false)
传递给服务)我尝试使用
加密/解密(byte[],false)
,但没有任何区别。我还尝试了Array.Reverse(encryptedKey)
和Array.Reverse(buffer)
私钥在设置后不会被发送/修改,因此不能对其进行修改
我没有主意了,调试WCF服务非常糟糕。您描述的问题可能是使用不同的私钥对公钥造成的 如果使用RSA提供程序的同一实例生成公钥和公钥+私钥,则密钥将匹配。e、 g
string publicRSAKey = null;
string publicPlusPrivateRSAKey = null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicRSAKey = rsa.ToXmlString(false);
publicPlusPrivateRSAKey = rsa.ToXmlString(true);
}
string publicRSAKey = null;
string publicPlusPrivateRSAKey = null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicRSAKey = rsa.ToXmlString(false);
}
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicPlusPrivateRSAKey = rsa.ToXmlString(true);
}
如果从RSA提供程序的两个不同实例创建密钥,则公钥和公钥+私钥将不匹配。e、 g
string publicRSAKey = null;
string publicPlusPrivateRSAKey = null;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
publicRSAKey = rsa.ToXmlString(false);
publicPlusPrivateRSAKey = rsa.ToXmlString(true);
}
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/module和/RSAKeyValue/index的xml路径,因为这两个路径应该在两者之间匹配。我终于发现了错误所在。我的实现如下,简化了:
感谢@zespri的测试思想。@zespri,我说我正在用RSA加密AES密钥。此外,我没有收到任何关于错误长度的错误。@zespri我正在修改整个代码,寻找过程中可能出现的错误,我找不到任何可能导致这种情况的原因。此外,在实现WCF服务之前,这也可以使用。@zespri我刚刚使用我当前的解决方案进行了测试:加密中Convert.ToBase64String(encryptedkey)返回的内容与解密方法接收的内容完全相同,一个128字节长的字节[]。此外,我有一个HMAC函数在RSA解密之前运行,它保证消息在任何时候都不会改变。我将在明天(这里几乎是午夜)尝试创建一个测试用例。让我们来看一看。我想知道您是否几乎在我的文章的末尾阅读了:“(RSA_Private_密钥是使用RSA.ToXmlString(true)在静态构造函数中生成的”)(publicsakey通过在静态构造函数中发送RSA.ToXmlString(false)来传递给服务)”。我的意思是RSA_Private_Key和RSA_Public_Key在同一个RSACryptServiceProvider实例上创建,一行在另一行之上。私钥确实包含公钥,正如它应该包含的那样。