Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# RSA加密中模和p*q的非匹配值_C#_Encryption_Encoding_Biginteger_Multiplication - Fatal编程技术网

C# RSA加密中模和p*q的非匹配值

C# RSA加密中模和p*q的非匹配值,c#,encryption,encoding,biginteger,multiplication,C#,Encryption,Encoding,Biginteger,Multiplication,我目前正在做一个涉及RSA加密的加密项目。我使用RSACryptServiceProvider类生成值p、q和n(模数)。由于n=pq,我决定测试这两个值(即pq和n)是否匹配。当我使用BigInteger类将p和q相乘时,我得到的答案与RSACryptServiceProvider类生成的n不同。代码如下所示: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); //export rsa paramet

我目前正在做一个涉及RSA加密的加密项目。我使用RSACryptServiceProvider类生成值p、q和n(模数)。由于n=pq,我决定测试这两个值(即pq和n)是否匹配。当我使用BigInteger类将p和q相乘时,我得到的答案与RSACryptServiceProvider类生成的n不同。代码如下所示:

 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        //export rsa parameters i.e. p , q , e and d
        RSAParameters rsaparams = rsa.ExportParameters(true);
        //set the p parameter
        byte[] p = rsaparams.P;
        Array.Reverse(p);
        BigInteger primeP = new BigInteger(p);

        //set the Q parameter
        byte[] q = rsaparams.Q;
        Array.Reverse(q);
        BigInteger primeQ = new BigInteger(q);

        //set the d parameter
        byte[] d = rsaparams.D;
        Array.Reverse(d);
        BigInteger privexponent = new BigInteger(d);

        //set the e parameter
        byte[] e = rsaparams.Exponent;
        Array.Reverse(e);
        BigInteger pubexponent = new BigInteger(e);

        //set the m parameter
        byte[] m = rsaparams.Modulus;
        Array.Reverse(m);
        BigInteger modulus = new BigInteger(m);


        Console.WriteLine("p:\n{0}\n", primeP);
        Console.WriteLine("q:\n{0}\n", primeQ);
        Console.WriteLine("modulus:\n{0}\n", modulus);
        Console.WriteLine();

        //perform multiplication of p and q manually
        Console.WriteLine(BigInteger.Multiply(primeP, primeQ));

有没有办法解决这个问题?

问题是仅仅反转阵列是不够的。因为它们是无符号的,所以也需要根据数组末尾的值进行填充

如果数组末尾的值>=128,则设置该值的高位,
byte[]
biginger
构造函数将其解释为负号。在这种情况下,固定在0上可以防止出现这种情况

public static BigInteger FromBigEndian(byte[] p)
{
    var q = p.Reverse();
    return new BigInteger((p[0] < 128 ? q : q.Concat(new byte[] { 0 })).ToArray());
}

非常感谢你。很有魅力
byte[] p = rsaparams.P;
BigInteger primeP = FromBigEndian(p);