密鑰交換/協商機制的幾種類型
依靠非對稱加密算法
原理:拿到公鑰的一方先生成隨機的會話密鑰,然后利用公鑰加密它;再把加密結果發給對方,對方用私鑰解密;於是雙方都得到了會話密鑰。
舉例:RSA
依靠專門的密鑰交換算法
原理:見下圖
舉例:DH 算法及其變種(ECDH算法)
DH算法
DH算法解決了密鑰在雙方不直接傳遞密鑰的情況下完成密鑰交換,這個神奇的交換原理完全由數學理論支持
1. Alice選擇1個素數p,比如509,底數g 比如5,隨機數a比如123
然后計算 然后計算A=g^a mod p=bcmod(bcpow(5,123),509)=215
Alice現在有[p=509,g=5,a=123,A=215], 把p,g,A發送給Bob
2. Bob收到p=509,g=5后,選擇一個隨機數b=456
計算 B=g^b mod p=bcmod(bcpow(5,456),509)=181
同時計算s=A^b mod p=bcmod(bcpow(215,456),509)=121
Bob現在有[p=509,g=5,b=456,B=181,s=121,A=125]
Bob把B=181發送給Alice
3.
Alice現在有[p,g,a,A,B]
Alice計算s=B^a mod p=bcmod(bcpow(181,123),509)=121
所以最終雙方協商出的密鑰s是121。注意到這個密鑰s並沒有在網絡上傳輸。而通過網絡傳輸的p,g,A和B是無法推算出s的,因為實際算法選擇的素數是非常大的。
所以,更確切地說,DH算法是一個密鑰協商算法,雙方最終協商出一個共同的密鑰,而這個密鑰不會通過網絡傳輸。
如果我們把a看成甲的私鑰,A看成甲的公鑰,b看成乙的私鑰,B看成乙的公鑰,DH算法的本質就是雙方各自生成自己的私鑰和公鑰,私鑰僅對自己可見,然后交換公鑰,並根據自己的私鑰和對方的公鑰,生成最終的密鑰secretKey,DH算法通過數學定律保證了雙方各自計算出的secretKey是相同的
但是DH算法並未解決中間人攻擊,即甲乙雙方並不能確保與自己通信的是否真的是對方。消除中間人攻擊需要其他方法
- DH算法是一種密鑰交換協議,通信雙方通過不安全的信道協商密鑰,然后進行對稱加密傳輸。
- DH算法沒有解決中間人攻擊。
但是 DH 算法本身也有缺點——它不支持認證。
也就是說:它雖然可以對抗“偷窺”,卻無法對抗“篡改”,自然也就無法對抗“中間人攻擊/MITM”(缺乏身份認證,【必定會】遭到“中間人攻擊/MITM”)
ECDHE
-
1.客戶端隨機生成隨機值
Ra
計算Pa(x, y) = Ra * Q(x, y)
,
Q(x, y)
為全世界公認的某個橢圓曲線算法的基點
將Pa(x, y)發送至服務器 -
2.服務器隨機生成隨機值
Rb
計算Pb(x,y) = Rb * Q(x, y)
將Pb(x,y)
發送至客戶端 -
3.客戶端計算
Sa(x,y) = Ra * Pb(x,y)
服務器計算Sb(x,y) = Rb *Pa(x,y)
-
4.算法保證了
Sa = Sb = S
,提取其中的S的x向量作為密鑰(預主密鑰)