DH金鑰交換(Diffie–Hellman key exchange)演算法筆記
下文中^代表乘方運算,例如2^3=2*2*2=6,參考:http://zh.wikipedia.org/wiki/%E5%86%AA
%代表模運算,例如5%3=2,參考:http://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4
DH金鑰交換演算法的作用是使通訊雙方可以在不安全的通道中建立一個相同的金鑰,用於加密通訊。
基本原理示例:
1、通訊方A和通訊方B約定一個初始數g,g是公開的,如g=5
2、A生成一個隨機數a,a是保密的,如a=6
3、A計算g^a傳送給B,g^a=5^6
4、B生成一個隨機數b,b是保密的,如b=15
5、B計算g^b傳送給A,g^b=5^15
6、A接收到g^b後,再使用保密的a,計算(g^b)^a=g^(a*b)=5^(6*15)
7、B接收到g^a後,再使用保密的b,計算(g^a)^b=g^(a*b)=5^(6*15)
8、這樣通訊方A和B得到一個相同的“金鑰”g^(a*b)=5^(6*15)
整個通訊過程中g、g^a、g^b是公開的,但由於g、a、b都是整數,通過g和g^a得到a還是比較容易的,b也是如此,所以最終的“金鑰”g^(a*b)還是可以被計算出來的。所以實際的過程還需要在基本原理上加入新的計算——模運算:
1、通訊方A和通訊方B約定一個初始數g,如g=5,一個質數p,如p=23,g和p是公開的
2、A生成一個隨機數a,a是保密的,如a=6
3、A計算g^a%p傳送給B,g^a%p=5^6%23=8
4、B生成一個隨機數b,b是保密的,如b=15
5、B計算g^b%p傳送給A,g^b%p=5^15%23=19
6、A接收到g^b%p後,再使用保密的a,計算(g^b%p)^a%p=19^6%23=2
7、B接收到g^a%p後,再使用保密的b,計算(g^a%p)^b%p=8^15%23=2
8、這樣通訊方A和B得到一個相同的金鑰:2
(g^b%p)^a%p=(g^a%p)^b%p的證明:
如果a=2:
(g^b%p)^a%p=(g^b%p)^2%p=(g^b-n*p)^2%p=(g^(2*b)-2*g^b*n*p+(n*p)^2)%p=g^(2*b)%p
可以看出(g^b-n*p)^2展開後除g^(2*b)外,其它都是p的倍數,所以整個算式的結果是g^(2*b)%p
同理對(g^b-n*p)^a展開後除g^(a*b)外,其它都是p的倍數,所以整個算式的結果是g^(a*b)%p
同樣可以得出(g^a%p)^b%p=g^(a*b)%p
所以(g^b%p)^a%p=(g^a%p)^b%p
整個通訊過程中g、p、g^a%p、g^b%p是公開的,這時通過g、p、g^a%p得到a比較難,同樣通過g、p、g^b%p得到b比較難,所以最終的金鑰是比較安全的。
以g=5、p=23、g^a%p=8計算a為例,a=log(5, (8+23*n)),這個只能將n的可能值逐個帶入公式試驗才能得到a的值。如果a、p是比較大的數那麼計算更加困難。
如果注意的是,為了防止應用優化演算法計算上述問題,質數p不是隨便選擇的,需要符合一定的條件。隨機數a、b的生成演算法也必需注意,應使結果儘可能隨機,不能出現可預測的規律,否則會使破解變的容易。
通過上述計算過程也可以看出DH演算法不僅可以應用在2方通訊的情況,如果多方通訊,也可以使用該演算法。
DH金鑰交換演算法無法驗證對方身份,所以DH金鑰交換演算法不能抵禦中間人攻擊(MITM,Man-in-the-middle attack)。
參考:
wiki: http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
相關文章
- Diffie-Hellman金鑰協商演算法演算法
- 圖解 ECDHE 金鑰交換演算法圖解演算法
- Nodejs進階:使用DiffieHellman金鑰交換演算法NodeJS演算法
- SSH-keygen rsa 金鑰對根據私鑰生成公鑰
- git如何生成ssh金鑰 git生成配置ssh金鑰key詳細步驟Git
- FFmpeg開發筆記(五)更新MSYS的金鑰環筆記
- 3.2 公開金鑰演算法演算法
- KeyShot 12破解版中文「KeyShot啟用金鑰補丁」
- 比特幣學習筆記——————4、金鑰、地址、錢包比特幣筆記
- Codeigniter 利用加密Key(金鑰)的物件注入漏洞加密物件
- Android facebook KeyHash生成(生成釋出金鑰雜湊)Android
- 公開金鑰演算法-RSA-note演算法
- 什麼是私有金鑰密碼技術——金鑰加密演算法採用同一把金鑰進行加密和解密密碼加密演算法解密
- oracle分割槽交換(exchange)技術Oracle
- 金鑰,私鑰,公鑰的區分
- keytool 錯誤: java.lang.Exception: 金鑰庫檔案不存在: keystoreJavaException
- office產品金鑰大全 office產品金鑰分享
- KeyShot 2023 Pro啟用安裝包+KeyShot Pro12破解金鑰
- Win10如何更改金鑰 Win10電腦金鑰過期修改金鑰的方法Win10
- bitlocker如何恢復金鑰 bitlocker恢復金鑰的方法
- bandizip註冊產品金鑰 bandizip金鑰使用步驟
- oracle 隱式金鑰Oracle
- apt-key 金鑰管理,apt-secure 原理 驗證鏈 驗證測試APT
- git生成ssh金鑰詳細步驟 git如何生成ssh金鑰Git
- server2003安裝金鑰 server金鑰序列號Server
- AIX培訓筆記——交換空間AI筆記
- GPG 的基礎使用:交換公鑰
- bitlocker恢復金鑰在哪裡 bitlocker恢復金鑰找回方法介紹
- vmware16許可證金鑰 vmware16金鑰安裝教程
- vmware workstation pro金鑰許可證分享 vmware workstation pro金鑰使用教程
- Keys for graphs閱讀筆記筆記
- gitlab配置ssh金鑰Gitlab
- Java安全——金鑰那些事Java
- 使用exchange partition來交換不同schema之間的表
- exchange partition 交換的問題ORA-14130:
- vmware workstation pro許可證金鑰大全 vmware所有版本許可證金鑰
- 密碼學系列之:blowfish對稱金鑰分組演算法密碼學演算法
- 密碼學系列之:twofish對稱金鑰分組演算法密碼學演算法