#判断参数n是否为质数,绕过是返回True 不是返回False
def pd_prime(n):
if n <= 1:
return False
for i in range(2,n):
if n % i == 0:
return False
return True
#获取两数的最大公约数
def gcd(x,y):
while y != 0:
(x,y) = (y,x % y)
return x
#rsa密钥生成函数
def rsa_create():
#获取质数p
while True:
# 通过随机数获取,范围1-10000
p = random.randint(1,10000)
#判断p是否为质数
if pd_prime(p):
break
# 获取质数q
while True:
# 通过随机数获取,范围1-10000
q = random.randint(1,10000)
# 判断q是否为质数
if pd_prime(q):
break
#计算两个质数的乘积
N = p * q
#计算欧拉值
fn = (p-1) * (q-1)
#选取公钥e
while True:
#通过随机数获取,范围2-fn(欧拉值)
e = random.randint(2,fn)
#判断e是否为质数,如果是则判断e与fn的最大公约数,如果不是,着重新获取e的值
if pd_prime(e) == False:
continue
#判断e与fn的最大公约数是否为1,如果条件满足,则e的值获取成功结束循环,如果条件不满足则重新获取e的值
if gcd(e,fn) == 1:
break
#计算私钥d(穷举法)
for d in range(2,fn):
if (e * d) % fn == 1:
break
print("公钥:(",e,",",N,")")
print("私钥:(",d,",",N,")")
#因为密文c = m ** e % n,我们设明文m为2,通过运算我们得出密文c的结果。
c = 2 ** e % N
print("加密结果密文c为:,",c,",")
#用私钥(e,d)对密文c进行幂运算得到原来的明文m。
m = c ** d % N
print("解密结果明文m为:,", m, ",")
#运行函数rsa_create
if __name__ == '__main__':
rsa_create()