私は最近、基本的にちょうど(以下の場合は4096ビット)素数であるいくつかのカスタムDiffie Hellmannパラメータを生成しました。これらは、鍵交換プロセスで使用されます。
次のコマンドを使用しました。
openssl dhparam -Rand – 4096
自分でこれらのパラメーターを生成しない場合、OpenSSLが実際に何をするのか、私は本当に不思議に思います。
生成に約2時間かかったので、それはその場で生成されるものではあり得ません-少なくとも同じ強さではないでしょうか?だから、私は疑問に思う、標準的な設定はありますか、あるいはこの場合OpenSSLは実際に何をしますか? (まだ明確で役立つ情報はあまり見つかりませんでした)
また、セキュリティの強化によって、標準が自己生成された素数とどの程度比較されているのか、素数の長さの違いは何でしょうか。
ありがとう
アップデート15.06.2015
独自のDHパラメータを生成するのは理にかなっているようです:
OpenSSLの動作ライブラリとしては、 SSL_CTX_set_tmp_dh_callback() のマニュアルページに記載されています。基本的に、ライブラリ自体には事前に生成されたDHパラメータが含まれておらず、そのようなパラメータが提供されるまで「DHE」ハンドシェイクを拒否します。呼び出し元(SSLサーバーを実行するためにOpenSSLを使用するアプリケーション)は、DHパラメーターをプリエンプティブに(サーバーの証明書を含む構造に「アタッチ」するか、明示的なSSL_CTX_set_tp_dh()
呼び出しで)、またはコールバックを介して提供できます関連するハンドシェイクごとに呼び出される関数。コールバックメソッドは、現在交渉中の暗号スイートとその他のパラメーターに基づいて、DHパラメーター、特にそれらのサイズをアプリケーションに調整する機会を与えます(これは、古い「エクスポート」暗号スイートの適切なサポートにとって重要でしたが、はるかに少ないです)最近の関連)。
OpenSSLは、Cコードの一部 として 、コマンドラインアプリケーションも付属しています。例えば。 openssl s_server
を使用してSSLサーバーを実行できます。 apps/s_server.c
ソースファイルを調べると、明示的なDHパラメーター(-dhparam
オプション、またはサーバーの証明書ファイルに追加)で上書きしない限り、デフォルトのパラメーターが512ビットのモジュラス(! )。この係数の起源は特定されていません。しかし、530ビットの離散対数 が少なくとも1回は解かれているため 、これは本当に強いとは言えません。
apps/
ディレクトリには、dh512.pem
、dh1024.pem
、dh2048.pem
、dh4096.pem
という名前のファイルも含まれていることに注意してください。これらは、512、1024、2048、4096ビットのDHパラメータです。 、それぞれ。これらは明らかに [〜#〜] skip [〜#〜] から来ています。IPsec関連のキー管理用の古いプロトコルで、古い draft 。これには、OpenSSLソースコードにdh1024.pem
およびdh2048.pem
ファイルとして含まれている1024ビットおよび2048ビットの係数が含まれています。興味深いことに(またはそうではない)、apps/s_server.c
で使用される512ビットの係数は、dh512.pem
の係数と同じではありません。
パラメータは呼び出し側から提供されるため、 Apache の通常のSSLエンジンであるmod_ssl
で何が起こるかを見てみましょう。話を短くしましょう。係数とジェネレーターはハードコードされています。ソースコードのmodules/ssl/ssl_engine_dh.c
にあります。 512ビットの係数と1024ビットの係数があります。サーバーの公開鍵の長さが512ビットの場合、512ビットの係数が使用されます。それ以外の場合は、1024ビットの係数が使用されます。したがって、実際には、常に1024ビット係数です。ソースコードでは、これらのパラメーターがどのように生成されたかについては言及していません。これらは、OpenSSLのソースコードに付属するものとは異なります。どうやらwhole Worldは、その起源が不明な1024ビット係数を使用します(少なくとも、Apache + mod_sslに依存する世界の半分)。
2013/09/29現在の開発バージョン2.5.0-dev以降のApacheの将来のバージョンでは、 からコピーされた2048、3072、4096ビットのハードコーディングされたDHパラメータに切り替わることに注意する必要があります。 RFC 3526 。これらのDHパラメータは効率的であると想定されており(たとえば、ジェネレータとしてg = 2を使用し、64の最上位ビットと最下位ビットはすべて1であり、モンゴメリ乗算の一部の実装に役立つ場合があります)、および 「明らかに安全」 1024ビットを超えるDHパラメータを使用すると、SSLクライアントの実装が不十分 が壊れる ことがわかっており、特にJavaに付属しているものは_まで(および_を含む)Java 7(JavaのSSL実装は一般に問題ありませんが、DHEサポートの場合、1024ビットの制限があります。JavaにはBigInteger
クラスがあるため、これはちょっとばかげていますより大きなサイズでのDHingのタスクまで完全に)。
DHパラメータの生成はそれほど低速である必要はないと言っておく必要があります。 OpenSSLは、いわゆる「安全な素数」の作成を主張しています。「安全な」は科学よりもマーケティングです。 「安全な素数」は、素数(p-1)/ 2も素数になるような素数pです。これにより、2..p-2範囲の任意の整数をジェネレーターとして使用できますg、特にg = 2、これにより、パフォーマンスがわずかに向上します。一方、安全な素数を生成することは困難です。大まかに言って、1024ビット整数を処理する場合、それらの1/1000だけが素数であり、これらの素数の1/1000だけが「安全な素数」なので、検索ループ100万の潜在的な値を試みます。
暗号学的に言えば、DSAが使用するのと同じ種類のパラメーターをDHパラメーターとして使用することもできます。pは素数であり、p-1ははるかに小さい素数の倍数です- q、およびgは順序qの整数です。これらは1秒未満で生成でき、DHの場合は問題ありません。