RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。RSA 是 1977 年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
1、找出两个质数 和
2、=×
3、()=(−1)(−1)
4、公钥 :在 1<<() 中找一个整数
* 和 () 互质
5、私钥 :通过 ⋅≡1()得到
给定 与公钥
加密函数为: y ≡ x e m o d n y\equiv x^emod\;n y≡xemodn
给定私钥 及密文 和
解密函数为: x ≡ y d m o d n x\equiv y^dmod\;n x≡ydmodn
Alice 想发送一个加密后的信息给 Bob,Alice 想发送的消息是(=4 ),Alice 对其加密后生成密文 发送给 Bob,Bob 使用自己的私钥解密 y
# 求两个数字的最大公约数(欧几里得算法)
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# 拓展的欧几里得算法
def ext_gcd(a, b):
if b == 0:
x1 = 1
y1 = 0
x = x1
y = y1
r = a
return r, x, y
else:
r, x1, y1 = ext_gcd(b, a % b)
x = y1
y = x1 - a // b * y1
return r, x, y
# 生成公钥私钥
def get_key(p, q):
n = p * q
fyn = (p - 1) * (q - 1)
# 此处抱着e与fyn互素,并且得到的x要大于0
e = fyn # 初始化e
while e > 1 :
e -= 1
r, x, y, = ext_gcd(e, fyn) # 传入fn和e到ext_gcd()中,得到d
if (gcd(e, fyn) == 1) & (x > 0):
break
# d*e%
d = x # 扩展的欧几里得算法中得到的x就是e的逆元
return (n, e), (n, d)
# 加密
def encryption(x, pubkey):
n = pubkey[0]
e = pubkey[1]
y = x ** e % n # 加密
return y
# 解密
def decryption(y, prikey):
n = prikey[0]
d = prikey[1]
x = y ** d % n # 解密
return x
if __name__ == '__main__':
p = int(input("请给定第一个质数p的值:"))
q = int(input("请给定第二个质数q的值:"))
x = int(input("请给定要加密的消息x的值:"))
# 生成公钥私钥
pubkey, prikey = get_key(p, q)
print("加密前的消息是:", x)
y = encryption(x, pubkey)
print("加密后的消息是:", y)
after_x = decryption(y, prikey)
print("解密后的消息是:", after_x)