Как извлечь простые числа, сгенерированные RSACryptoServiceProvider?
Приведенный ниже код пытается получить два простых числа RSA, сгенерированных RSACryptoServiceProvider
, Я тестирую primeq
для первичности, и это всегда оказывается не простым. Что я здесь не так делаю?
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(384);
var p = rsa.ExportParameters(true);
var primeq = new BigInteger(p.Q);
1 ответ
Решение
Я боролся с этой проблемой сам. Я обнаружил, что есть две проблемы.
- Первый,
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);
}