如何提取RSACryptoServiceProvider生成的素数?
How to extract the prime numbers generated by RSACryptoServiceProvider?
下面的代码试图获取由RSACryptoServiceProvider
生成的两个RSA素数。我正在测试 primeq
的素数,结果总是非素数。我在这里做错了什么?
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(384);
var p = rsa.ExportParameters(true);
var primeq = new BigInteger(p.Q);
我自己也在为这个问题苦苦挣扎。我发现实际上有两个问题:
- 首先,
BigInteger
使用与 RSACryptoServiceProvider
不同的字节顺序
BigInteger
已签名并使用二进制补码表示法,而 RSA 密钥是无符号整数。
为了解决这个问题,我将按如下方式修改您的代码:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(384);
var p = rsa.ExportParameters(true);
var primeq = new BigInteger(p.Q.Reverse().Concat(new Byte[1]).ToArray());
这是使用以下代码测试的:
using (var rsa = new RSACryptoServiceProvider()) {
var a = rsa.ExportParameters(true);
BigInteger p = new BigInteger(a.P.Reverse().Concat(new byte[1]).ToArray());
BigInteger q = new BigInteger(a.Q.Reverse().Concat(new byte[1]).ToArray());
BigInteger n = new BigInteger(a.Modulus.Reverse().Concat(new byte[1]).ToArray());
Console.WriteLine(p * q == n);
}
下面的代码试图获取由RSACryptoServiceProvider
生成的两个RSA素数。我正在测试 primeq
的素数,结果总是非素数。我在这里做错了什么?
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(384);
var p = rsa.ExportParameters(true);
var primeq = new BigInteger(p.Q);
我自己也在为这个问题苦苦挣扎。我发现实际上有两个问题:
- 首先,
BigInteger
使用与RSACryptoServiceProvider
不同的字节顺序
BigInteger
已签名并使用二进制补码表示法,而 RSA 密钥是无符号整数。
为了解决这个问题,我将按如下方式修改您的代码:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(384);
var p = rsa.ExportParameters(true);
var primeq = new BigInteger(p.Q.Reverse().Concat(new Byte[1]).ToArray());
这是使用以下代码测试的:
using (var rsa = new RSACryptoServiceProvider()) {
var a = rsa.ExportParameters(true);
BigInteger p = new BigInteger(a.P.Reverse().Concat(new byte[1]).ToArray());
BigInteger q = new BigInteger(a.Q.Reverse().Concat(new byte[1]).ToArray());
BigInteger n = new BigInteger(a.Modulus.Reverse().Concat(new byte[1]).ToArray());
Console.WriteLine(p * q == n);
}