密钥交换算法: 迪菲-赫尔曼算法
概述
迪菲-赫爾曼算法用于通信雙方交換密鑰. 還記得之前介紹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的所有值. )
對了, 這個計算規則叫做離散對數, 名字不重要, 知道怎么回事就行了.
以上...
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的密钥交换算法: 迪菲-赫尔曼算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android日期选择滚轮框架,GitH
- 下一篇: php连接数据库返回数据类型,php从数