1.W.Diffie与M.Hellman在1976年提出一个称为Diffie-Hellman密钥交换的公钥密码算法。该算法能用来在两个用户之间安全地交换密钥材料,从而使双方得到一个共享的会话密钥,但该算法只能用于交换密钥,不能用于加/解密。
2.Diffie-Hellman密钥交换的安全性基于求解有限域上离散对数的困难性。首先,双方需要约定一个大素数p和它的一个本原根g,然后整个密钥交换的过程分两步完成:
3.Diffie-Hellman密钥交换算法的目的是使两个用户能安全交换密钥,以便在后续的通信中用该密钥对消息加密,算法的有效性建立在离散对数上,在计算离散对数是困难的才能确保秘密交换。其中在这次实验中了解到计算素数模的运算相对容易,计算离散对数却非常困难,而对大素数,求离散对数被认为是困难的,从而保证了Diffie-Hellman密钥交换的保密性。
4.代码实现
import math
import random
def judge_prime(p):
#素数的判断
if p <= 1:
return False
i = 2
while i * i <= p:
if p % i == 0:
return False
i += 1
return True
def get_generator(p):
#得到所有的原根
a = 2
list = []
while a < p:
flag = 1
while flag != p:
if (a ** flag) % p == 1:
break
flag += 1
if flag == (p - 1):
list.append(a)
a += 1
return list
#A,B得到各自的计算数
def get_calculation(p, a, X):
Y = (a ** X) % p
return Y
#A,B得到交换计算数后的密钥
def get_key(X, Y, p):
key = (Y ** X) % p
return key
if __name__ == "__main__":
#得到规定的素数
flag = False
while flag == False:
print('Please input your number(It must be a prime!): ', end = '')
p = input()
p = int(p)
flag = judge_prime(p)
print(str(p) + ' is a prime! ')
#得到素数的一个原根
list = get_generator(p)
print(str(p) + ' 的一个原根为:', end = '')
print(list[-1])
print('------------------------------------------------------------------------------')
#得到A的私钥
XA = random.randint(0, p-1)
print('A随机生成的私钥为:%d' % XA)
#得到B的私钥
XB = 43
print('B的私钥为:%d' % XB)
print('------------------------------------------------------------------------------')
#得待A的计算数
YA = get_calculation(p, int(list[-1]), XA)
print('A的计算数为:%d' % YA)
#得到B的计算数
YB = get_calculation(p, int(list[-1]), XB)
print('B的计算数为:%d' % YB)
print('------------------------------------------------------------------------------')
#交换后A的密钥
key_A = get_key(XA, YB, p)
print('A的生成密钥为:%d' % key_A)
#交换后B的密钥
key_B = get_key(XB, YA, p)
print('B的生成密钥为:%d' % key_B)
print('---------------------------True or False------------------------------------')
print(key_A == key_B)
实验结果