Diffie-Hellman算法,簡稱DH算法,由W.Diffie和M.E.Hellman在1976年公布的一種密鑰一致性算法,該算法是一種建立密鑰的方法,並非加密方法,但其產生的密鑰可用於加密、密鑰管理或任何其它的加密方式,這種密鑰交換技術的目的在於使兩個用戶間能安全地交換密鑰(KEY)以便用於今後的報文加密。該算法需要公開兩個參數:質數 n 和其原根 g,同時通信雙方 A 和 B 隨機選擇自己的私鑰 x 和 y,通過交換
mod n 和
mod n 後,它們就可以生成兩者之間的會話密鑰了。DH算法對公開密鑰密碼編碼學產生了深遠的影響。DH算法是一種確保共享KEY安全穿越網路的方法。
算法描述
離散對數:定義素數p的原始根是能生成1-(p-1)之間所有數的一個數,設a為p的原始根,則:a mod p,
mod p,…,
mod p是各不相同的整數,且以某種排列方式組成了從1到p-1的所有整數。對於任意數b及素數p的原始根a,可以找到一個唯一的指數i,滿足:b=
編程思路:輸入一個素數和它的一個原始根,生成小於此素數的一個隨機數,計算出用戶的公鑰,保存信息。然後再輸入對方的公鑰,計算出雙方的會話密鑰。核心代碼如圖2所示,程式在Windows XP作業系統下,Visual C++ 2012環境中編譯通過。
圖2 Diffie-Hellman算法的C++編程核心代碼
計算方法
儘管Diffie-Hellman算法十分巧妙,但它也存在一個問題:當B得到一個三元組(n,g,
mod n)時,他怎么知道這是來自於A而不是網路攻擊者C呢?他無法知道。不幸的是,C可以利用這一點來欺騙A和B,如圖3所示。當A和B分別選擇X和Y時,C也選擇了自己的隨機數Z並計算Z=
mod n。
(1)A傳送X=
mod n給B,C截獲了這條訊息。
(2)C傳送Z=
mod n給B,代替A的訊息。
(3)C傳送Z=
mod n給A,代替B的訊息。
(4)B傳送Y=
mod n給A,C截獲了這條訊息並保存起來。
現在每個人都進行取模計算。A計算出的密鑰是
mod n,C也是(從發往A的訊息可知)。B計算出的密鑰是
mod n,C也是(從發往B的訊息可知)。A認為她與B通話,因此她建立了一個會話密鑰(和C),B也是一樣。A傳送的所有加密信息都被C截獲,存儲。他還可以任意修改信息,然後可以傳送給B。在另一方向也是這樣,C了解一切並能夠任意修改訊息,而A和B卻被假象所迷惑,他們以為雙方已擁有了一條安全的信息通道。即使事後A和B知道有人攻擊,但也無法確定是誰,因為網路上的任何人都可以發起中間人攻擊。