如何提取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);

我自己也在为这个问题苦苦挣扎。我发现实际上有两个问题:

  1. 首先,BigInteger 使用与 RSACryptoServiceProvider
  2. 不同的字节顺序
  3. 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);
}