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)
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)