の標準的な使用例BigInteger.isProbablePrime(int)
は暗号化です。具体的には、RSAなどの特定の暗号化アルゴリズムでは、ランダムに選択された大きな素数が必要です。ただし、重要なことに、これらのアルゴリズムでは、これらの数値が素数であることが保証されている必要はありません。非常に高い確率で素数である必要があります。
非常に高いのはどれくらいですか?さて、暗号アプリケーションで、一つは典型的に呼び出すだろう.isProbablePrime()
したがって128と256との間の引数のどこかで、このような試験に合格非素数の確率は2未満である128又は2 256。
それを考えてみましょう。100億台のコンピューターがあり、それぞれが1秒あたり100億の確率的素数を生成し(これは、最新のCPUでは1つの数あたり1クロックサイクル未満を意味します)、それらの数の素数性がテストされた.isProbablePrime(128)
場合、平均すると、1つの非素数が1,000億年に1回入ると予想されます。
それは、これらの100億台のコンピュータが経験のない数十億年の何百ものためのすべての実行何とかできれば、ケースになること、である任意のハードウェア障害を。ただし、実際には、ランダムな宇宙線が適切なタイミングでコンピュータ.isProbablePrime(128)
に当たって、他の検出可能な影響を引き起こすことなく、戻り値をfalseからtrueに反転する可能性がはるかに高くなります。 -その確実性レベルで確率的素数性テストに実際に合格する素数。
もちろん、ランダムな宇宙線やその他のハードウェア障害の同じリスクは、AKSのような決定論的素数性テストにも当てはまります。したがって、実際には、これらのテストでさえ、ランダムなハードウェア障害のために(非常に小さい)ベースラインの偽陽性率があります(実装のバグなど、他のすべての考えられるエラーの原因は言うまでもありません)。
それは固有の偽陽性率プッシュするのは簡単ですので、ミラー-ラビン素数判定法で使用される.isProbablePrime()
だけで十分に何度もテストを繰り返して、このベースライン・レートを下回るまでのところを、さらには繰り返し何度、以来、ミラー・ラビンテストはまだです実際には、AKSのような最もよく知られている決定論的素数性テストよりもはるかに高速であり、暗号化アプリケーションの標準的な素数性テストのままです。
(さらに、RSAモジュラスの要因の1つとして強い擬素数を誤って選択した場合でも、通常、壊滅的な障害につながることはありません。通常、このような擬素数は、約2つ(またはまれにそれ以上)の素数の積になります。半分の長さ。つまり、マルチプライムRSAキーになります。いずれの要素も小さすぎない限り(もしそうであれば、プライマリティテストで検出されたはずです)、RSAアルゴリズムはそれでも問題なく動作し、同じ長さの通常のRSAキーよりも特定の種類の攻撃に対してはやや弱いものの、キーの長さを不必要にスキップしなければ、キーは十分に安全であるはずです。)