Diffie-Hellman密鑰交換算法
之前做過的一個項目中用過DH算法(Diffie-Hellman),這種密鑰交換技術的目的在於使得兩個用戶安全地交換一個共享密鑰(shared secret)以便用於以后的報文加密。
DH算法的有效性依賴於計算離散對數的難度。簡言之,可以如下定義離散對數:首先定義一個素數p的原根,為其各次冪產生從1 到p-1的所有整數根,也就是說,如果g是素數p的一個原根,那么數值
g mod p, g2 mod p, ..., gp-1 mod p
是各不相同的整數,並且以某種排列方式組成了從1到p-1的所有整數。
對於一個整數b和素數p的一個原根g,可以找到惟一的指數i,使得
b = gi mod p 其中0 ≤ i ≤ (p-1)
指數 i 稱為b的以g為基數的模p的離散對數或者指數。該值被記為indg ,p(b)。
下面是DH算法的原理:
有兩個全局公開的參數,一個素數p和一個整數g,g是p的一個原根。
服務端的私鑰和公鑰分別是a和A,客戶端的私鑰和公鑰分別是b和B;
服務端根據a、p、g,可以計算出公鑰A;
服務端將g, p, A明文傳送給客戶端,客戶端可以計算自己的公鑰B,以及共享密鑰K;
客戶端將B明文發送給服務端,服務端也可以計算出共享密鑰K。
具體如下圖:

根據上述流程,客戶端於服務端之間明文傳輸的是g、p、A、B,然后雙方就可以得到一個同樣的共享密鑰K,並以K對后續要傳輸的數據進行對稱加密、解密即可。
由於計算K需要一方的私鑰和另一方的公鑰,所以理論上,只要雙方的私鑰a、b不被第三方知道,這個共享密鑰K就是安全可用的。
DH算法具有兩個吸引力的特征:
- 僅當需要時才生成密鑰,減小了將密鑰存儲很長一段時間而致使遭受攻擊的機會;
- 除對全局參數的約定外,密鑰交換不需要事先存在的基礎結構;
然而,該技術也存在許多不足:
- 沒有提供雙方身份的任何信息;
- 計算密集性,因此容易遭受阻塞性攻擊,即對手請求大量的密鑰。受攻擊者花費了相對多的計算資源來求解無用的冪系數而不是在做真正的工作;
- 沒辦法防止重演攻擊;
- 容易遭受中間人的攻擊。第三方C在和A通信時扮演B;和B通信時扮演A。A和B都與C協商了一個密鑰,然后C就可以監聽和傳遞通信量。中間人的攻擊按如下進行:
- B在給A的報文中發送他的公開密鑰YB。
- C截獲並解析該報文。C將B的公鑰保存下來並給A發送報文,該報文具有B的用戶ID但使用C的公鑰YC,但仍按照好像是來自B的樣子被發送出去。A收到C的報文后,將YC和B的用戶ID存儲在一塊。類似地,C使用YC向B發送好像來自A的報文。
- B基於私鑰XB和YC計算共享密鑰K1,A基於私鑰XA和YC計算共享密鑰K2,C使用私鑰XC和YB計算K1,並使用XC和YA計算K2。
- 從現在開始,C就可以轉發A發給B的報文或轉發B發給A的報文,在途中根據需要修改它們的密文。使得A和B都不知道他們在和C共享通信。
Oakley算法是對Diffie-Hellman密鑰交換算法的優化,它保留了后者的優點,同時克服了其弱點。
Oakley算法具有五個重要特征:
1、它采用稱為cookie程序的機制來對抗阻塞攻擊。
2、它使得雙方能夠協商一個全局參數集合。
3、它使用了現時來保證抵抗重演攻擊。
4、它能夠交換Diffie-Hellman公開密鑰。
5、它對Diffie-Hellman交換進行鑒別以對抗中間人的攻擊。
Oakley可以使用三個不同的鑒別方法:
1、數字簽名:通過簽署一個相互可以獲得的散列代碼來對交換進行鑒別;每一方都使用自己的私鑰對散列代碼加密。散列代碼是在一些重要參數上生成的,如用戶ID和現時。
2、公開密鑰加密:通過使用發送者的私鑰對諸如ID和現時等參數進行加密來鑒別交換。
3、對稱密鑰加密:通過使用某種共享密鑰對交換參數進行對稱加密,實現交換的鑒別。
