P和Q的值与.Net RSAParameters的模数值不匹配.根据RSA算法和MSDN文档,它应该是:P*Q =模数
我生成了一个512位RSA密钥对,并通过调用将其导出为XML:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);
rsa.ToXmlString(true);
Run Code Online (Sandbox Code Playgroud)
这给了我以下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>
Run Code Online (Sandbox Code Playgroud)
现在我成功地编写了一个litte测试程序来加密,解密,签名和验证数据.
最后我添加了一些测试代码:
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());
Run Code Online (Sandbox Code Playgroud)
这给了我们以下输出:
n = 5200154866521200075264779234483365112866265806746380532891861717388028374942014660490111623133775661411009378522295439774347383363048751390839618325234349
myN = 23508802329434377088477386089844302414021121047189424894399694701810500376591071843028984420422297770783276119852460021668188142735325512873796040092944
Run Code Online (Sandbox Code Playgroud)
为什么乘以P和Q不等于模数?
我已经检查了很多东西,比如endian,encoding,BigInteger类,成功加密,解密,签名,用上面的XML密钥验证但是找不到任何解释为什么P和Q乘以不等于模数...
任何人都可以帮我解释为什么P*Q不是模数? …