Bouncy Castle RSA keypair поколения, используя легкий API
Удивительно, но в Интернете очень мало информации об использовании облегченного 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 или больше), если не указано иное... Я также хотел бы получить ссылки на источники, которые дают хороший пример использования Bouncy Castle Lightweight API (я не нахожусь в все заинтересованные в реализации JCA или любые примеры, относящиеся к нему).
Ответы
Ответ 1
Вы используете правильные значения для обоих.
PublicExponent должен быть Fermat Number. 0x10001 (F4) - текущее рекомендуемое значение. 3 (F1), как известно, также безопасен.
Для генерации ключей RSA требуются простые числа. Однако невозможно генерировать абсолютные простые числа. Как и любые другие крипто-библиотеки, BC использует вероятные простые числа. Определенность указывает, насколько определенно вы хотите, чтобы число было простым. Все, что выше 80, значительно замедлит процесс генерации ключей.
Обратите внимание, что алгоритм RSA по-прежнему работает в маловероятном случае, когда простое число не является истинным простым, поскольку BC проверяет относительную грубость.
Ответ 2
Мне пришлось бы вникать в их исходный код, чтобы быть "определенным", но я считаю, что параметр certainty
передается прямо в BigInteger
, в котором говорится: "Вероятность того, что новый BigInteger
представляет простое число, будет превышать (1 - 1/2 определенность). Время выполнения этого конструктора пропорционально значение этого параметра.
Таким образом, при значении 80 в 2 80 меньше 1 шанс, что число не будет простым. В комментарии говорится, что время генерации простого числа является линейным относительно этого параметра, но вы должны проверить это, чтобы убедиться, что вы решите его увеличить. Возможно, имеет смысл использовать значение, соответствующее размеру ключа, который вы используете. Например, NIST говорит, что 1024-битный RSA-ключ так же силен, как 80-битный симметричный ключ. Для 2048-битного ключа RSA вы можете использовать определенность 112 бит (эквивалентный размер симметричного ключа) и т.д.
Похоже, вы знаете об уязвимости использования 3 в качестве публичного экспонента в особых случаях. Значение 65537 используется почти повсеместно.
Ответ 3
Хорошая ссылка FIPS PUB 186-3. В частности, в разделе 3 приложения В имеется множество параметров безопасности, а также алгоритмы первичной генерации. certainty
- количество итераций теста примитивности Миллера-Рабина.
Ответ 4
См. этот ответ на crypto.stackexchange.com для получения дополнительной информации о том, как рассчитывать ценность вашего значения.
Предварительный ответ Пайло Эбермана:
Уверенность в х бит означает, что вероятность того, что что-то (в этом случай p, являющийся простым), не являющийся истинным, меньше 2-x. Это такая же вероятность, как правильное угадывание случайного x-битного значения на сначала попробуйте, отсюда и название.
Как выбрать x? Мы хотим, чтобы вероятность p (и q) не была простой быть достаточно малым, чтобы вероятность отказа в этой точке не была больше, чем другие способы, которые могут быть нарушены системой - например, симметричный ключ, факторинг модуля и т.д.
Итак, вот таблица соответствия симметричных и асимметричных размеров ключа должен помочь. http://www.keylength.com/ Выберите ту же самую уверенность, что и вы симметричный размер ключа, сопровождающий использование вашего открытого ключа.