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演算法
- ECDH秘鑰交換演算法——使用流程演算法
- oracle分割槽交換(exchange)技術Oracle
- git如何生成ssh金鑰 git生成配置ssh金鑰key詳細步驟Git
- Codeigniter 利用加密Key(金鑰)的物件注入漏洞加密物件
- JSON筆記,用於資料交換JSON筆記
- Java交換map的key和value值Java
- GPG 的基礎使用:交換公鑰
- RabbitMQ系列(三)RabbitMQ交換器Exchange介紹與實踐MQ
- 上手了RabbitMQ?再來看看它的交換機(Exchange)吧MQ
- 比特幣學習筆記——————4、金鑰、地址、錢包比特幣筆記
- FFmpeg開發筆記(五)更新MSYS的金鑰環筆記
- C#和JAVA的RSA金鑰、公鑰轉換C#Java
- 3.2 公開金鑰演算法演算法
- [我是傻X] 記錄一次 Git 更換倉庫更換金鑰Git
- 公開金鑰演算法-RSA-note演算法
- office 2010 金鑰 office 2010永久的金鑰
- vmware金鑰最新版 vmware金鑰大全
- 金鑰,私鑰,公鑰的區分
- C# Rsa加密(私鑰加密、公鑰解密、金鑰格式轉換、支援超大長度分段加密)C#加密解密
- HarmonyOS Next 金鑰轉換技巧:提升加解密靈活性解密
- apt-key 金鑰管理,apt-secure 原理 驗證鏈 驗證測試APT
- 如何使用 Putty 以金鑰 private key 的方式登入騰訊雲主機
- server2003安裝金鑰 server金鑰序列號Server
- office產品金鑰大全 office產品金鑰分享
- vs2015金鑰專業版企業版金鑰大全 visual studio產品金鑰2015
- Flutter學習筆記:Key的作用Flutter筆記
- bandizip註冊產品金鑰 bandizip金鑰使用步驟
- bitlocker如何恢復金鑰 bitlocker恢復金鑰的方法
- 1.1_3_1 電路交換、報文交換、分組交換
- 接入交換機、匯聚交換機、核心交換機的區別
- 【太極創客esp8266自學筆記】資料交換格式:JOSN筆記
- 橢圓曲線加密演算法中公鑰與私鑰互換性分析加密演算法
- 本地金鑰的安全
- oracle 隱式金鑰Oracle
- gitlab配置ssh金鑰Gitlab
- 生成RSA金鑰對