[java] Bouncy Castle RSA keypair поколения, используя легкий API



Answers

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

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

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

Question

Удивительно, но в Интернете очень мало информации об использовании легкого 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 относится к совместному publicExponent phi(pq) и из того, что я собираю, он может быть небольшим (например, 3), если используется соответствующее дополнение. Однако я понятия не имею, что означает certainty (в каком-то месте упоминалось, что это может относиться к проценту, но я хочу быть уверенным). Использование SecureRandom пояснений. Документация RSAKeyGenerationParameters совершенно бесполезна (не удивительно). Я только предполагаю, что это имеет какое-то отношение к точности сгенерированных ключей, но я снова хочу быть уверенным. Итак, мой вопрос - это то, что является подходящими значениями для certainty и publicExponent ?

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




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

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

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

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

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




Links