Мне нужно сгенерировать большие простые числа для криптографического проекта. Я заметил, что в .NET 4.0 есть встроенный криптографический примитив (например, RSA), который использует случайно сгенерированные большие простые числа (p, q для RSA). Все ли они используют общую встроенную библиотеку, которая является общедоступной и к которой можно получить доступ из-за пределов их областей класса, или мне нужно использовать внешнюю библиотеку (я знаю, что есть простые алгоритмы для проверки простоты, я просто не хочу реализовать больше, чем я должен.).
Есть ли способ генерировать большие простые числа в С# без использования внешней библиотеки?
Ответы (2)
В .NET v4 (и более поздних версиях) Microsoft предоставляет новую сборку, System.Numerics.dll
a>, который включает тип BigInteger
. Однако он не предоставляет никакого метода проверки простых чисел.
Mono (начиная с версии 1.0) также предоставляет тип [BigInteger][3]
, расположенный в его сборке Mono.Security.dll
. Вы можете использовать его как есть или перенести методы первичной проверки (существует несколько методов) на новый тип Microsoft BigInteger
.
Все ли они используют общую встроенную библиотеку, которая является общедоступной и к которой можно получить доступ из-за пределов своих классов?
Да, и RSACryptoServiceProvider
, и DSACryptoServiceProvider
для этого вызывают CryptoAPI. Однако CAPI не предоставляет свой собственный код BigInteger (даже собственному коду), поэтому он вам не поможет.
Сгенерируйте большое число в требуемом диапазоне. Проверьте его, чтобы увидеть, является ли он простым. Отклонить и повторить, если это не так.
Для тестирования просто используйте пробное деление с простыми числами, скажем, до 1500, а затем переключитесь на Миллера-Рабина. При правильном применении метода Миллера-Рабина шансы аппаратного сбоя выше, чем ошибочная пометка композита как основного.