DH密鑰交換算法


迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange,簡稱“D–H”) 是一種安全協議。
它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在后續的通訊中作為對稱密鑰來加密通訊內容。

轉載1、轉載2[只用於學習,感謝原PO]
(1)、算法描述

離散對數的概念:

原根:如果a是素數p的一個原根,那么數值:

            amodpa^2 modp,…,a^(p-1) modp

 是各不相同的整數,且以某種排列方式組成了從1p-1的所有整數。

離散對數:如果對於一個整數b和素數p的一個原根a,可以找到一個唯一的指數 i,使得:

          =(a的i次方) modp               其中0p-1

                     那么指數i稱為b的以a為基數的模p的離散對數。

Diffie-Hellman 算法的有效性依賴於計算離散對數的難度,其含義是:當已知大素數p和它的一個原根a后,對給定的 b,要計算 i ,被認為是很困難的,而給定 計算卻相對容易。

Diffie-Hellman算法:

假如用戶A和用戶B希望交換一個密鑰。

取素數p和整數aap的一個原根,公開a和p。

A選擇隨機數XA<p,並計算YA=a^XA mod p。

B選擇隨機數XB<p,並計算YB=a^XB mod p。

每一方都將X保密而將Y公開讓另一方得到。

A計算密鑰的方式是:K=(YB) ^XA modp

B計算密鑰的方式是:K=(YA) ^XB modp

證明:

                     (YB)^ XA mod = (a^XB modp)^ XA mod p

                         = (a^XB)^ XA mod p = (a^XA) ^XB mod p    (<-- 密鑰即為 a^(XA*XB) mod p)

                         =(a^XA modp)^ XB mod p= (YA) ^XB mod p

由於XA和XB是保密的,而第三方只有pa、YB、YA可以利用,只有通過取離散對數來確定密鑰,但對於大的素數p,計算離散對數是十分困難的。

例子:

假如用戶Alice和用戶Bob希望交換一個密鑰。

取一個素數p =97和97的一個原根a=5。

Alice和Bob分別選擇秘密密鑰XA=36和XB=58,並計算各自的公開密鑰:

YA=a^XA mod p=5^36 mod 97=50

YB=a^XB mod p=5^58 mod 97=44

Alice和Bob交換了公開密鑰之后,計算共享密鑰如下:

Alice:K=(YB) ^XA mod p=44^36 mod 97=75

Bob:K=(YA) ^XB mod p=50^58 mod 97=75 

(2)、安全性

當然,為了使這個例子變得安全,必須使用非常大的XA, XB 以及p, 否則可以實驗所有的可能取值。(總共有最多97個這樣的值, 就算XA和XB很大也無濟於事)。
如果 p 是一個至少 300 位的質數,並且XA和XB至少有100位長, 那么即使使用全人類所有的計算資源和當今最好的算法也不可能從a, p和a^(XA*XB) mod p 中計算出 XA*XB。
這個問題就是著名的離散對數問題。注意g則不需要很大, 並且在一般的實踐中通常是2或者5。
在最初的描述中,迪菲-赫爾曼密鑰交換本身並沒有提供通訊雙方的身份驗證服務,因此它很容易受到中間人攻擊。 
一個中間人在信道的中央進行兩次迪菲-赫爾曼密鑰交換,一次和Alice另一次和Bob,就能夠成功的向Alice假裝自己是Bob,反之亦然。
而攻擊者可以解密(讀取和存儲)任何一個人的信息並重新加密信息,然后傳遞給另一個人。因此通常都需要一個能夠驗證通訊雙方身份的機制來防止這類攻擊。
有很多種安全身份驗證解決方案使用到了迪菲-赫爾曼密鑰交換。例如當Alice和Bob共有一個公鑰基礎設施時,他們可以將他們的返回密鑰進行簽名。

Diffie-Hellman密鑰交換算法原理:

(1)Alice與Bob確定兩個大素數n和g,這兩個數不用保密
(2)Alice選擇另一個大隨機數x,並計算A如下:A=gx mod n
(3)Alice將A發給Bob
(4)Bob選擇另一個大隨機數y,並計算B如下:B=gy mod n
(5)Bob將B發給Alice
(6)計算秘密密鑰K1如下:K1=Bx mod n
(7)計算秘密密鑰K2如下:K2=Ay mod n
K1=K2,因此Alice和Bob可以用其進行加解密 

  RSA加密算法是基於這樣的數學事實:兩個大素數相乘容易,而對得到的乘積求因子則很難。加密過程如下:

(1)選擇兩個大素數P、Q
(2)計算N=P*Q
(3)選擇一個公鑰(加密密鑰)E,使其不是(P-1)與(Q-1)的因子
(4)選擇私鑰(解密密鑰)D,滿足如下條件:
          (D*E) mod (P-1)(Q-1)=1
(5)加密時,明文PT計算密文CT如下:
          CT=PTE mod N
(6)解密時,從密文CT計算明文PT如下:
          PT=CTDmodN 這也是SSL中會用一種密鑰交換算法。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM