Как извлечь простые числа, сгенерированные RSACryptoServiceProvider?

Приведенный ниже код пытается получить два простых числа RSA, сгенерированных RSACryptoServiceProvider, Я тестирую primeq для первичности, и это всегда оказывается не простым. Что я здесь не так делаю?

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(384);
var p = rsa.ExportParameters(true);
var primeq = new BigInteger(p.Q);

1 ответ

Решение

Я боролся с этой проблемой сам. Я обнаружил, что есть две проблемы.

  1. Первый, BigInteger использует другую последовательность от RSACryptoServiceProvider
  2. 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);
}
Другие вопросы по тегам