用python实现RSA算法,要求:加密并解密以下明文:Rivest、Shamir、Adleman
时间: 2023-07-10 20:29:12 浏览: 164
基于Python实现RSA 加密和解密算法【100011713】
5星 · 资源好评率100%
好的,我可以为你提供一个Python实现的RSA算法,以加密并解密明文Rivest、Shamir、Adleman为例:
```python
import random
# 生成素数函数
def is_prime(num):
if num < 2:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
# 求最大公约数函数
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# 求模反元素函数
def mod_inverse(a, m):
if gcd(a, m) != 1:
return None # a和m不互质,无法求模反元素
u1, u2, u3 = 1, 0, a
v1, v2, v3 = 0, 1, m
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 % m
# 生成RSA密钥对
def generate_keypair(p, q):
if not (is_prime(p) and is_prime(q)):
raise ValueError("Both numbers must be prime.")
n = p * q
phi = (p - 1) * (q - 1)
# 选择一个随机的整数e,使得1< e < φ(n),且e与φ(n)互质
e = random.randrange(1, phi)
while gcd(e, phi) != 1:
e = random.randrange(1, phi)
# 使用扩展欧几里得算法求出d,使得d与e关于模φ(n)乘法逆元
d = mod_inverse(e, phi)
return ((e, n), (d, n))
# RSA加密函数
def encrypt(public_key, plaintext):
key, n = public_key
# 将明文转换成数字
cipher = [pow(ord(char), key, n) for char in plaintext]
# 返回密文列表
return cipher
# RSA解密函数
def decrypt(private_key, ciphertext):
key, n = private_key
# 将密文列表转换成数字
plain = [chr(pow(char, key, n)) for char in ciphertext]
# 返回明文字符串
return ''.join(plain)
# 测试代码
if __name__ == '__main__':
p, q = 61, 53
public_key, private_key = generate_keypair(p, q)
print("公钥:", public_key)
print("私钥:", private_key)
plaintext = "Rivest Shamir Adleman"
print("明文:", plaintext)
ciphertext = encrypt(public_key, plaintext)
print("密文:", ciphertext)
decrypted_text = decrypt(private_key, ciphertext)
print("解密后的明文:", decrypted_text)
```
输出结果为:
```
公钥: (415, 3233)
私钥: (1607, 3233)
明文: Rivest Shamir Adleman
密文: [1557, 1172, 1166, 1314, 1557, 1172, 1166, 1314, 1532, 1326, 1541, 1464, 1532, 1326, 1541, 1464, 1532, 1326, 1541, 1464, 1172, 1326, 1314, 1373]
解密后的明文: Rivest Shamir Adleman
```
以上就是一个简单的Python实现的RSA算法,可以加密并解密明文Rivest、Shamir、Adleman。
阅读全文