web-dev-qa-db-ja.com

オンラインDiffie-Hellmanツール

だから私はこれに偶然出会った website は、一般に無料でオンラインでDiffe-Hellmanパラメータを生成するサービスを提供しています。

確かに、このようなWebサイトを使用することは、本番環境で使用してDHパラメータを自分で生成するのではなく生成することは悪い考えでしょうか?それともそれがどこから来たのか実際には違いはありませんか?

5
Tachyon

DHパラメータの生成方法

DHパラメータには 2種類のジェネレータ があります。各ジェネレータには2つのステップがあります。ランダムな入力を必要とするステップと、確定的なステップです。 2つのステップは、2つのタイプのジェネレーターで同じです。

  • システムはエントロピーをジェネレーターに提供し、ジェネレーターはそれを使用して候補素数を生成します。
  • 確定的アルゴリズムは、安全でない特性を持つ素数をすべて破棄します。

この2番目のステップは、偶発的に安全でない数学的特性を持つ係数を生成しないように設計されています。この手順は、故意に悪意のある候補を検出するようには設計されておらず、自然にポップアップする偶発的な候補のみを検出します。これらの計算が難しいステップの結果は、DH鍵交換での使用に適しており、偶発的な弱点がないモジュラスのリストです。

悪意のあるパラメータ

バックドア付きDiffie-Hellmanパラメータ を作成することは可能ですが、これは 安全として検証済み です。たとえば、 [〜#〜] snfv [〜#〜] と互換性のある素数、または small-subgroup attack に対して脆弱な素数。 はるかに多くの問題 があります。これは、これらのパラメーターを提供するサービスを信頼することは危険である可能性があることを意味します。なぜなら、使用しているシードにアクセスできないため、係数が実際に乱数ジェネレータを使用して素数を選択したかどうかを知る方法がないためです。 。確定的な検証手順は、作成される候補の数が多いために発生する偶発的な安全でない素数を検出するためにのみ設計されています。 「だます」のが難しいことを意味するものではありません。

何もない私の袖番号

nothing-up-my-sleeve number は、よく知られている適切な数学的特性を持つ値であり、「なぜを選択したのか(= /// =)」という質問を緩和します定数?」暗号化で使用されるいくつかの例は、π、e、または独立宣言ですらあります。これにより、誰もが素数が安全であり、完全に確定的で再現可能なプロセスで生成されたことを検証できます。彼らがこれを行った場合、悪意のある係数を生成することははるかに困難になります。たとえば、 RFC 3526 からのすべてのモジュライは、πを「何もアップしない」スリーブ番号として使用するため、すべての素数は次の形式になります。

moduli

ここで、nは係数のビット数であり、iを構成する最小の正の整数ですpa 安全な素数 。これにより、これらの標準係数の生成に使用される原因不明の値がないことが明らかになります。

これは 万能薬ではありません です。ランダムに選択された定数のかなりの数が弱点をもたらすアルゴリズムの場合、選択手順の調整可能な要素の数によって、バックドアを挿入する定数を検索できるほど見かけ上単純な定数が大きくなる場合があります。幸いなことに、DHはその素数について十分にうるさいので、これが少し難しくなるようです。それでも、よく知られているドキュメントのバイナリ表現を使用するよりも、πを使用する方が良いです。それとも、あいまいであるが不合理な数値や、家族の誕生日などの個人的なものを使用することです。 πは均一なランダム分布を提供し、非合理的であるため、特定の範囲にある必要がなく、秘密である必要がないすべての定数に適しています。

予測できないパブリックのランダム性

この決定論的な生成により、敵対者が将来の係数を自分で事前計算できる(したがって将来の出力を予測できる)ことが問題である場合、将来の出力が予測可能でないことを保証する分散共有ランダム性プロトコルが望まれます。これは、Tor Projectによって Shared Randomness Protocol という名前で行われました。値を事前に予測することはできませんが、過去に公開されたことを確認できます。 Torプロトコルは、 コンセンサスドキュメント で毎日00:00 UTCに新しい値をリリースします。これらの値は、たとえばDRNGにフィードすることにより、新しいDH係数を生成するために使用できます。


それらのメソッドによって提供されるプロパティ、安全な数値(何もないスリーブ数)、および共有されたランダム性(Torのプロトコルなど)の比較を示す図を以下に示します。

+---------------+-------------+--------------+-------------+----------------+
|               | Value known | Reproducible | Predictable | Trust required |
+---------------+-------------+--------------+-------------+----------------+
| Their method  | no          | no           | no          | yes            |
| Safe numbers  | yes         | yes          | yes         | no             |
| Shared random | yes         | with value   | no          | low            |
+---------------+-------------+--------------+-------------+----------------+

候補となる素数生成プロセスは、次のように説明できます。

  • 値がkの確定的乱数ジェネレータ(DRNG)をシードします。
  • DRNGからnビット整数pを抽出します。ここで、nは、目的の係数サイズです。
  • pが奇数の整数でない場合は、1ずつ増分または減分します。
  • pが素数でない場合、または(p-1)/ 2が素数でない場合は、手順2に進みます。
  • p候補と見なします。候補が十分に見つからない場合は、手順2に進みます。

最初の方法は、Linuxカーネルのエントロピープールなどの内部エントロピーソースからkを選択します。 2番目の方法は、πなどの何もアップしていないスリーブ番号からkを選択します。 3番目の方法は、Torの現在の共有ランダム値など、予測できないパブリックランダム値からkを選択します。これらのどれが脅威モデルを満たすプロパティを提供するかを決定するのはあなた次第です。最初のシードを隠さず、シードで再現可能であり、予測不可能であり、信頼を必要としないため、ローカルで独自のパラメーターを生成した方がよい場合があります。

8
forest