#1.构造全局变量:选一素数p,模p的原根g,随机选取x,且x和g都小于p,计算y=g的x次方(mod p) #2.加密算法:将明文信息M表示成为{0到p-1}里的数,再随机选取随机数k,计算c1=g的x次方(mod p) #c2=M*y的k次方(mod p) #3.解密算法:计算M=c1的-x次方*c2(mod p)
import math
p=int(input("请输入素数p:"))
t = 0
while t==0 or t==1:
t=0
for i in range(2, int(math.sqrt(p)) + 1):
if p % i == 0:
print(p, "不是素数")
p = int(input("请重新输入素数p:"))
t=1
break
if t==0:
t=2
print("素数p的原根有")
for j in range(1, p):
for i in range(1, ((p - 1) // 2) + 1):
if pow(j, i) % p == p - 1 and i != (p - 1) / 2:
break
else:
if pow(j, i) % p == p - 1 and i == (p - 1) / 2:
print(j,end=",")
g=int(input("请输入素数p的原根g:"))
x=int(input("请输入私钥(x<p):"))
print("保密x")
y=pow(g,x)%p
print("私有密钥为({},{},{})".format(p,g,x))
print("公开密钥为({},{},{})".format(p,g,y))
M=int(input("请输入明文信息:"))
k=int(input("请随机选取整数:"))
C1=pow(g,k)%p
C2=(M*pow(y,k))%p
print("将密文({},{})发送".format(C1,C2))
n=pow(C1,x)%p
def gcd(a, b):
while a != 0:
a, b = b % a, a
return b
def findModReverse(n, p): # 这个扩展欧几里得算法求模逆
if gcd(n, p) != 1:
return None
u1, u2, u3 = 1, 0, n
v1, v2, v3 = 0, 1, p
while v3 != 0:
q = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
return u1 % p
s=findModReverse(n,p)
print(s)
m=s*C2%p
print("解密得到的明文信息为",m)
运行结果: