DH金鑰交換演算法

2021-10-24 17:48:43 字數 3730 閱讀 7389

whitfield diffie與martin hellman在2023年提出了乙個奇妙的金鑰交換協議,稱為diffie-hellman金鑰交換協議/演算法(diffie-hellman key exchange/agreement algorithm)。這個機制的巧妙在於需要安全通訊的雙方可以用這個方法確定對稱金鑰。然後可以用這個金鑰進行加密和解密。但是注意,這個金鑰交換協議/演算法只能用於金鑰的交換,而不能進行訊息的加密和解密。雙方確定要用的金鑰後,要使用其他對稱金鑰操作加密演算法實現加密和解密訊息。

實現

dh演算法解決了金鑰在雙方不直接傳遞金鑰的情況下完成金鑰交換,這個神奇的交換原理完全由數學理論支援。我們來看dh演算法交換金鑰的步驟。假設甲乙雙方需要傳遞金鑰,他們之間可以這麼做:

甲首選選擇乙個素數p,例如509,底數g,任選,例如5,隨機數a,例如123,然後計算a=g^a mod p,結果是215,然後,甲傳送p=509g=5a=215給乙;

乙方收到後,也選擇乙個隨機數b,例如,456,然後計算b=g^b mod p,結果是181,乙再同時計算sa=a^b mod p,結果是121;

乙把計算的b=181發給甲,甲計算sb=b^a mod p的餘數,計算結果與乙算出的結果一樣,都是121。

所以最終雙方協商出的金鑰sa=sb是121。注意到這個金鑰sa或sb並沒有在網路上傳輸。而通過網路傳輸的pgab是無法推算出sa、sb的,因為實際演算法選擇的素數是非常大的例如(7000487615661733、5925845745820835 等)。所以,更確切地說,dh演算法是乙個金鑰協商演算法,雙方最終協商出乙個共同的金鑰,而這個金鑰不會通過網路傳輸。

圖例

設想這樣乙個場景,alice(a)和bob(b),他們想在不見面的情況下秘密約定出一種顏色,但他們互相溝通的資訊都會被公開,應該怎麼辦呢?

alice

bob私密資訊

公開資訊

公開資訊

私密資訊

a和b首先約定好公開的一種顏色,比如黃色

a,b各自挑選出一種私密的顏色,比如橙色和蘭色

a,b各自將兩種顏色混合起來

雙方交換混合後的顏色

a,b各自將自己的私密顏色再次混入得到的顏色中

現在a,b得到了一種相同的顏色,這種顏色是由乙份黃色、乙份橙色、乙份蘭色混合而來,但外界無法得知

go示例

go

package game

import (

"fmt"

"math/big"

"testing"

)// dh金鑰協商演算法

func testdh(t *testing.t)

// 最終sa=sb,完成金鑰協商

key := byte(sa.string())

// 將16位key拼接成32位key

// 先aes加密

encrypt,_ := aesencrypt(byte("123456"), key)

// 再異或運算加密

for i,item := range encrypt

fmt.println("encrypt:", encrypt)

// 先異或運算解密

for i,item := range encrypt

// 再aes解密

decrypt,_ := aesdecrypt(encrypt, key)

fmt.println("decrypt:", string(decrypt))

}

秘密在於,顏色混合是一種「不可逆」的操作,當雙方交換顏色時,儘管我們知道他們交換的顏色都是由乙份黃色和另乙份其他顏色混合得到的,但我們還是無法或者很難得到他們的私密顏色。而dh秘鑰交換的原理非常相似,也是利用了數學上的乙個「不可逆」的運算,就是離散對數(discrete logarithm)

dh金鑰協商和rsa加密演算法的比較

首先說明:rsa和dh實際上根本不是一回事

rsa是公鑰加密演算法,也就是非對稱密碼演算法,一般情況下的使用流程是這樣的:

dh是金鑰交換協議,一般情況下的使用流程是這樣的:

總結一下,區別主要是:

rsa是用來加密解密的,dh是用來協商創造金鑰的,

rsa可以用來傳遞資訊,dh是用來傳遞金鑰的,想要傳遞資訊還需要借助別的加密方式。

使用rsa進行資訊傳輸是非對稱密碼體系,使用dh進行金鑰交換的下一步使用的一般是對稱的密碼體系

使用rsa加密和解密所使用的金鑰是不一樣的,前者叫公鑰後者叫私鑰,公鑰用於加密私鑰用於解密,並且不可逆向,也就是不能用私鑰加密公鑰解密。如果a和b想進行通訊的話,需要兩套(4個)金鑰。而dh交換得到的金鑰則一般是用於對稱加密的,也就是加密和加密使用的是同乙個密碼,進行通訊只需要乙個金鑰即可。

然後解釋一下,如何用rsa做金鑰協商(金鑰交換)

實際上可以模擬成下面的情況:a想和b進行金鑰交換,獲得乙個新的金鑰,於是a就通過b的公鑰加密了乙個金鑰k(此處的金鑰相當於原文),然後將生成的密文發給b。b接到了這個密文之後使用自己的私鑰解密獲得金鑰k。於是雙方就可以愉快的使用這個k來進行後面的加密了~

這就是最簡單的rsa金鑰交換模型了。實際上考慮到前面提到的中間人攻擊的問題,因此a往往需要同時加上自己的身份認證資訊。同時有些複雜點兒的情況下可能還需要b通過a的公鑰傳送一系列的確認資訊。

因此rsa做金鑰協商(金鑰交換)時和dh的從原理上而言是有著非常大的差距的。

DH金鑰交換演算法

迪菲 赫爾曼金鑰交換 diffie hellman key exchange,簡稱 d h 是一種安全協議。它可以讓雙方在完全沒有對方任何預先資訊的條件下通過不安全通道建立起乙個金鑰。這個金鑰可以在後續的通訊中作為對稱金鑰來加密通訊內容。1 演算法描述 離散對數的概念 原根 如果a是素數p 的乙個原...

DH金鑰交換演算法

迪菲 赫爾曼金鑰交換 diffie hellman key exchange,簡稱 d h 是一種安全協議。它可以讓雙方在完全沒有對方任何預先資訊的條件下通過不安全通道建立起乙個金鑰。這個金鑰可以在後續的通訊中作為對稱金鑰來加密通訊內容。1 演算法描述 離散對數的概念 原根 如果a是素數p的乙個原根...

DH金鑰交換演算法

迪菲 赫爾曼金鑰交換 diffie hellman key exchange,簡稱 d h 是一種安全協議。它可以讓雙方在完全沒有對方任何預先資訊的條件下通過不安全通道建立起乙個金鑰。這個金鑰可以在後續的通訊中作為對稱金鑰來加密通訊內容。1 演算法描述 離散對數的概念 原根 如果a是素數p的乙個原根...