一、内容
用Python或Sage实现DH秘钥交换协议
二、Diffie-Hellman密钥交换算法
1、确定两个全局公开的参数,一个素数p和一个整数a,a是p的一个最大的原根
2、假设Alice和Bob希望交换一个密钥,用户A选择一个随机数XA<p,并计算公开密钥YA
= a^XA mod p。用户B选择一个随机数XB<p,并计算公开密钥YB
= a^XB mod p。然后交换彼此的计算数YA和YB,而XA和XB则各自保存。
3、计算A的密钥K A= (YB)^XA mod p。同样,计算B的密钥KB= (YA)^XB mod p。若是得到的结果相同,则是公共密钥。
三、实现过程
1、输入一个整数,判断其是否是素数。若是则生成原根,若不是则重新输入。
2、生成A,B的随机数XA,XB,并计算各自的计算数YA,YB
3、交换彼此的计算数
4、计算各自的KA.KB,若KA=KB,相当于A,B已经交换了一个相同的秘密密钥
四、算法
import random #生成任意数 import math #判断p是否为素数 def is_prime(p): if p <=1: return False else: for i in range(2, p): if p % i == 0: return False #else: #return true #生成所有的原根 def generator(p): list=[] for a in range(2,p): x=p-1 if a^x==1: list.append(a) return list #计算A,B的Y def get_Y(p,a,x): Y=(a^x) % p return Y #计算A,B的密钥 K def get_K(x,y,p): K=(y^x) % p return K if __name__ == "__main__": print('输入一个素数:',end='') flag=False while flag == False: p=input() p=int(p) flag=is_prime(p) print("%d是一个素数" % p) a=generator(p) print("%d 最大的原根是:" % p) print(a[-1]) Xa=random.randint(0,p-1) print("A的随机数Xa是:%d" % Xa) Xb=random.randint(0,p-1) print("B的随机数Xb是:%d" % Xb) Ya=get_Y(p,int(a[-1]),Xa) print("A的计算数Ya是:%d" % Ya) Yb=get_Y(p,int(a[-1]),Xb) print("B的计算数Yb是:%d" % Yb) Ka=get_K(Xa,Yb,p) print("A的密钥Ka是:%d" % Ka) Kb=get_K(Xb,Ya,p) print("B的密钥Kb是:%d" % Kb) if(Ka==Kb): print("Ka=Kb") #print("success”) else: print("false")