DH秘钥交换

import math  
import random


  
#判断素数
def isPrime(p): 
    if p <= 1: 
    return False
    for i in range(2, int(math.sqrt(p)) + 1): 
    if p % i == 0: 
      return False
    return True


#得到所有原根  
def getGenerator(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 getCalculation(p, a, X):  
    Y = (a ** X) % p  
    return Y  
  
#A,B得到交换计算数后的密钥   
def getKey(X, Y, p):  
    key = (Y ** X) % p  
    return key  
      
if __name__ == "__main__":  
      
    #得到规定的素数  
    flag = False  
    while flag == False:  
        print('输入一个素数: ', end = '')  
        p = input()  
        p = int(p)  
        flag = isPrime(p)  
    print(str(p) + '是素数 ')  
      
    #得到素数的一个原根  
    list = getGenerator(p)  
    print(str(p) + ' 的一个原根为:', end = '')  
    print(list[-1])  
    print('')  
      
    #得到A的私钥  
    XA = random.randint(0, p-1)  
    print('A随机生成的私钥为:%d' % XA)  
      
    #得到B的私钥  
    XB = random.randint(0, p-1)  
    print('B随机生成的私钥为:%d' % XB)  
    print('')  
      
    #得待A的计算数  
    YA = getCalculation(p, int(list[-1]), XA)  
    print('A的计算数为:%d' % YA)  
      
    #得到B的计算数  
    YB = getCalculation(p, int(list[-1]), XB)  
    print('B的计算数为:%d' % YB)  
    print('')  
      
    #交换后A的密钥  
    keyA = getKey(XA, YB, p)  
    print('A的生成密钥为:%d' % keyA)  
      
    #交换后B的密钥  
    keyB = getKey(XB, YA, p)  
    print('B的生成密钥为:%d' % keyB)  
    print('')  
      
    print(keyA == keyB)  

你可能感兴趣的:(DH秘钥交换)