Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解码OAEP填充时发生RSACryptServiceProvider错误_C#_Wcf_Encryption_Rsa - Fatal编程技术网

C# 解码OAEP填充时发生RSACryptServiceProvider错误

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,

我已经读了很多关于这个问题的文章,但我似乎找不到解决我的bug的答案
我有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路径,因为这两个路径应该在两者之间匹配。

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

  • 应用程序创建公钥+私钥并将公钥发送到服务
  • 该服务使用使用公钥加密的AES生成的密钥进行响应
  • 然后,该服务尝试解密密钥,然后引发事件提醒应用程序
  • 我更改了我的实现,例如:

  • 服务使用加密消息引发事件
  • 应用程序使用私钥解密消息
  • 因为我使用一个VisualStudio实例来调试这两个进程(服务和VisualStudio调试器),所以我没有意识到私钥/公钥是不同的


    感谢@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实例上创建,一行在另一行之上。私钥确实包含公钥,正如它应该包含的那样。