Можете ли вы использовать BigInteger.isProbablePrime() для создания криптографически безопасных простых чисел? Какая определенность необходима для того, чтобы они были «в безопасности»?
Использование BigInteger.isProbablePrime() для создания криптографически безопасных простых чисел
Ответы (3)
У меня нет ученой степени в области криптографии, так что отнеситесь к этому с недоверием.
У вас есть две основные области для беспокойства:
Ваши простые числа должны быть непредсказуемо случайными. Это означает, что вам нужно использовать такой источник, как
SecureRandom
для создания простых чисел. Как бы ни были уверены в вашей простоте, если они предсказуемы, вся криптосистема не достигает своей цели. Если вы используете конструкторBigInteger(int bitLength, int certainty, Random rnd)
, вы можете передать свойSecureRandom
, поскольку он является подклассомRandom
.Ваши потенциальные простые числа должны быть достаточно уверены в том, что они являются простыми числами (я предполагаю, что вы используете алгоритм, основанный на сложности факторинга). Если вы получили вероятное простое число, но злоумышленник может с большой долей вероятности разложить его на множители в течение 5 минут, потому что у него был фактор, который никогда не был замечен в проведенном вами тесте на простоту, вам несколько не повезло с вашим алгоритмом. Обычно используется Рабин-Миллер, и в этом ответе указано, что для 32-битных целых чисел достаточно уверенности в 15. Рекомендуется значение до 40 , а все, что выше этого значения, не имеет смысла.
таким образом я создал безопасный BigInteger
для своего криптографического приложения.
Вот мой код:
BigInteger b = new BigInteger(25, new SecureRandom());
Поскольку он также нужен вам для криптографического приложения, на мой взгляд, получение BigInteger
таким образом является правильным. Примечание. Помните, что объекты SecureRandom
требуют больших затрат. Поэтому вам не следует инициализировать их много раз.
Почитав комментарии, дальше получилось. Вот способ, который гарантирует вам большую уверенность в получении простого числа.
BigInteger b =BigInteger.probablePrime(25, new SecureRandom(););
Как говорит @hexafraction, вам нужно использовать SecureRandom()
для генерации случайного числа криптографического качества. Javadoc говорит, что сгенерированное простое число безопасно 2^-100. Если вам нужна более высокая безопасность (скажем, 2^-128 для безопасности, эквивалентной AES), запустите больше итераций тест Миллера-Рабина на нем. Каждая итерация дает вам дополнительную безопасность 2^-2, поэтому четырнадцать итераций дадут вам 2^-128.