一.完整代码
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
def get_key(p, q):
n = p * q
N = (p - 1) * (q - 1)
e = 2
while gcd(e, N) != 1:
e = e + 1
d = 2
while (e*d) % N != 1:
d = d + 1
return (n, e), (n, d)
def jiami(x, gongyao):
n = gongyao[0]
e = gongyao[1]
y = x ** e % n
return y
def jiemi(y, shiyao):
n = shiyao[0]
d = shiyao[1]
x = y ** d % n
return x
p = int(input("第一个质数p:"))
q = int(input("第二个质数q:"))
x = int(input("要加密的消息x:"))
gongyao, shiyao = get_key(p, q)
print("加密前:", x)
y = jiami(x,gongyao)
print("加密后:", y)
after_x = jiemi(y, shiyao)
print("解密后:", after_x)
二.解释
1.公约数
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
gcd()函数表示求两个数的公约数,首先定义一个def gcd(a, b)函数,利用该函数可以判断公钥对中(e,n)中的e与N的最大公约数是否为1。
2.得到密钥
def get_key(p, q):
n = p * q
N = (p - 1) * (q - 1)
e = 2
while gcd(e, N) != 1:
e = e + 1
d = 2
while (e*d) % N != 1:
d = d + 1
return (n, e), (n, d)
e必须满足两个条件:e是一个比1大比N小的数,e和N的最大公约数为1;用while循环,直到取到合适的e值。
1<e<N
gcd(e,N)=1
利用取得的e值计算d:
1<d<N
e*d mod N=1
e,d求出,即公钥(e,n)与私钥(d,n)求出。
3.加解密
公钥和私钥已求出,利用:密文=明文EmodN密文=明文EmodN (加密)
明文=密文DmodN明文=密文DmodN (解密)
注意 加密:准备的明文必须是小于N的数,因为加密或者解密都要 mod N,其结果必须小于N。