Python实现DH密钥交换

一、内容

用Python或Sage实现DH秘钥交换协议

二、Diffie-Hellman密钥交换算法

1、确定两个全局公开的参数,一个素数p和一个整数aap的一个最大的原根

2、假设AliceBob希望交换一个密钥,用户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")



猜你喜欢

转载自blog.csdn.net/lyt_mico/article/details/80378967