OpenSSLでDiffie Hellmanパラメータを生成するには、次のようにします。
$ openssl dhparam -out dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
[...]
そこで「ジェネレーター2」に注目。マンページ(man dhparam
)に示されているように、ジェネレータ2と5のどちらかを選択できるようです。
-2, -5 The generator to use, either 2 or 5. 2 is the default. If present then the input file is ignored and parameters are generated instead.
Diffie-Hellman は、素数を法とする整数のサブグループpで機能します。つまり、ジェネレータgがあり、これは従来の整数モジュロpです。そのジェネレータには次数rがあり、これはgr = 1 mod p。 DHに従事する2つのシステムは、秘密鍵aとbをそれぞれ指定された範囲の整数として選択し、対応するDH公開鍵(ネットワーク経由で交換)は次のとおりです。 ga mod pおよびgb mod p。
DHは次の条件が満たされている限り安全です。
ジェネレーターの正確な値gは、両方のパーティが同じ値を使用している限り、重要ではありません。誰かがジェネレータgに対して相対的に離散対数を計算できれば、同じサブグループのどのジェネレータg 'に対しても簡単にそれを計算できることを示すことができます。したがって、重要なのはサブグループの順序であり、ジェネレータではありません。 2または5を使用できますが、セキュリティは変更されません。
短いジェネレーターを使用すると、パフォーマンスにいくつかの(わずかな)利点があります。ただし、2と5のパフォーマンスの違いはごくわずかです。一部のプロトコルでは、ジェネレーターはプロトコルレベルで合意されています。つまり、ネットワーク経由で送信されません。両方のシステムでハードコーディングされています。したがって、一部のプロトコルは2の使用を義務付け、他のプロトコルは歴史的および伝統的な理由から5の使用を望んでいます。 OpenSSLは、汎用ライブラリとして、どちらの場合もパラメータを生成できます。
ただし、詳細があります。選択したジェネレーターが十分に大きな素数の次数を持っていることを確認するのは難しい場合があります。デフォルトでは、openssl dhparam
は、いわゆる「安全な素数」を生成します。つまり、ランダムな素数qを生成しますp = 2q + 1も素数の整数を見つけるまで。 g modulo qの順序は常にp-1の約数です。したがって、安全な素数を使用することで、OpenSSLは2..p-2範囲内の任意のジェネレータgの順序rが保証されます(特に2および5)はqまたは2qのいずれかに等しくなるため、常に-の倍数になりますq、これは十分に大きな素数です。
OpenSSLが「セーフプライム」であることを確認せずにランダムなpを生成した場合、-g = 2または5の実際の順序は正確に計算するのは困難です(これには因数分解p-1が含まれますが、コストがかかります)。
一部の非DHコンテキスト、つまりDSA署名アルゴリズムでは、ジェネレーターの順序がexactlyが特定の非大きすぎる素数に等しい---であるようなDHのようなサブグループが必要ですq、単にqの倍数ではありません。その場合、OpenSSL(-dsaparam
コマンドラインスイッチ)は、最初にqを生成し、次にp = qt + 1をランダムな値に対して生成しますtの素数が見つかるまで;そして、ジェネレータは、ランダムなs modulo pを計算し、計算g = st modulo p(これにより、必ず1または正確に次数の整数qが生成されます)。 DSAパラメーターを生成するとき、ジェネレーターは2や5のような特定の小さな整数になることを簡単に(またはまったく)強制することはできません。 DSAの場合、ジェネレーターは「ビッグ」です。
ジェネレーター2および5とは何ですか?
これを理解するには、ある程度の数学的背景が必要です。 Diffie-Hellmannは環状基で動作します。これらのグループはすべて、少なくとも1つ generatorがあるという共通点があります。つまり、他のすべてのグループを生成するために使用できる要素です。グループの要素。
例を見てみましょう:
Z_11 *:gcd(i、11)= 1の整数のセットi = 0,1、...、10これは、11を法とする乗算のアーベル群です。
ジェネレータ:a = 2
a^1 = 2 mod 11,
a^2 = 4 mod 11,
a^3 = 8 mod 11,
a^4 = ( 16 =) 5 mod 11,
a^5 = ( 32 =) 10 mod 11,
a^6 = ( 64 =) 9 mod 11,
a^7 = ( 128 =) 7 mod 11,
a^8 = ( 256 =) 3 mod 11,
a^9 = ( 512 =) 6 mod 11,
a^10 = (1024 =) 1 mod 11
ご覧のとおり、グループ全体を生成しました。つまり、結果として各要素を取得しています。ただし、これはすべての種類のグループで機能し、pを法とする整数の乗法グループに限定されないことに注意してください。
2ではなく5を選択すると、セキュリティにどのような影響がありますか?
いいえ、 Diffie-Hellman問題 はすべて、循環グループのサイズに関するものであり、グループを生成する要素に関するものではありません。したがって、両方の要素がグループのジェネレーターである場合、違いはありません。ただし、2をジェネレーターとして選択すると、基盤となるアルゴリズムをより効率的に実装できるため、いくつかの利点があります。
個人的には、特に理由がない限り、ここではデフォルトを変更しません。これは明らかにそうではありません、そうでなければあなたは尋ねる必要はないでしょう;)。
これはOpenSSLに固有ですか?
いいえ、これは循環グループ自体の数学に基づいています。