Diffie Hellman金鑰交換演算法

2021-10-01 17:33:28 字數 3232 閱讀 6552

何為dh金鑰間換協議?

dh金鑰交換是2023年由diffie和hellman共同發明的一種演算法。使用這種演算法,通訊雙方僅通過交換一些可以公開的資訊就能夠生成出共享的密碼數字,而這一密碼數字就可以被用作對稱密碼的金鑰。ipsec中就使用了經過改良的dh金鑰交換。

雖然這種方法的名字叫「金鑰交換」,但實際上雙方並沒有真正交換金鑰,而是通過計算生成出乙個相同的共享金鑰。因此,這種方法也稱dh金鑰協商。

dh內容

dh協議內容如下:

這樣就實現了金鑰的交換,互相可以計算出會話金鑰。

#!/usr/bin/python3.7

# -*- coding: utf-8 -*-

# @time : 2019/12/25 17:01

# @author : systemdefenser

# @email : [email protected]

# @software: pycharm

from random import randrange, choice

# 判斷素數

defjudgeprimenumber

(num)

:# 不能被2~sqrt(m)(取整)之間的整數整除的數即素數

sqrtresult =

int(num **

0.5)

for i in

range(2

, sqrtresult +1)

:if num % i ==0:

return

false

return

true

# 判斷互質

defjudgecoprime

(a, b)

:# 求最大公因數

defmaxcommonfactor

(m, n)

: result =

0while m % n >0:

result = m % n

m = n

n = result

return result

if maxcommonfactor(a, b)==1

:return

true

return

false

# 求所有本原根

defgetprimitiveroot

(primenumber)

: primelist =

primitiverootlist =

# 求出所有互素元素

for i in

range(1

, primenumber)

:if judgecoprime(i, primenumber)

:for i in primelist:

tmplist =

for j in

range(1

,len

(primelist)+1

):# 排序判斷是否相同,相同則為

tmplist.sort(

)if primelist == tmplist:

return primitiverootlist

# 產生公鑰

defcreatepubkey

(primenumber, primitiveroot, randnum1, randnum2)

: pubkey1 = primitiveroot ** randnum1 % primenumber

pubkey2 = primitiveroot ** randnum2 % primenumber

return pubkey1, pubkey2

# 得到會話金鑰

defcreatesubkey

(primenumber, pubkey1, pubkey2, randnum1, randnum2)

: subkey1 = pubkey2 ** randnum1 % primenumber

subkey2 = pubkey1 ** randnum2 % primenumber

return subkey1, subkey2

if __name__ ==

"__main__"

:print

("—————diffie-hellman金鑰交換—————"

)while

true

: primenumber =

int(

input

("輸入共同素數:"))

if judgeprimenumber(primenumber)

:break

# 兩個隨機數

randnum1 = randrange(primenumber)

randnum2 = randrange(primenumber)

print

("a隨機數:"

, randnum1,

"\nb隨機數:"

, randnum2)

# 挑選乙個本原根

primitiverootlist = getprimitiveroot(primenumber)

primitiveroot = choice(primitiverootlist)

print

("所有本原根:"

, primitiverootlist)

print

("本次的本原根:"

, primitiveroot)

# 雙方公鑰和會話金鑰

pubkey1, pubkey2 = createpubkey(primenumber, primitiveroot, randnum1, randnum2)

print

("a公鑰:"

, pubkey1,

"\nb公鑰:"

, pubkey2)

subkey1, subkey2 = createsubkey(primenumber, pubkey1, pubkey2, randnum1, randnum2)

if subkey1 == subkey2:

# 必然成立

print

("ab共同會話金鑰:"

, subkey1)

執行結果:

Diffie Hellman金鑰交換

最近在看網課的時候了解了diffie hellman金鑰交換演算法,這裡記錄下來。在公共網路中傳輸資料,很容易被第三方擷取。為了加強資料安全需要使用加密演算法。dh金鑰就是其中一種。dh金鑰就是很好的一種演算法是一種安全協議。能允許雙方在不安全的通道上建立只有彼此知曉的金鑰,其他人即使能看到傳輸的資...

Diffie Hellman金鑰交換

diffie hellman金鑰交換 dhke 是由whitfield diffie和martin hellman在1976年提出的。金鑰交換方案提供了實際中金鑰分配問題的解決方案,即允許雙方通過不安全的通道進行交流獲得乙個共同金鑰。許多公開和商業密碼協議中都實現了這種基本的金鑰協議技術,比如安全外...

Diffie Hellman 金鑰交換協議

設p 是乙個素數,gf p 上的離散對數是困難的,設 g為其生成元,為達到通訊雙方共享金鑰的目的,通訊雙方a和 b分別進行如下操作。1 a 進行如下兩步操作 隨機選取乙個整數 xa,0 xa 計算ya gxa mod p,將ya 傳送給b 2 b進行如下兩步操作 隨機選取乙個整數xb,0 xb傳送給...