为什么RSAParameters模P和Q不等于产品? [英] Why is RSAParameters Modulus not equal product of P and Q?

查看:192
本文介绍了为什么RSAParameters模P和Q不等于产品?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

P和Q的值不匹配的.Net RSAParameters的模量的值。 根据RSA算法和MSDN文档,它应该是:P * Q =模量

The values of P and Q do not match value of the Modulus of the .Net RSAParameters. According to RSA algorithm and MSDN documentation it should be: P * Q = Modulus

我产生了512位RSA密钥并将其导出为XML通过调用:

I generated a 512bit RSA keypair and exported it to XML by invoking:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);
rsa.ToXmlString(true);

这给了我下面的XML:

This gave me the following XML:

<RSAKeyValue>
  <Modulus>rcLI1XTfmXtX05zq67d1wujnUvevBu8dZ5Q5uBUi2mKndH1FZLYCKrjFaDTB/mXW1l5C74YycVLS6msY2NNJYw==</Modulus>
  <Exponent>AQAB</Exponent>
  <P>1dwGkK5POlcGCjQ96Se5NSPu/hCm8F5EYwyqRpLVzgk=</P>
  <Q>0AAEMHBj7CP2XHfCG/RzGldw1GdsW13rTo3uEE9Dtws=</Q>
  <DP>PO4jMLV4/TYuElowCW235twGC3zTE0jIUzAYk2LiZ4E=</DP>
  <DQ>ELJ/o5fSHanBZCjk9zOHbezpDNQEmc0PT64LF1oVmIM=</DQ>
  <InverseQ>NyCDwTra3LiUin05ZCGkdKLwReFC9L8Zf01ZfYabSfQ=</InverseQ>
  <D>EWwFTPmx7aajULFcEJRNd2R4xSXWY8CX1ynSe7WK0BCH42wf/REOS9l8Oiyjf587BhGa3y8jGKhUD7fXANDxcQ==</D>
</RSAKeyValue>

现在我成功地写了一个豆蔻测试PROGRAMM加密,解密,签名和验证数据。

Now I successfully wrote a litte test programm to encrypt, decrypt, sign and verify data.

最后我添加了一个小测试,code:

At the end I added a little test code:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);
rsa.FromXmlString(key); // key = string with XML above

RSAParameters param = rsa.ExportParameters(true);
BigInteger p = new BigInteger(param.P);
BigInteger q = new BigInteger(param.Q);
BigInteger n = new BigInteger(param.Modulus);
BigInteger myN = BigInteger.Multiply(p, q);
Console.WriteLine("n   = " + n.ToString());
Console.WriteLine("myN = " + myN.ToString());

这给了我们以下的输出:

Which gave we the following output:

n   = 5200154866521200075264779234483365112866265806746380532891861717388028374942014660490111623133775661411009378522295439774347383363048751390839618325234349

myN = 23508802329434377088477386089844302414021121047189424894399694701810500376591071843028984420422297770783276119852460021668188142735325512873796040092944

为什么乘以P和Q不相等的模数?

Why does multiplying P and Q not equal the Modulus?

我已经查了很多东西像端,编码,BigInteger的阶级,成功加密,解密,签名的,经核实上述XML密钥,但找不到任何解释为什么P和Q相乘不等于该模...

I already checked a lot of things like endian, encoding, BigInteger class, successfully encrypted, decrypted, signed, verified with the above XML keys but cannot find any explanation why P and Q multiplied is not equaling the Modulus...

谁能帮我解释一下为什么P * Q是不是模?

Can anybody help me explain why P*Q is not the Modulus ?

在可读格式的所有值:

Modulus  = 5200154866521200075264779234483365112866265806746380532891861717388028374942014660490111623133775661411009378522295439774347383363048751390839618325234349
Exponent = 65537
P  = 4436260148159638728185416185189716006279182659244174640493183003717504785621
Q  = 5299238895894527538601438806093945941831432623367272568173893997325464109264
DP = -57260184070162652127728137041376572684067529466727954512100856352006444159428
DQ = -56270397953566513533764063103154348713259844205844432469862161942601135050224
InverseQ = -5297700950752995201824767053303055736360972826004414985336436365496709603273
D = 5967761894604968266284398550464653556930604493620355473531132912985865955601309375321441883258487907574824598936524238049397825498463180877735939967118353

更新

据我写了一个小扩展方法为.NET的BigInteger类与RSAParameters正常工作了答案:

According to the answer I wrote a little extension method for the .Net BigInteger class to work correctly with the RSAParameters:

public static class BigIntegerExtension
{
    public static BigInteger FromBase64(this BigInteger i, string base64)
    {
        byte[] p = Convert.FromBase64String(base64).Reverse().ToArray();
        if (p[p.Length - 1] > 127)
        {
            Array.Resize(ref p, p.Length + 1);
            p[p.Length - 1] = 0;
        }
       return new BigInteger(p);
    }

    public static BigInteger FromBigEndian(this BigInteger i, byte[] p)
    {
        p = p.Reverse().ToArray();
        if (p[p.Length - 1] > 127)
        {
            Array.Resize(ref p, p.Length + 1);
            p[p.Length - 1] = 0;
        }
        return new BigInteger(p);
    }
}

用例:

BigInteger modulus1 = new BigInteger().FromBase64("rcLI1XTfmXtX05zq67d1wujnUvevBu8dZ5Q5uBUi2mKndH1FZLYCKrjFaDTB/mXW1l5C74YycVLS6msY2NNJYw==");

BigInteger modulus2 = new BigInteger().FromBigEndian(param.Modulus);

希望这有助于其他有同样的问题: - )

Hope this helps others with the same problem :-)

推荐答案

下面是我的,你提供的XML参数解析:

Here is my parsing of the XML parameters you provided:

N = 9100595563660672087698322262735024483609782000266155222822537546670463733453350686171384417480667378838400923087358115007100900745853538273602044437940579

P = 96731388413554317303099785843734797692955743043844132225634400270674214374921

Q = 94081101418218318334927154927633016498744568046568114230258529096538660255499

正如你可以验证,N确实如此等于P * Q值。

As you can verify, N does indeed equal P * Q.

您不能使用的BigInteger(字节[])构造你的方式,因为它需要的字节数组是在小端,因为微软已经做的事情低音ackwards。相反,扭转字节的顺序。最后,因为字节数组被认为是二进制补码,你的号码,保证是积极的,你必须添加一个零字节数组的高位字节的如果的高位字节否则会大于或等于128。

You cannot use the BigInteger(byte []) constructor the way you are because it expects the byte array to be in little-endian, and because Microsoft has done things bass ackwards. Instead, reverse the order of the bytes. And finally, because the bytes arrays are supposed to be twos complement and your numbers are guaranteed to be positive you must add a zero byte to the high order byte of the array if the high-order byte would otherwise be greater than or equal to 128.

这篇关于为什么RSAParameters模P和Q不等于产品?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆