C# - RSACryptoServiceProvider - Error: Bad Data

C# - RSACryptoServiceProvider - Error: Bad Data

我正在尝试 运行 使用 C# 进行 RSA 解密。

我的代码:

byte[] n = BigInteger.Parse("3104649130901425335933838103517383").ToByteArray();
byte[] p = BigInteger.Parse("49662237675630289").ToByteArray();
byte[] q = BigInteger.Parse("62515288803124247").ToByteArray();
byte[] e = BigInteger.Parse("65537").ToByteArray();
byte[] d = BigInteger.Parse("1427000713644866747260499795119265").ToByteArray();
byte[] dp = BigInteger.Parse("15085765714732865").ToByteArray();
byte[] dq = BigInteger.Parse("1326865232237451").ToByteArray();
byte[] iq = BigInteger.Parse("5777070651124236").ToByteArray();

RSAParameters rsaparams = new RSAParameters();
rsaparams.P = p;
rsaparams.Q = q;
rsaparams.Modulus = n;
rsaparams.Exponent = e;
rsaparams.D = d;
rsaparams.DP = dp;
rsaparams.DQ = dq;
rsaparams.InverseQ = iq;

RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.ImportParameters(rsaparams);

当我 运行 它时,我得到这个错误:

谁能告诉我我做错了什么?

显然 RSAParameters 期望它的组件 byte[] 数组是大端格式。因此,您必须反转从 BigInteger.ToByteArray() 获得的每个字节数组中的字节。一个就地反向方法的例子是:

    public static void reverse (ref byte[] x)
    {
        int i = 0;
        int j = x.Length - 1;
        while (i < j)
        {
            byte t = x [i];
            x [i] = x [j];
            x [j] = t;
            i++;
            j--;
        }
    }