本論文の参照元https://segmentfault.com/a/1190000010917737とhttps://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4 と https://www.cnblogs.com /DarkValkyrie/p/10962231.html (大きな助けのこの記事の首長の基本式)
Diffie-Hellman鍵交換アルゴリズムとは何ですか?
Diffie-Hellmanは:セキュリティ確保KEYを共有するための
間で
非セキュアなネットワークを、それはOAKLEYの不可欠な部分です。ホワイトフィールドとMartin Hellmanは1976年に、素敵な鍵交換プロトコルを提示したDiffie-Hellman鍵交換プロトコル/アルゴリズム(のDiffie-Hellman鍵交換/協定と呼ばれるアルゴリズム)。 両当事者が安全に通信できる必要があり、この独創的なメカニズムを対称鍵は、この方法によって決定されます。その後、暗号化および復号化キーを使用することができます。注意は、しかし、鍵交換プロトコル/鍵交換アルゴリズムを使用することができるが、メッセージの暗号化と復号化にはありません。双方は、他の使用するために、キーを使用して決定し
、対称鍵暗号化アルゴリズムの操作を
暗号化を達成し、メッセージを解読します。
はじめにアルゴリズムモジュロ算術ルール---
- 幾分同様の四つの基本的な演算が、分割の例外を除いてモジュロ演算。次のようにそのルールは以下のとおりです。
- (A + B)%のP =(%のP + B%のP)%のP(1)
- ( - B)%のP =(P% - B%P)%のP(2)
- (* B)%、P =(%Pは* B%P)が%P(3)
- ^ Bの%のP =((%のP)^ B)%のP(4)
- 連想法:
- ((A + B)%のP + C)%P =(A +(B + C)%P)%のP(5)
- ((* B)%のP *はC)%P =(*(B * C)%P)が%P(6)
- 可換:
- (A + B)%のP =(B + A)%のP(7)
- (* b)は%のP =(B * A)%のP(8)
- 分配法則:
- (A + B)%のP =(%のP + B%のP)%のP(9)
- ((A + B)%のP *はC)%、P =((* c)が%Pが+(b *表C)%P)%のP(10)
まず
れるDiffieHellman鍵交換アルゴリズム
数論の基礎
1.(A ^ Xa因子のmod P)^ XbのMOD P = A ^(XA * Xbの)MOD P
2.等価剰余演算と可換性
1>(mod n)を計算MOD N = MOD Nの同値
2>。^ Bの%のP =((%のP)^ B)%のP
アルゴリズムの原則:
1.次に、クライアント二つの素数のサーバ選択、(公然と)Pを仮定
-
クライアント:第Xa選択自然数、雅= A ^ Xa因子のmod P、雅、サーバに送信します。
-
サーバー:自然数Xbを、Ybのは= A ^ Xbのモッズpを選択し、クライアントのYbに送信します。
-
クライアント:計算のKa = Ybの^第XaモッズP
- サーバー:KB =雅^ Xbのモッズpを計算
導出
カー= Ybの^モッズPを送ります
=(A ^ XbのMOD P)^第Xa MOD P
==>(A ^ Xbの MOD P)^第Xa 式のMOD Pは、4つの(a ^ Xbの)^第Xa MODに分割することができ 、P
= ^(Xbの*第Xa)のmod P
=(A ^ Xa因子のmod P)^ XbのMOD P
=雅^ XbのモッズP
= KB
私たちは、クライアントは、サーバーが互いの第Xa、Xbの中でお互いを知りませんが、同等の秘密を計算するのにもかかわらず、見ることができます。
コード例Nodejs
点クライアントの一つであるコードビュー、以下の要約に関連して先に述べたように、サーバは、同じ素数、Pを使用します。
必要暗号= VAR( '暗号'); VARのprimeLength = 1024; //長素数pの VARジェネレータ= 5; //プライム //作成し、クライアントのDHインスタンス VAR = crypto.createDiffieHellmanクライアント(primeLength、ジェネレータ); / /生成した公開鍵のペア、MOD第Xa雅= A ^ PVAR clientKey client.generateKeys =(); //同じ素数、Pのでクライアントを使用して、インスタンスDHサーバを作成 VAR = crypto.createDiffieHellmanサーバー(クライアント。 getPrime()、client.getGeneratorは()); //公開鍵と秘密鍵のペアを生成し、XbのYbを= A ^ P MODの VAR server.generateKeysサーバキー=(); //計算^ Pのの第XaのYb = MODのKa VAR =クライアントclientSecret .computeSecret(server.getPublicKey()); //計算雅^ Xbの= MOD KB P VAR serverSecret = server.computeSecret(client.getPublicKey()); //各プリントがないように、素数pは、動的に生成されるので以下のような //但是clientSecret === serverSecretの console.log(clientSecret.toString( '進')); console.log(serverSecret.toString( '進'));