Есть ли способ генерировать большие простые числа в С# без использования внешней библиотеки?

Мне нужно сгенерировать большие простые числа для криптографического проекта. Я заметил, что в .NET 4.0 есть встроенный криптографический примитив (например, RSA), который использует случайно сгенерированные большие простые числа (p, q для RSA). Все ли они используют общую встроенную библиотеку, которая является общедоступной и к которой можно получить доступ из-за пределов их областей класса, или мне нужно использовать внешнюю библиотеку (я знаю, что есть простые алгоритмы для проверки простоты, я просто не хочу реализовать больше, чем я должен.).


person Colin Dumitru    schedule 10.12.2011    source источник
comment
@Corbin - не все простые числа нечетные (но большие были бы)   -  person Damien_The_Unbeliever    schedule 10.12.2011
comment
Я оговорился, я полагаю. Но все же, разве 2 не единственное нечетное простое число?   -  person Corbin    schedule 10.12.2011
comment
Да, 2 — единственное четное простое число.   -  person rossum    schedule 10.12.2011
comment
2 самое нечетное простое число...   -  person DarkSquirrel42    schedule 10.12.2011


Ответы (2)


В .NET v4 (и более поздних версиях) Microsoft предоставляет новую сборку, System.Numerics.dll, который включает тип BigInteger. Однако он не предоставляет никакого метода проверки простых чисел.

Mono (начиная с версии 1.0) также предоставляет тип [BigInteger][3], расположенный в его сборке Mono.Security.dll. Вы можете использовать его как есть или перенести методы первичной проверки (существует несколько методов) на новый тип Microsoft BigInteger.

Все ли они используют общую встроенную библиотеку, которая является общедоступной и к которой можно получить доступ из-за пределов своих классов?

Да, и RSACryptoServiceProvider, и DSACryptoServiceProvider для этого вызывают CryptoAPI. Однако CAPI не предоставляет свой собственный код BigInteger (даже собственному коду), поэтому он вам не поможет.

person poupou    schedule 10.12.2011

Сгенерируйте большое число в требуемом диапазоне. Проверьте его, чтобы увидеть, является ли он простым. Отклонить и повторить, если это не так.

Для тестирования просто используйте пробное деление с простыми числами, скажем, до 1500, а затем переключитесь на Миллера-Рабина. При правильном применении метода Миллера-Рабина шансы аппаратного сбоя выше, чем ошибочная пометка композита как основного.

person rossum    schedule 10.12.2011