1. 程式人生 > >Diffie-Hellman密鑰交換

Diffie-Hellman密鑰交換

密鑰 man uri dtp noi napt dig 算法 sdg

Diffie-Hellman密鑰交換

加密過程

有全局兩個公開的參數:

p,g
p是一個大素數,g是p的一個本原根  

現在有Alice和Bob兩個人要交換密鑰。

① Alice選定一個小於p的數a作為Alice私鑰,並且計算Alice的公鑰A=g^a mod p,公開Alice的公鑰A
② 與此同時Bob選定一個小於p的數b作為Bob私鑰,並且計算Bob的公鑰B=g^b mod p,公開Bob的公鑰B
③ Alice獲得Bob的公鑰B後,計算共享的私鑰s=B^a mod p
④ Bob獲得Alice的公鑰A後,計算共享的私鑰s=A^b mod p
⑤ 推導:s=A^b mod p=(g^a mod p)^b mod p=g^ab mod p

公式推導後,兩人計算的s是相等的,並且雙方各自的私鑰沒有被泄露,就協商出了共享的私鑰。

攻擊方法

1.假設Eve為攻擊者,Eve能夠截取A發往B的數據包(包括A和B公鑰)

Eve可以獲取p,g,A,B
Eve可以自己選定個私鑰c,並且公布公鑰C
Eve攔截alice和bob之間的信息,偽造數據並且互相轉發,這樣A實際和C通信,但是A認為是和B通信。B也這麽認為,這樣就控制了Alice和Bob之間的通信。  

2.解密通信過程中數據
這裏以安恒月賽的一個題目為例子:


Alice和Bob正在進行通信,作為中間人的Eve一直在竊聽他們兩人的通信。

Eve竊聽到這樣一段內容,主要內容如下:
p = 37
A = 17
B = 31

U2FsdGVkX1+mrbv3nUfzAjMY1kzM5P7ok/TzFCTFGs7ivutKLBLGbZxOfFebNdb2
l7V38e7I2ywU+BW/2dOTWIWnubAzhMN+jzlqbX6dD1rmGEd21sEAp40IQXmN/Y0O
K4nCu4xEuJsNsTJZhk50NaPTDk7J7J+wBsScdV0fIfe23pRg58qzdVljCOzosb62
7oPwxidBEPuxs4WYehm+15zjw2cw03qeOyaXnH/yeqytKUxKqe2L5fytlr6FybZw
HkYlPZ7JarNOIhO2OP3n53OZ1zFhwzTvjf7MVPsTAnZYc+OF2tqJS5mgWkWXnPal
+A2lWQgmVxCsjl1DLkQiWy+bFY3W/X59QZ1GEQFY1xqUFA4xCPkUgB+G6AC8DTpK
ix5+Grt91ie09Ye/SgBliKdt5BdPZplp0oJWdS8Iy0bqfF7voKX3VgTwRaCENgXl
VwhPEOslBJRh6Pk0cA0kUzyOQ+xFh82YTrNBX6xtucMhfoenc2XDCLp+qGVW9Kj6
m5lSYiFFd0E=

分析得知,他們是在公共信道上交換加密密鑰,共同建立共享密鑰。

而上面這段密文是Alice和Bob使用自己的密值和共享秘鑰,組成一串字符的md5值的前16位字符作為密碼使用另外一種加密算法加密明文得到的。

例如Alice的密值為3,Bob的密值為6,共享秘鑰為35,那麽密碼為:

password = hashlib.md5("(3,6,35)").hexdigest()[0:16]


解密過程:

① 第一步是獲取共享密鑰,題目中給出的參數p,A,B。
② p=37,計算p的本原根=2  
③ 計算a,17=2^a mod 37,a=7
④ 計算b,31=2^b mod 37,b=9
⑤ 計算s=g^ab mod p=6
⑥ 計算password = hashlib.md5("(7,9,6)").hexdigest()[0:16]=a7ece9d133c9ec03

猜測password為密文的密鑰,密文的加密方式未知,挨個嘗試:

https://www.alpertron.com.ar/DILOG.HTM

技術分享圖片

Diffie-Hellman密鑰交換