参数不正确。 rsa解密错误

the parameter is incorrect. rsa decryption error

我有一个服务器客户端系统,它使用 rsa 加密来发送 rijindal 密钥。

这叫做密钥封装。

现在我已经发送了 RSA public 密钥,我用常规字符串测试了代码并且那些工作正常

现在我正在加密后传输密钥(加密的是使用字符串所以可以吗?)。

我的 rajindal 密钥(我加密的)

61,87,46,105,139,250,42,153,173,72,205,42,26,36,227,156,50,160,38,95,180,237,17,183,232,37,215,136,179,75,227,204

结果

1,10,38,205,13,99,127,55,139,71,212,100,221,181,175,93,84,228,31,116,190,254,220,41,64,253,135,146,128,115,174,234,52,84,220,98,34,253,167,77,24,166,104,119,133,173,199,155,236,32,107,10,7,153,253,242,197,80,136,117,177,217,153,97,65,132,29,23,42,157,206,91,183,133,34,204,143,83,13,244,120,115,59,50,196,176,8,146,90,189,195,249,171,120,96,54,85,6,234,129,166,94,255,202,76,249,153,107,146,64,221,45,50,50,237,113,138,152,85,39,113,90,215,197,235,121,23,191

发送到服务器的内容

"###KEY191,23,121,235,197,215,90,113,39,85,152,138,113,237,50,50,45,221,64,146,107,153,249,76,202,255,94,166,129,234,6,85,54,96,120,171,249,195,189,90,146,8,176,196,50,59,115,120,244,13,83,143,204,34,133,183,91,206,157,42,23,29,132,65,97,153,217,177,117,136,80,197,242,253,153,7,10,107,32,236,155,199,173,133,119,104,166,24,77,167,253,34,98,220,84,52,234,174,115,128,146,135,253,64,41,220,254,190,116,31,228,84,93,175,181,221,100,212,71,139,55,127,99,13,205,38,10,1"

此时服务器将收到消息并执行以下代码

if (messageReceived.StartsWith("###KEY"))
                {
                    Console.WriteLine(messageReceived);
                    string tempkey = messageReceived.Remove(0, 6);
                    this.key = rsa.DecryptBytes(tempkey);
                    
                    myRijndael.Key = key;
                    Console.WriteLine(tempkey);
                    SendMessage("keyOK");
                }

临时密钥将是

191,23,121,235,197,215,90,113,39,85,152,138,113,237,50,50,45,221,64,146,107,153,249,76,202,255,94,166,129,234,6,85,54,96,120,171,249,195,189,90,146,8,176,196,50,59,115,120,244,13,83,143,204,34,133,183,91,206,157,42,23,29,132,65,97,153,217,177,117,136,80,197,242,253,153,7,10,107,32,236,155,199,173,133,119,104,166,24,77,167,253,34,98,220,84,52,234,174,115,128,146,135,253,64,41,220,254,190,116,31,228,84,93,175,181,221,100,212,71,139,55,127,99,13,205,38,10,1

哪个好

进入 decryptBytes,它接收一个名为 data 的字符串和 returns byte[]

try
        {
            var dataArray = data.Split(',');
            byte[] dataByte = new byte[dataArray.Length];
            for (int i = 0; i < dataArray.Length; i++)
            {
                dataByte[i] = Convert.ToByte(dataArray[i]);
            }

            _rsa.FromXmlString(_privateKey);
            var decryptedByte = _rsa.Decrypt(dataByte, false);
            return decryptedByte;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

        return new byte[7];

RSA class 看起来像这样

public RSA()
    {
        _encoder = new UnicodeEncoding();
        _rsa = new RSACryptoServiceProvider();

        _privateKey = _rsa.ToXmlString(true);
        _publicKey = _rsa.ToXmlString(false);
    }

我在转换部分没有问题,dataByte 将是它所需要的,也就是发送的密钥。

我的问题在下一行

var decryptedByte = _rsa.Decrypt(dataByte, false);

这让我返回异常 {"The parameter is incorrect."}

现在我在网上搜索了一下,找到了一些解释。

1- 按键已更改 2- 我需要将 false 更改为 true(无效)。

如果需要更多代码请告诉我

出于某种原因,您似乎已经反转了密文。 RSA 密文始终以相同的顺序编码,由 PKCS#1 标准(现在称为 RFC)指定。它指定静态大小、无符号 big endian 用于 RSA 结果的密文编码(这是由模幂创建的数字)。

发送到服务器的内容应该以 1 开头,而不是 191,除了 header.[= 之外,第二个和第三个字符串必须相同12=]

请注意,密钥未根据 PKCS#1 规范进行编码,因为 Microsoft 在这种方式上很特殊。如果您正在使用其他系统,您可能需要反转模数或指数。


请注意,您经常可以直接发送字节,许多传输协议允许二进制通信。如果您使用的是文本,您至少可以编码为 base 64,这相对有效,每 3 个字节使用 4 个字符。