Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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# 为什么模量不等于P和Q的乘积?_C#_.net_Cryptography_Rsa - Fatal编程技术网

C# 为什么模量不等于P和Q的乘积?

C# 为什么模量不等于P和Q的乘积?,c#,.net,cryptography,rsa,C#,.net,Cryptography,Rsa,p和Q的值与.Net参数的模数值不匹配。 根据RSA算法和MSDN文档,它应该是:P*Q=模 我生成了一个512位RSA密钥对,并通过调用以下命令将其导出为XML: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512); rsa.ToXmlString(true); 这为我提供了以下XML: <RSAKeyValue> <Modulus>rcLI1XTfmXtX05zq67d1wujnUve

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

我生成了一个512位RSA密钥对,并通过调用以下命令将其导出为XML:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);
rsa.ToXmlString(true);
这为我提供了以下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>
我们得到了以下输出:

n   = 5200154866521200075264779234483365112866265806746380532891861717388028374942014660490111623133775661411009378522295439774347383363048751390839618325234349

myN = 23508802329434377088477386089844302414021121047189424894399694701810500376591071843028984420422297770783276119852460021668188142735325512873796040092944
为什么p和Q的乘积不等于模数

我已经检查了很多东西,如endian、编码、BigInteger类、成功加密、解密、签名、使用上述XML密钥验证,但找不到任何解释为什么p和Q乘以后不等于模

有人能帮我解释为什么p*Q不是模数吗

可读格式的所有值:

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

根据答案,我为.Net BigInteger类编写了一个小的扩展方法,以正确使用RSA参数:

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);

希望这能帮助其他人解决同样的问题:-)

以下是我对您提供的XML参数的解析:

N = 9100595563660672087698322262735024483609782000266155222822537546670463733453350686171384417480667378838400923087358115007100900745853538273602044437940579

P = 96731388413554317303099785843734797692955743043844132225634400270674214374921

Q = 94081101418218318334927154927633016498744568046568114230258529096538660255499
正如你所证实的,N确实等于p*Q


您不能像现在这样使用BigInteger(byte[])构造函数,因为它希望字节数组使用little endian格式,并且因为Microsoft已经做了很多事情。相反,请颠倒字节的顺序。最后,由于字节数组应该是两个补码,并且您的数字保证为正数,因此如果高阶字节大于或等于128,则必须向数组的高阶字节添加一个零字节。

biginger
将数组解析为带符号的小端值<代码>参数使用无符号的大端号


所以
i=new BigInteger(bytes.Reverse().Concat(new byte[]{0}).ToArray())
应该可以工作。

也许前面的stackoverflow文章可以帮助你了解你做错了什么,不幸的是没有。我已经花了一整天的时间阅读.NETRSA线程。我的问题不是什么都不起作用,而是我不明白为什么p和q的乘积与模不匹配,我得到的数字和你的不同。例如,我从上面的文件得到的模数是
910059556366067208769832226273502483609782000266155222822537544667046373345335068617138441748066737883840092308735811500710090074585382736020444940579
你是怎么做到的?你能给我你的代码行吗?混淆头部接缝处的最后一个数字,确定您得到了正确的数字。现在我很想知道你是怎么做的?您是如何将XML值解析为数字的?Microsoft希望字节数组返回到BigInteger()。讨论都太愚蠢了。非常感谢格雷格。似乎我的endian检查得到了一个来回转换的双重错误现在我明白了为什么每个人都写“不要使用BigInteger它的垃圾”:)大多数时候,你实际上用一个BigInteger做操作。出口很少。这就是为什么x86处理器和BigInteger是little-endian。这是错误的。您需要交换子流
i=new biginger(bytes.Reverse()).ToArray().Concat(new byte[]{0}))
N = 9100595563660672087698322262735024483609782000266155222822537546670463733453350686171384417480667378838400923087358115007100900745853538273602044437940579

P = 96731388413554317303099785843734797692955743043844132225634400270674214374921

Q = 94081101418218318334927154927633016498744568046568114230258529096538660255499