Генерация пары ключей Bouncy Castle RSA с использованием облегченного API - PullRequest
19 голосов
/ 21 июня 2010

Удивительно, но в Интернете очень мало информации об использовании облегченного API Bouncy Castle. Посмотрев некоторое время, я смог составить простой пример:

RSAKeyPairGenerator generator = new RSAKeyPairGenerator();
generator.init(new RSAKeyGenerationParameters
    (
        new BigInteger("10001", 16),//publicExponent
        SecureRandom.getInstance("SHA1PRNG"),//prng
        1024,//strength
        80//certainty
    ));

AsymmetricCipherKeyPair keyPair = generator.generateKeyPair();

У меня есть базовое понимание RSA и математики, которая происходит за кулисами, поэтому я понимаю, что такое publicExponent и strength. Я предполагаю, что publicExponent относится к простому числу phi(pq), и, насколько я понимаю, оно может быть небольшим (например, 3), если используется соответствующее заполнение. Тем не менее, я понятия не имею, что означает certainty (в некоторых местах упоминалось, что это может относиться к процентам, но я хочу быть уверенным). Использование SecureRandom говорит само за себя. Документация RSAKeyGenerationParameters совершенно бесполезна (не удивительно). Мое единственное предположение, что это как-то связано с точностью сгенерированных ключей, но я снова хочу быть уверен. Так что мой вопрос в том, каковы соответствующие значения для certainty и publicExponent?

P.S. Пожалуйста, не отвечайте «это зависит от контекста - насколько вы хотите, чтобы информация была». Довольно безопасно предполагать наивысшую степень безопасности (т.е. 4096-битный ключ RSA или выше), если не указано иное ... Я также был бы признателен за ссылки на источники, которые дают хороший пример использования легковесного API Bouncy Castle (я не в все заинтересованы в реализации JCA или любых примерах, относящихся к нему).

Ответы [ 4 ]

10 голосов
/ 21 июня 2010

Вы используете правильные значения для обоих.

PublicExponent должен быть Число Ферма .0x10001 (F4) является текущим рекомендуемым значением.3 (F1), как известно, также безопасен.

Для генерации ключа RSA требуются простые числа.Однако невозможно сгенерировать абсолютные простые числа.Как и любые другие криптографические библиотеки, BC использует вероятные простые числа.Определенность показывает, насколько точно вы хотите, чтобы число было простым.Все, что выше 80, значительно замедлит генерацию ключей.

Обратите внимание, что алгоритм RSA все еще работает в маловероятном случае, когда простое число не является истинным простым, потому что BC проверяет относительную простоту.

8 голосов
/ 21 июня 2010

Я должен был бы вникнуть в их исходный код, чтобы быть "определенным", но я считаю, что параметр certainty передается прямо конструктору BigInteger, который говорит: "Вероятностьто, что новый BigInteger представляет простое число, будет превышать (1 - 1/2 достоверность ). Время выполнения этого конструктора пропорционально значению этого параметра. "

Итакпри значении 80 вероятность того, что число не будет простым, будет меньше 1 в 2 80 .Комментарий предполагает, что время генерации простого числа является линейным по отношению к этому параметру, но вы должны проверить это, чтобы быть уверенным, если вы решите увеличить его.Возможно, имеет смысл использовать значение, соответствующее размеру ключа, который вы используете.Например, NIST говорит, что 1024-битный ключ RSA так же силен, как 80-битный симметричный ключ.Для 2048-битного ключа RSA вы можете использовать точность в 112 бит (эквивалентный размер симметричного ключа силы) и т. Д.

Похоже, вы знаете об уязвимости использования 3 в качествепубличный показатель в особых случаях.Значение 65537 теперь используется почти повсеместно.

3 голосов
/ 22 июня 2010

Хороший справочник: FIPS PUB 186-3 . В частности, в разделе 3 приложения B содержится много параметров безопасности, а также алгоритмы простого генерирования. certainty - это число итераций теста примитивности Миллера-Рабина.

2 голосов
/ 01 июля 2012

См. Этот ответ на сайте crypto.stackexchange.com для получения дополнительной информации о том, как следует рассчитывать значение достоверности.

Предварительный просмотр ответа Пажло Эбермана:

Уверенность х бит означает, что вероятность того, что что-то (в этом случай p, являющийся простым), не являющийся истинным, меньше чем 2-x. Это вероятность угадывания случайного значения x-бита на первая попытка, отсюда и название.

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

Итак, таблица соответствия симметричных и асимметричных размеров ключей. должно помочь http://www.keylength.com/ Выберите ту же основную достоверность, что и для Размер симметричного ключа, сопровождающий использование вами открытого ключа.

...