Стандартный вариант использования BigInteger.isProbablePrime(int)
- в криптографии. В частности, некоторые криптографические алгоритмы, такие как RSA , требуют произвольно выбранных больших простых чисел. Однако важно отметить, что эти алгоритмы на самом деле не требуют, чтобы эти числа гарантированно были простыми - они просто должны быть простыми с очень высокой вероятностью.
Насколько высока очень высокая? Что ж, в криптографическом приложении обычно вызывается .isProbablePrime()
с аргументом где-то между 128 и 256. Таким образом, вероятность того, что непростое число пройдет такой тест, меньше одного из 2 128 или 2 256 .
Давайте посмотрим на это в перспективе: если бы у вас было 10 миллиардов компьютеров, каждый из которых генерировал 10 миллиардов вероятных простых чисел в секунду (что означало бы менее одного тактового цикла на число на любом современном процессоре), и простота этих чисел была проверена с помощью .isProbablePrime(128)
, вы в среднем можно было бы ожидать, что одно непростое число будет проскакивать каждые 100 миллиардов лет .
То есть, это было бы так, если бы все эти 10 миллиардов компьютеров могли каким-то образом работать в течение сотен миллиардов лет без каких-либо сбоев оборудования. На практике, однако, это намного более вероятно , для случайного космических лучей , чтобы ударить ваш компьютер в нужное время и место , чтобы переворачивать возвращаемое значение из .isProbablePrime(128)
от ложного к истине, не вызывая никаких других обнаруживаемых эффектов, чем для не -простое число, чтобы действительно пройти вероятностный тест на простоту на этом уровне достоверности.
Конечно, такой же риск случайных космических лучей и других аппаратных сбоев применим и к детерминированным тестам на простоту, таким как AKS . Таким образом, на практике даже эти тесты имеют (очень маленькую) базовую частоту ложных срабатываний из-за случайных отказов оборудования (не говоря уже обо всех других возможных источниках ошибок, таких как ошибки реализации).
Так как это легко подтолкнуть внутреннюю ложных срабатываний от теста на простоту Миллера-Рабина используется .isProbablePrime()
намного ниже этой базовой скорости, просто повторить тест достаточно много раз, и с тех пор, даже повторенные много раз, тест Миллера-Рабина до сих пор намного быстрее на практике, чем самые известные детерминированные тесты на простоту, такие как AKS, он остается стандартным тестом на простоту для криптографических приложений.
(Кроме того, даже если вы случайно выбрали сильное псевдопростое число в качестве одного из факторов вашего модуля RSA, это, как правило, не приведет к катастрофическому сбою. Обычно такие псевдопростые числа являются продуктом двух (или редко более) простых чисел приблизительно половина длины, что означает, что вы получите ключ RSA с несколькими простыми числами . Пока ни один из факторов не был слишком мал (а если бы они были, то тест на простоту их должен был бы уловить), алгоритм RSA будет по-прежнему работает нормально, и ключ, хотя и несколько более слабый против определенных типов атак, чем обычные ключи RSA той же длины, все же должен быть достаточно безопасным, если вы не экономите напрасно на длине ключа.)