概述
迪菲-赫爾曼算法用於通信雙方交換密鑰. 還記得之前介紹HTTPS協議的時候, 提到需要先通過對方公鑰來進行密鑰的交換, 然後再通過密鑰對通信內容進行加密. 迪菲-赫爾曼算法就是用於交換密鑰的. . 此算法與非對稱加密算法不同哦.
OK, 一起來看看吧.
引入
在正式介紹迪菲-赫爾曼算法之前, 先簡單跟我思考下面場景.
現場有你, 小王和小李三個人, 你和小王之間需要建立一個共享密鑰, 但是, 你們不能交頭接耳, 你們之間說的話小李都能聽到. 那麼, 有什麼辦法能夠建立共享密鑰而不讓小李知道呢? 現在開始, 跟着思路走一下.
我們假設以下的計算只有乘法沒有除法, 即乘法是不可逆的(這裏爲了簡單說明, 在後面會出現真正不可逆的函數)
第一步
你和小王都在心裏默默的選擇一個只有自己知道的數字, 比如: 你選了8, 小王選了3.
第二步
小王宣佈一個公共數字, 當然, 這個數字也是他選的. 這個數字就暫定是5.
第三步
你和小王分別用私人數字與公共數字相乘, 得到新的私人-公共數字
第四步
你和小王分別將對方的 私人-公共數字 與自己的私人數字相乘, 得到的結果就是你們之間的共享密鑰: 120.
最終來判斷一下, 在這個過程中, 小李有沒有可能拿到這個共享密鑰: 120. 小李知道的所有信息是, 公共數字7以及你們的 私人-公共數字. (別忘了我們的假設, 沒有除法). 顯然, 僅憑乘法是得不出的.
那麼現在問題來了, 這個不可逆的算法在哪?他在哪???
正式應用
他來了, 他來了, 他來了. 這個不可逆的算法來了.
有這樣的一種運算, 將一個數字與n取模得出最終的數, 被稱爲鍾運算. 想象一下一個時鐘, 13點就是1點. 嗯, 就是這樣.
計算一個指數並將結果與鐘的大小取模, 這個過程就是下面的計算了. 例如, 如果鐘的大小是12, 基數是2, 則計算公式是: 2^8%12=256%12=4.
問題, 只告訴你數字12, 2和4, 你能算出數字8麼? 不能, 因爲可能性太多了. 簡單窮舉一下:
- 2^2%12 => 4
- 2^3%12 => 8
- 2^4%12 => 4
- 2^5%12 => 8
- 2^6%12 => 4
能看得出來很多哈. 重複一下上面的交換步驟, 開始嘗試建立公共密鑰
第一步
選擇自己的私人數字.
第二步
公佈公共數字, 這裏公共數字需要兩個, 一個數字是鐘的大小, 一個數字是求冪的基數.
第三步
雙方公佈自己計算後的數字
第四步
混合得到共享密鑰. 將對方的 公共-私人數字 爲基數, 自己的私人數字爲指數, 計算並和鍾大小取模, 得出最終的共享密鑰
OK, 至此, 密鑰交換成功. 當然, 通過窮舉的方法還是可以得到共享密鑰. 例子中的數字爲方便計算, 都很小. 但是, 現實使用中, 鍾大小如果有幾百位的數字呢?
對於數字的選擇有個小小的限制:
-
鍾大小的選擇必須是一個素數(我也不知道爲啥).
-
上面選取的基數2, 只能取到鐘上的數字4和8. 現實中基數一般選取鍾大小的本原根(我也不知道爲啥叫這名). 比如2是11的本原根.(2^1%11 ... 2^10%11 的值分別爲: 2,4,8,5,10,9,7,3,6,1. 涵蓋了11的所有值. )
對了, 這個計算規則叫做離散對數, 名字不重要, 知道怎麼回事就行了.
以上...