web-dev-qa-db-ja.com

「Diffie-Hellman鍵交換」(英語)

誰かがDiffie-Hellman Key Exchangeがわかりやすい英語で何であるかを私に説明できますか?非テクノロジーニュースページで、Twitterがこのテクノロジーを実装したことを読んだことがあります。このテクノロジーにより、2人の人物が暗号化されたメッセージを安全でないチャネル上で交換できるようになります。どうですか(これが当てはまる場合)?

262
user15119

Diffie-Hellmanはgeneratingの方法です。2人の人間の間で共有される秘密で、通信を観察しても秘密を見ることができません。それは重要な違いです:あなたは情報を共有するではなく、あなたはキーを作成するを一緒にしています。

この手法を使用して誰かと暗号化キーを作成し、そのキーでトラフィックの暗号化を開始できるため、これは特に便利です。そして、トラフィックが記録され、後で分析されたとしても、それを作成した取引所が表示されていたとしても、キーが何であるかを理解する方法はまったくありません。これが 完全転送秘密 の由来です。キーが保存されず、送信されず、どこにも表示されなかったため、後日トラフィックを分析する人が侵入することはありません。

動作方法はかなり単純です。数学の多くは Trapdoor function が使用されているという点で公開鍵暗号で見られるものと同じです。そして、離散対数問題は伝統的に使用されますが(xy mod p business)、一般的なプロセスは 楕円曲線暗号化も使用 に変更できます。

ただし、公開鍵暗号と同じ基本原理を使用していますが、交換中に暗号化または復号化されるものがないため、これはnot非対称暗号です。ただし、これは必須のビルディングブロックであり、実際には後に非対称暗号が構築される基盤となりました。

基本的な考え方は次のように機能します。

  1. 私は素数pgの数を考え出しますp-1を素数にして、それらが何であるかを教えてください。
  2. その後、秘密の番号(a)を選択しますが、誰にも教えません。代わりにgを計算しますamodpそして、その結果を私に送り返します。 ([〜#〜] a [〜#〜]と呼びますa)。
  3. 同じことをしますが、秘密の番号bと計算された番号[〜#〜 ] b [〜#〜]gを計算しますbmodpそして結果を送信します( "[〜#〜] b [〜#〜] ")
  4. さて、あなたは私があなたに送った番号を受け取り、itでまったく同じ操作を行います。 Bamodp
  5. 私はあなたが私に送った結果で同じ操作をします、それで:Abmodp

ここでの「魔法」とは、ステップ5で得られる答えが同じ数ステップ4で得られたものであるということです。これは実際には魔法ではなく、単なる数学であり、以下の優れた特性になります。モジュロ指数。具体的には:

(gamodp)bmodp=gabmodp
(gbmodp)amodp=gmodp

これは、詳しく調べれば、累乗をどの順序で実行しても同じ答えが得られることを意味します。つまり、ある順序で実行し、別の順序で実行します。結果を得るために使用した秘密の番号や、使用した番号はわかりませんが、同じ結果にたどり着きました。

その結果、ステップ4と5で偶然見つけた数字が共有秘密鍵です。これを、AESまたはBlowfish、または共有シークレットを使用するその他のアルゴリズムのパスワードとして使用できます。そして、私たちが一緒に作成した鍵を知っているのは、私たち以外の誰もいないということです。

372
tylerl

他の答えは、鍵交換の背後にある数学を説明する優れた仕事をします。より絵画的な表現が必要な場合は、 Diffie–Hellman鍵交換 ウィキペディアのエントリに示されている優れたPaintの類推に勝るものはありません。


DH key exchange image

画像はパブリックドメインです

147
Duncan Jones

Diffie-Hellmanは、2つのパーティ間で共有秘密を確立するために使用されるアルゴリズムです。これは主に、AESなどの対称暗号化アルゴリズムで使用する暗号化キーを交換する方法として使用されます。

アルゴリズム自体は非常に単純です。アリスがボブと共有秘密を確立したいとします。

  1. アリスとボブは、事前に素数pと底gについて合意します。この例では、p=23およびg=5であると想定します。
  2. アリスは、値が6である秘密の整数aを選択し、A = g^a mod pを計算します。この例では、Aの値は8です。
  3. ボブは、値が15である秘密の整数bを選択し、B = g^b mod pを計算します。この例では、Bの値は19です。
  4. アリスはAをボブに送信し、ボブはBをアリスに送信します。
  5. 共有シークレットを取得するために、アリスはs = B^a mod pを計算します。この例では、アリスはs=2の値を取得します
  6. 共有シークレットを取得するために、ボブはs = A^b mod pを計算します。この例では、ボブはs=2の値を取得します。

aを導出するために必要なbsの値は、回線を介してまったく送信されないため、アルゴリズムは安全です。

38
user10211

技術者でない人でも簡単に理解できるDHの簡単でわかりやすい英語の説明が必要な場合は、二重ロックボックスの類推があります。

  1. アリスは箱にシークレットを入れ、開く鍵が1つしかない南京錠でロックします。その後、ボックスをボブに発送します。

  2. ボブは箱を受け取り、彼だけが鍵を持っている2つ目の南京錠をその上に置き、アリスに返送します。

  3. アリスはロックを外し、ボックスをもう一度ボブに発送します。

  4. ボブはロックを解除して箱を開け、アリスが彼に送った秘密にアクセスできます。

輸送中、箱には常に少なくとも1つのロックがかかっているので、イブは何が入っているかを確認して秘密を盗む機会がありません。この場合、アリスとボブの残りの通信を暗号化するために使用される暗号鍵です。

鍵交換の問題

安全な接続には、鍵の交換が必要です。ただし、キー自体は安全な接続で転送する必要があります。

2つの可能な解決策があります。

  1. 物理的に鍵を会って共有することにより、鍵を交換します。
  2. どういうわけか、安全でない公開チャネルで共有秘密を確立しました。これは言うより簡単であり、このような最初の実装はDiffie-Hellmanスキームです。

プロパティ

Diffie-Hellmanは、次のプロパティを持つ数学関数を利用します。

  1. f[x]を計算するのは簡単です(xから)
  2. xを取得するためにf[x]を反転することは困難です
  3. Sf[B]からAを計算するのは簡単です
  4. Sf[A]からBを計算するのは簡単です
  5. SまたはAなしでBを計算することは困難です(f[A]およびf[B]を使用しても)

DHスキームのしくみ

  1. アリスは乱数Aで出てきます。彼女はf[A]を計算し、f[A]をボブに送信します。アリスは自分のAをボブにさえも開示しません。
  2. ボブは別の乱数Bを出します。彼はf[B]を計算し、f[B]をアリスに送信します。ボブはアリスにさえ、自分のBを決して開示しません。
  3. アリスはSf[B]を使用してAを計算します。ボブはSf[A]を使用してBを計算します
  4. 盗聴しているマロリーはf[A]f[B]しか持っていないので、Sを計算するのは難しいです。
  5. これで、アリスとボブは、安全な接続を確立するための鍵として(または思いつくために)使用できる共通の秘密を共有します。

サイドノート:

Diffie-Hellmanスキームは、いかなる種類の認証も提供しません。 2つの匿名の当事者のみが共通の秘密を共有することができます。しかし、アリスが知っているすべての人にとって、彼女は(ボブの代わりに)悪魔と握手している可能性があります。これが、少なくとも1つのパーティを認証する必要がある理由です。

例:SSL(https)、WebサーバーはPKI(公開キー基盤)を使用して認証され、Webサイトとクライアント間で安全な接続が確立されます(D-H)。 Webサイトが認証されているため、クライアントはWebサイトを信頼できますが、Webサイトはクライアントを信頼できません。これで、クライアントが自分の認証の詳細をWebページに提供しても安全です。

26
aiao

インターネットを通過するデータを保護するには、通常、次の2つの方法でデータを保護する必要があります。

  • 機密性-意図した受信者以外は誰もデータを読み取れないことを保証する
  • 整合性-転送中のデータを誰も変更または改ざんできないようにする

機密性は 対称暗号化 を使用して提供され、完全性は メッセージ認証コード(MAC) を使用して提供されます。

対称暗号化とMACの両方で、両方の当事者が identical および secret 鍵を持っている必要があります(この意味での「鍵」とは、単に数値であり、変換されたバイナリへ)。

次に、問題はインターネット上で両方の当事者がどのようにidenticalおよびsecretキーを確立するかです。 ?(またはその他の安全でない媒体)。これは「鍵交換の問題」として知られています。

この問題の解決策の1つは、Diffie-Hellmanアルゴリズムです。


Diffie-Hellmanを使用すると、2つの当事者が安全でない媒体上で共有秘密を確立することができます。または、もっと簡単に言えば...

あなたとあなたの友人が怪しげに見える人々に囲まれた混雑した部屋に立っていたと想像してください。あなたとあなたの友人が同じ番号に同意する必要があると仮定しますが、その部屋の他の誰にもそれが何であるかを知られたくない。 Diffie-Hellmanは、あなたとあなたの友人がいくつかの数を巧みに交換することを可能にし、those数からanother数を計算しますこれは同じです。部屋の全員が交換される番号を聞いたとしても、あなたとあなたの友人が到着した最終的な番号を決定する方法はありません。

以下の画像で、これが発生している例を確認できます。アリスとボブはDiffie-Hellman鍵交換を使用して、共有秘密を確立します。

 Diffie-Hellman Key Exchange -- pracnet.net/crypto 

会話を「聞いている」人は誰でも、途中で交換された番号を「聞く」だけです:13629。これらの4つの数値を組み合わせて最終的な共有秘密を取得する一貫した方法はありません:3アリスまたはボブのプライベート値(5または4)共有されませんでした。

ThatはDiffie-Hellmanの美しさです。

上記の例で使用されている数値は、計算を簡単にするために小さくなっています。実際には、現代のDiffie-Hellman交換で使用される数値は、/最小でも2048ビット長です-これには約 617桁が必要です 〜書き出す!!


Diffie-Hellman鍵交換を完了すると、両方の当事者は、各当事者だけが知っている同一の値を持つようになります。

この値は、追加のキーを生成できる「開始点」になります。

以前、対称暗号化とメッセージ認証コードにはそれぞれ秘密鍵が必要であることを述べました。 DH共有シークレットを取得して、他のいくつかの値と組み合わせると、必要な暗号化キーとMACキーが手に入ります。

追加の利点は、値を組み合わせてキーを作成するのが簡単です...必要なだけ何度でも実行できます。

実際、多くのセキュリティプロトコル(SSL/TLS、IPsecなど)は、トラフィックを保護するために1セットのキーを生成します/各方向-合計4つのキー(MAC +一方向の暗号化、MAC +反対方向の暗号化)。 Diffie-Hellmanから派生した、同じ初期開始値から生成された4つのキーすべて。

10
Eddie

Diffie-Hellmanは、2つのパーティ間で共有秘密を交換するための数学アルゴリズムです。この共有シークレットは、これらの2者間のメッセージを暗号化するために使用できます。 Diffie-Hellmanアルゴリズムは、これらの2者間の認証を提供しないことに注意してください。

5
Lucas Kauffman

ComputerphileのDiffie-Hellmanビデオは、この主要な交換の説明に関しては非常に壮観です。彼らのビデオ " Secret Key Exchange(Diffie-Hellman) "は非常に詳細ですが、DHの背後にある数学の説明は、これまでにどんな媒体でも出会った中で最高です(そして確かに私が個人的にここに書くことができるもの)。 ここで時計を取る

2
securityOrange

上記の回答のように数式を使用しない単純な英語では、Diffie-Hellman Key ExchangeはDiffieとHellmanによる発明です。

本発明は、2人が同じ数に同意する方法に関するものです。この共通の合意された番号は、2人が希望する目的に使用されます。たとえば、DH Key Exchangeの手順を実行した後、最終的には両方の人が同じ番号に到着します。 2人の誰も、この一般的な数がどうなるかを制御できません。 DH Key Exchangeの発明は、両方の人が共通の番号に到着することを保証するだけです。この一般的な番号が達成された後の使用例は、この番号を使用してアルファベットの文字を転送することです。たとえば、共通の番号が5の場合、メッセージを送信すると、文字AはFになり、文字BはGになります。メッセージを受信した他の人は、メッセージの各文字を逆方向に読んでそれを読みます。

Person-Aperson-Bは、3番目のperson-Cがそれを聞くため、共通の番号について合意するために大声で話すことはできませんでした。 person-Cが合意された番号を知っている場合、彼は秘密のメッセージも読むことができます。 DH Key Exchangeには常にalwaysが存在する必要があります。person-Cperson-Aの間のメッセージを聞くことができる3番目のperson-Bとこれthree-personsシナリオは、person-Cperson-Aの間の秘密のエンコードされたメッセージをperson-Bが読み取れないようにする方法に関する本発明の目的全体です。

DH Key Exchangeの最初のステップで、person-Aperson-Bはいくつかの数値をやり取りし、この初期段階でperson-Cはこれらの最初のメッセージを読み取ることができます。 2番目のフェーズでは、person-Aperson-Bは、person-Cが読み取ることができない暗号化されたメッセージを送信します。 person-Cは最初のステップで最初のメッセージを聞くことができるという事実にもかかわらず、person-Cは、person-Aperson-Bが現在同意している番号に到達できません。

DiffieとHellmanは、この発明について2015年にTuring Awardを受賞しました。

0
typelogic

一度は書いたことのないトークのコンセプトとして書きました。これは、高校卒業後に誰でもできる数学のレベルを使用した実際の暗号化を示しています。

トークとして書かれているので、わかりやすい英語のDiffie-Hellmanです!

ねえ!暗号化されたチャネルをセットアップしましょう。私はあなたに私の鍵を送り、あなたは私にあなたの鍵を送ります。そうすれば、私たちは非公開で話すことができます。

何って言ったの?みんな聞こえますか?はい、それは問題ありません!

Diffie-Hellmanを使用できます。乱数について考えて、その乱数の5乗をしてください。結果を23で割り、残りを計算します。それを私にください。元の乱数は、秘密にしておく必要があります。他の数字はすべて公開されています。

残りは8ですか?はい。私の剰余は10です。今度は、私の剰余を再び秘密の乱数で累乗し、再び23で割り、剰余を取ってください。同じこと、簡単なこと。私はあなたの番号と私の秘密の乱数で同じことをします。

あなたは結果を得ましたか?すごい、私も!私と同じように6を獲得しましたが、この部屋の他の誰もそれを計算できなかったでしょう。彼らは彼らが聞いたものと一致する乱数(あなたの側から8つと私のものから10つ)を見つけるまですべての可能な組み合わせを試すことができたかもしれませんが、すべての可能性を試すことよりこれをより効率的に計算する方法はありません。結果として6をパスワードとして使用することもできます。交換を聞いても、私たちが使用するパスワードを誰も知らなかっただろう。しかし、それは非常に弱いパスワードです。次回は、より大きな数字を選択し、計算機を使用して、長くて強力なパスワードを作成する必要があります。

私たちはお互いを見ることができるので、これはうまくいったことに注意してください。あなたの唇が動くのを見ることができるので、あなたの数が8であると私に言ったとき、それは誰かが話しているのではないことを知っています。インターネットでは、誰かが反対側になりすまして偽の番号を提供することで、これに対する攻撃を仕掛けることができます。これらの攻撃をどのように防ぐかは別の日のトピックです。

0
Luc

Diffie–Hellmanの目標:オープンチャネルを介して2つのパーティ間で密かに番号を共有します。

まず学校からこれらのべき乗則を思い出してください:(xᵃ)ᵇ=xᵃᵇ=xᵇᵃ e.g. (2³)⁴=(2⁴)³=4096。アイデアは、アリスがxおよびxᵃをボブに送信した場合、ボブも他の誰もaを計算できないということです。 2³が何であるかを言うのは簡単ですが、8を指定すると、2が8になるためにどのパワーをもたらす必要があるかを言うのは困難です。

  1. アリスとボブは、誰にでもわかる番号xに同意します。たとえば、2としましょう。
  2. アリスはa=3を生成し、2³=8をボブに送信します
  3. ボブは番号b=4を生成し、2⁴=16をアリスに送信します
  4. アリスは16³=4096を計算し、ボブは8⁴=4096を計算します

したがって、アリスとボブはどちらも4096を知っていますが、abを知っている人はいないので、xᵃᵇを計算できません。

実際には、対数の計算はそれほど複雑ではありません。しかしモジュラー演算が含まれると複雑になります。