Diffie-Hellman金鑰協商演算法

Rookie丶flying發表於2020-06-03

概述

DH演算法是非對稱加密演算法的鼻祖,為非對稱加密演算法奠定了基礎,主要用途是進行金鑰交換確保共享的金鑰能夠安全穿越不安全的網路。該演算法其背後有對應數學理論做支撐,簡單來講就是構造一個複雜的計算難題,使得對該問題的求解在現實的時間內無法快速有效的求解(computationally infeasible )。

這個機制的巧妙在於需要安全通訊的雙方可以用這個方法確定對稱金鑰。然後可以用這個對稱金鑰進行加密和解密。但是注意,這個金鑰交換協議/演算法只能用於金鑰的交換,而不能進行訊息的加密和解密。之所以如此,主要還是由於對稱加密和非對稱加密演算法的特性決定的。

1. 對稱加密演算法和非對稱加密演算法

對稱加密演算法

雙方使用的同一個金鑰,既可以加密又可以解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。

優點:速度快,對稱性加密通常在訊息傳送方需要加密大量資料時使用,演算法公開、計算量小、加密速度快、加密效率高。

缺點:在資料傳送前,傳送方和接收方必須商定好祕鑰,然後 使雙方都能儲存好祕鑰。其次如果一方的祕鑰被洩露,那麼加密資訊也就不安全了。另外,每對使用者每次使用對稱加密演算法時,都需要使用其他人不知道的唯一祕鑰,這會使得收、發雙方所擁有的鑰匙數量巨大,金鑰管理成為雙方的負擔。

在對稱加密演算法中常用的演算法有:DES、AES等。

AES:金鑰的長度可以為128、192和256位,也就是16個位元組、24個位元組和32個位元組。

DES:金鑰的長度64位,8個位元組。

非對稱加密演算法

一對金鑰由公鑰和私鑰組成(可以使用很多對金鑰)。私鑰解密公鑰加密資料,公鑰解密私鑰加密資料(私鑰公鑰可以互相加密解密)。私鑰只能由一方保管,不能外洩。公鑰可以交給任何請求方。

優點:安全。

缺點:速度較慢。

在非對稱加密演算法中常用的演算法有: DH,RSA等。

兩者區別

  • 演算法複雜度:對稱金鑰<非對稱金鑰
  • 加解密速度:對稱金鑰>非對稱金鑰
  • 安全性:對稱金鑰<非對稱金鑰

對稱加密演算法相比非對稱加密演算法來說,加解密的效率要高得多。但是缺陷在於對於祕鑰的管理上,以及在非安全通道中通訊時,金鑰交換的安全性不能保障。所以在實際的網路環境中,會將兩者混合使用。因此 ,在https中(TLS\SSL)握手階段使用非對稱加密進行對稱金鑰的協商,而後在後續正常的資料傳輸時,都會使用對稱加密演算法進行加密傳輸。

數學基礎

本原根:如果使得 \(a^{m}\equiv 1\ \left( mod\ n \right)\) 成立的最小正冪 \(m\) 滿足 $m=\varphi \left( n \right) $ ,則稱 \(a\)\(n\) 的本原根。 其中 \(\varphi \left( n \right)\)尤拉函式

性質:若 \(a\) 為模 \(n\) 的本原根,則 \(a\)\(a\) 的平方,\(a\) 的3次方,……,\(a\)\(\varphi \left( n \right)\) 次m方 模 \(n\) 的餘數互不相同,而且構成一個模n的簡化剩餘系

栗子(原根):設 \(n=7\),則 \(\varphi \left( 7 \right) =7\times \left( 1-\frac{1}{7} \right) =6\)

  • \(n=2\) 時,我們需要找到一個 \(m\), 使得 \(2^m\%7=1\),且剛好 \(m==\varphi \left( 7 \right)\),首先我們能找到當 \(m=3\) 時,\(2^3\%7=1\),但是卻不等於 \(\varphi \left( 7 \right)\),因此不滿足。
  • \(n=3\)時,類比上面一點,可以發現 \(m=6\) 時,兩點都能滿足。因此 \(3\)\(7\) 的一個原根。

question:找了很多資料對原本根和原根的區別,還是很含糊!有大神的話,希望能教教我,感謝啦!

演算法流程及原理

假設Alice需要與Bob協商一個祕鑰(祕鑰本質上就是一個位元序列,從計算的角度看就是一個大數)。

  1. 首先Alice與Bob共享一個素數 \(p\) 以及該素數 \(p\) 的本原根 \(g\) (generator),且 \(2\le g\le p-1\)。這兩個數可以不經過加密的由一方傳送到另一方,至於誰傳送給誰並不重要,只要保證雙方都能知道 \(p\)\(g\) 即可。
image-20200602134459964
  1. 而後Alice產生一個私有的隨機數 \(A\),滿足 \(1\le A\le p-1\),然後計算 \(g^Amod\ p=Y_a\),將結果 \(Y_a\) 通過公網傳送給Bob; 與此同時,Bob也產生一個私有的隨機數 \(B\),滿足 \(1\le B\le p-1\),計算 \(g^Bmod\ p=Y_b\),再將結果 \(Y_b\) 通過公網傳送給Alice。
image-20200602172919933
  1. 此時Alice知道的資訊有\(p\),\(g\),\(A\),\(Y_a\),\(Y_b\),其中數字 \(A\) 是Alice私有的,只有她自己知道,其他的資訊都是別人可能知道的;同樣Bob知道的資訊有\(p\),\(g\),\(A\),\(Y_a\),\(Y_b\),其中數字 \(B\) 是Bob私有的,只有自己知道。

    到目前為止,Alice和Bob之間的金鑰協商結束。

    Alice通過計算 \(K_a=\left( Y_b \right) ^A\ mod\ p\) 得到金鑰 \(K_a\),同樣的,Bob通過計算 \(K_b=\left( Y_a \right) ^B\ mod\ p\) 得到金鑰 \(K_b\),可以證明,必然滿足 \(K_a=K_b\)。由此,Alice和Bob得到了相同的金鑰,達成了金鑰協商的目的。

    證明:\(K_a=K_b\)

    對於Alice有:

    \(K_a=\left( Y_b \right) ^Amod\ p=\left( g^Bmod\ p \right) ^A\ mod\ p=g^{B\times A}\ mod\ p\)

    對於Bob有:

    \(K_b=\left( Y_a \right) ^Bmod\ p=\left( g^Amod\ p \right) ^B\ mod\ p=g^{A\times B}\ mod\ p\)

    上面的運算過程,可根據取模運算的性質可得【a ^ b % p = ((a % p)^b) % p】,由上可得,Alice和Bob生成的金鑰其實是進行相同的運算過程,因此必然有 \(K_a=K_b\)

  2. 如果存在一個竊聽者Eve,他能否破解金鑰呢?很顯然Eve能夠竊聽到 \(p\),\(g\),\(Y_a\),\(Y_b\),所以問題轉變了,Eve能否根據這些資訊計算出 \(K_a\)\(K_b\) ?要計算 \(K_a\)\(K_b\) 需要知道A和B。

    以計算A為例,Eve能根據 \(p\),\(g\),\(Y_a\) 通過 \(g^Amod\ p=Y_a\) 計算出 \(A\) 嗎? 目前所知的最佳演算法Pollard's rho algorithm for logarithms 時間複雜度是 \(O\left( \sqrt{p} \right)\), 但是實際應用中的 \(p\) 為二進位制,假設這個 \(p\) 的長度為 \(n\), 這個複雜度實際上是 $O\left( 2^{\frac{n}{2}} \right) $,這個一個指數級的複雜度,是非常高的。因此求解該問題在計算上的困難程度保證了DH演算法的安全性。

安全性問題

那DH金鑰協商演算法是否就一定安全呢?我們所熟知的,存在一種偽裝者攻擊(中間人攻擊)能夠對這種金鑰協商演算法造成威脅。

假設金鑰協商過程中,在Alice和Bob有一個稱為Alan的主動攻擊者,他能夠截獲Alice和Bob的訊息並偽造假訊息,考慮以下情況。

  1. Alice和Bob已經共享一個素數 \(p\) 以及其該素數 \(p\) 的本原根 \(g\),當然Alan也監聽到報文得知了這個兩個訊息。
  2. 此時Alice計算 \(g^Amod\ p=Y_a\) ,然而將 \(Y_a\) 傳送給Bob的過程中被Alan攔截了,Alan自己選定了一個隨機數 \(C\), 計算 \(Y_c=g^C\ mod\ p\), 然後將 \(Y_c\) 傳送給Bob。
image-20200602211537321
  1. 同時Bob計算 \(g^Bmod\ p=Y_b\),同樣在將 \(Y_b\) 傳送給Alice的過程中被Alan攔截下來,Alan自己選定了一個隨機數D ,計算 \(g^Dmod\ p=Y_d\) 傳送給了Alice
image-20200602212249824
  1. 由於Alice和Bob通訊的訊息被替換,Alice計算出來的金鑰實際上為Alice和Alan之間協商的金鑰:\(K_{ad}=g^{D\times A}\ mod\ p\);Bob計算出來的金鑰實際上是Blob和Alan之間協商的金鑰:\(K_{bc}=g^{C\times B}\ mod\ p\) 。如果之後Alice和Bob用他們各自計算出來的金鑰加密任何資訊,Alan截獲之後都能夠解密得到明文,而Alan也能夠偽裝成Alice或者Bob給雙方發訊息,而不至於被發現。

程式碼為java實現。

參考

https://www.cnblogs.com/qcblog/p/9016704.html

https://www.cnblogs.com/wushaopei/p/11979200.html

https://blog.csdn.net/l18339702017/article/details/81625257

https://www.jiamisoft.com/blog/24603-dcfdcjm.html

相關文章