2048ビットのRSA鍵ペアを生成するには、1024ビット長の2つの大きな素数を生成する必要があります。私の知る限り、OpenSSLはランダムな1024ビット番号を選択し、その周りの素数を探し始めます。 OpenSSLは、数値が素数かそうでないかをどのように確認できますか?
素数性のテストは、整数因数分解を実行するよりもはるかに簡単です。
決定論的 エラトステネスのふるい や確率論的 ミラー・ラビン素数テスト など、素数性をテストする方法はいくつかあります。 OpenSSLは いくつかのテスト を使用して素数性をチェックします。最初に彼らは数を決定論的チェックにかけ、候補をいくつかの小さな素数で除算しようとし、それから一連のMiller–Rabin素数性テストを試みます。候補となる素数の大部分は、最初の素数テストで破棄されます。合格した候補者は、さらにテストの対象となり、それぞれが素数であることの確実性を高めます。
Miller–Rabinテストを使用する場合、合成数は各ラウンドで75%の確率で検出されるため、わずか64ラウンドのテストの後、合成数が検出されない確率は驚異的です2-128。つまり、テストには4-n nはテストラウンドの数です。 Agrawal–Kayal–Saxena primality test のように、数値が 完全な確実性 で素数であるかどうかをテストするはるかに遅い方法もいくつかありますが、暗号化の目的で、 本当に、本当に確かで十分なので、使用されない傾向があります。
デフォルトでは、OpenSSLは余分な偏執狂的な傾向があり、特に 安全な素数 に対して他のいくつかのテストを実行します。したがって、素数pが見つかると、(p-1)/ 2が素数かどうかもチェックします。これは、安全な素数が特定の攻撃を防ぐDiffie–Hellmanなどの素数の特定のアプリケーションにとって重要です。
整数がエラーのマージンが非常に低い素数であることを検証することは、それを因数分解するよりもはるかに簡単であり、素数がthat珍しくないため、これは高速で可能です(見つけるのは簡単です)数を増やして素数性をテストすることによる多数の素数)。 Miller–Rabin素数性検定は非常に効率的です。 xn-1 ≢1(mod n)( Fermat test )、およびx(n-1)/ 2e (mod n)は nontrivial の平方根1 mod nここでnはテストされる整数であり、-xはランダムです witness 間隔を満たす1 <x <n。
ウィキペディアから取得したテストの疑似コード実装は次のとおりです。
入力:n> 3、素数性をテストする奇数の整数; k、テストの精度を決定するパラメーター 出力:nがコンポジットの場合はコンポジット、それ以外の場合はコンポジットおそらくプライム
n-1を2として書き込みr・n-1から2のべき乗を因数分解してdが奇数になるd WitnessLoop:k回繰り返す: [2、n − 2] xの範囲でランダムな整数aを選択する←ad mod n if x = 1またはx = n − 1 then 続行WitnessLoop 繰り返しr-1回: x←x2 mod n if x = 1 then return composite if x = n − 1 then continue WitnessLoop return composite おそらくプライムを返す
RSAキーの生成について this Crypto.SE answer および FIPS 186-4 標準、セクション5.1を参照してください。