Каков возможный вариант использования Biginteger's. isProbablePrime ()?


метод BigInteger.isProbablePrime() довольно странно; из документации это скажет, является ли число простым с вероятностью 1 - 1 / 2^arg, где arg - это целочисленный аргумент.

он присутствует в JDK довольно долгое время, поэтому это означает, что он должен иметь использование. Мои ограниченные знания в области компьютерных наук и алгоритмов (и математики) говорят мне, что на самом деле не имеет смысла знать, является ли число "вероятно" простым, но не точно главный.

Итак, каков возможный сценарий, в котором можно было бы использовать этот метод? Криптография?

6 82

6 ответов:

Да, этот метод может быть использован в криптографии. шифрование RSA включает в себя поиск огромных простых чисел, иногда порядка 1024 бит (около 300 цифр). Безопасность RSA зависит от того, что факторинг числа, состоящего из 2 этих простых чисел, умноженных вместе, чрезвычайно сложен и требует много времени. Но чтобы это сработало, они должны быть первичными.

оказывается, что доказать эти простые числа тоже сложно. Но тест на примитивность Миллера-Рабина один из тестов простоту использования isProbablePrime, либо обнаруживает, что число является составным, либо не дает никакого заключения. Запуск этого теста n раз позволяет сделать вывод, что есть 1 в 2n вероятность того, что это число действительно сложное. Он работает 100 раз дает приемлемый риск 1 в 2100 что это число является составным.

Если тест говорит вам, целое число Не премьер -, вы можете, конечно, поверить, что 100%.

Это только другая сторона вопроса, если тест говорит вам, что целое число является "вероятным простым числом", что вы можете сомневаться. Повторение теста с различными " основаниями "позволяет сделать вероятность ложного успеха в" имитации " простого числа (являющегося сильным псевдопервым по отношению к нескольким основаниям) настолько малой, насколько это необходимо.

полезности тест заключается в его скорости и простоте. Не обязательно удовлетворяться статусом "вероятного простого" в качестве окончательного ответа, но определенно можно было бы избежать траты времени почти на все составные числа по используя эту процедуру, прежде чем принести большие пушки тестирования первичности.

сравнение с трудностью факторинга целых чисел является чем-то вроде отвлекающего маневра. Известно, что первичность целого числа может быть определена за полиномиальное время, а действительно, есть доказательство того, что расширение теста Миллера-Рабина на достаточно много оснований является окончательным (при обнаружении простых чисел, в отличие от вероятных простых чисел), но это предполагает обобщенную Гипотезу Римана, поэтому она не совсем так уверена, как (более дорогая)AKS primality test.

стандартный вариант использования для BigInteger.isProbablePrime(int) в криптографии. В частности, некоторые криптографические алгоритмы, такие как RSA, требуют случайно выбранных больших простых чисел. Важно, однако, что эти алгоритмы на самом деле не требуют, чтобы эти числа были гарантированный чтобы быть простым - они просто должны быть простыми с очень большой вероятностью.

как высоко это очень высоко? Ну, в криптографическом приложении обычно называют .isProbablePrime() С аргументом где-то между 128 и 256. Таким образом, вероятность прохождения такого теста не простым числом меньше единицы из 2128 и 2256.

давайте посмотрим на это в перспективе: если у вас было 10 миллиардов компьютеров, каждый из которых генерировал 10 миллиардов вероятных простых чисел в секунду (что означало бы менее одного такта на число на любом современном процессоре), и первичность этих чисел была проверена с .isProbablePrime(128), вы бы в среднем, ожидайте, что одно не простое число проскользнет в раз в 100 миллиардов лет.

то есть, это было бы так, если бы эти 10 миллиардов компьютеров могли каким-то образом работать в течение сотен миллиардов лет, не испытывая любой сбоев оборудования. На практике, однако, гораздо более вероятно, что случайный космический луч ударит ваш компьютер в нужное время и в нужном месте, чтобы перевернуть возвращаемое значение на .isProbablePrime(128) от ложного к истинному, без вызывая любые другие обнаруживаемые эффекты, чем для не простого числа, чтобы фактически пройти вероятностный тест на первичность на этом уровне определенности.

конечно, тот же риск случайных космических лучей и других аппаратных сбоев также относится к детерминированным тестам примитивности, таким как АКС. Таким образом, на практике даже эти тесты имеют (очень малую) базовую ложноположительную частоту из-за случайных сбоев оборудования (не говоря уже обо всех других возможных источниках ошибок, таких как ошибки реализации).

так как это легко подтолкнуть внутреннюю ложноположительную скорость тест на примитивность Миллера–Рабина используется .isProbablePrime() намного ниже этой базовой скорости, просто повторяя тест достаточно много раз, и поскольку, даже повторенный так много раз, тест Миллера–Рабина все еще намного быстрее на практике, чем самые известные детерминированные тесты на примитивность, такие как AKS, он остается стандартным тестом на примитивность для криптографии приложения.

(кроме того, даже если вы случайно выбрали сильную псевдопреступность в качестве одного из факторов вашего модуля RSA, это обычно не приведет к катастрофическому отказу. Как правило, такие псевдопримесы были бы произведениями двух (или редко более) простых чисел примерно половины длины, что означает, что вы получите multi-prime RSA key. Пока ни один из факторов не был слишком маленький (и если они были, тест на примитивность должен был их поймать), алгоритм RSA по-прежнему будет работать просто отлично, и ключ, хотя и несколько слабее против определенных типов атак, чем обычные ключи RSA той же длины, все равно должен быть достаточно безопасным, если вы не напрасно экономили на длине ключа.)

возможный вариант использования заключается в тестировании примитивности данного числа (при тесте, который сам по себе имеет много применений). Элемент isProbablePrime алгоритм будет работать гораздо быстрее, чем точный алгоритм, так что если число не удается isProbablePrime, тогда не нужно идти на счет запуска более дорогого алгоритма.

найти вероятные простые числа-важная проблема в криптографии. Оказывается, что разумная стратегия поиска вероятного K-разрядного простого числа состоит в том, чтобы повторно выбрать случайное K-разрядное число и проверить его на вероятную примитивность с помощью метода isProbablePrime().

для дальнейшего обсуждения, см. раздел 4.4.1 руководства по прикладной криптографии.

см. Также о генерации вероятных простых чисел путем инкрементного поиска by Брандт и Дамгард.

алгоритмы, такие как генерация ключей RSA, зависят от возможности определить, является ли число простым или нет.

однако, в то время, что isProbablePrime метод был добавлен в JDK (февраль 1997 года), не было доказано, как детерминированно решить, является ли число простым в разумное время. Наиболее известный подход в то время был алгоритм Миллера-Рабина - вероятностный алгоритм, который иногда давал бы ложные срабатывания (т. е. сообщал бы не простые числа как простые числа), но могут быть настроены для уменьшения вероятности ложных срабатываний за счет скромного увеличения времени выполнения.

алгоритм АКС это было обнаружено в августе 2002 года. Однако следует отметить, что эти алгоритмы все еще не так быстры, как Миллер-Рабин.

возможно, лучший вопрос, почему нет isPrime метод был добавлен в JDK с 2002 года.