一、DH密码的大概思路:
(1)协商公共参数g,p
(2)各自在1~p-1中随机选用私钥Xa,Xb
(3)各自计算可公平的公钥 y=g^xmodp
(4)利用公开信道交换公钥
(5)计算共享密钥k=ybxamodp=yaxbmodp
DH的具体做法:
1、Alice向Bob发送两个质数P和G
P必须是一个非常大的质数,而G则是一个和P相关的数,称为生成元。G可以是一个较小的数字
2、Alice生成一个随机数A
A是一个1~P-2之间的整数。这个数是一个只有Alice知道的秘密数字,没有必要告诉Bob,也不能让窃听者知道
3、Bob生成一个随机数B
B是一个1~P-2之间的整数。这个数是一个只有Bob知道的秘密数字,没有必要高数Alice,也不能让窃听者知道
4、Alice将 G的A次方 mod P 这个数发送给Bob
5、Bob 将 G的B次方 mod P 这个数发送给Alice
6、Alice用Bob发过来的数计算A次方并求 mod P,获得共享密钥
二、DH密钥CS交互的Python代码
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])
# 得到A的私钥
XA = random.randint(0, p - 1)
print('A随机生成的私钥为:%d' % XA)
# 得到B的私钥
XB = random.randint(0, p - 1)
print('B随机生成的私钥为:%d' % XB)
# 得待A的计算数
YA = get_calculation(p, int(list[-1]), XA)
print('A的计算数为:%d' % YA)