密鑰交換算法: 迪菲-赫爾曼算法

概述

迪菲-赫爾曼算法用於通信雙方交換密鑰. 還記得之前介紹HTTPS協議的時候, 提到需要先通過對方公鑰來進行密鑰的交換, 然後再通過密鑰對通信內容進行加密. 迪菲-赫爾曼算法就是用於交換密鑰的. . 此算法與非對稱加密算法不同哦.

OK, 一起來看看吧.

引入

在正式介紹迪菲-赫爾曼算法之前, 先簡單跟我思考下面場景.

現場有你, 小王和小李三個人, 你和小王之間需要建立一個共享密鑰, 但是, 你們不能交頭接耳, 你們之間說的話小李都能聽到. 那麼, 有什麼辦法能夠建立共享密鑰而不讓小李知道呢? 現在開始, 跟着思路走一下.

我們假設以下的計算只有乘法沒有除法, 即乘法是不可逆的(這裏爲了簡單說明, 在後面會出現真正不可逆的函數)

第一步

你和小王都在心裏默默的選擇一個只有自己知道的數字, 比如: 你選了8, 小王選了3.

image-20200503200946928

第二步

小王宣佈一個公共數字, 當然, 這個數字也是他選的. 這個數字就暫定是5.

image-20200503201030371

第三步

你和小王分別用私人數字與公共數字相乘, 得到新的私人-公共數字

image-20200503201311917

第四步

你和小王分別將對方的 私人-公共數字 與自己的私人數字相乘, 得到的結果就是你們之間的共享密鑰: 120.

image-20200503201521952

最終來判斷一下, 在這個過程中, 小李有沒有可能拿到這個共享密鑰: 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

能看得出來很多哈. 重複一下上面的交換步驟, 開始嘗試建立公共密鑰

第一步

選擇自己的私人數字.

image-20200503204155129

第二步

公佈公共數字, 這裏公共數字需要兩個, 一個數字是鐘的大小, 一個數字是求冪的基數.

image-20200503205220865

第三步

雙方公佈自己計算後的數字

image-20200503205130588

第四步

混合得到共享密鑰. 將對方的 公共-私人數字 爲基數, 自己的私人數字爲指數, 計算並和鍾大小取模, 得出最終的共享密鑰

image-20200503205038362

OK, 至此, 密鑰交換成功. 當然, 通過窮舉的方法還是可以得到共享密鑰. 例子中的數字爲方便計算, 都很小. 但是, 現實使用中, 鍾大小如果有幾百位的數字呢?

對於數字的選擇有個小小的限制:

  1. 鍾大小的選擇必須是一個素數(我也不知道爲啥).

  2. 上面選取的基數2, 只能取到鐘上的數字4和8. 現實中基數一般選取鍾大小的本原根(我也不知道爲啥叫這名). 比如2是11的本原根.(2^1%11 ... 2^10%11 的值分別爲: 2,4,8,5,10,9,7,3,6,1. 涵蓋了11的所有值. )

對了, 這個計算規則叫做離散對數, 名字不重要, 知道怎麼回事就行了.

以上...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章