rsa加解密python代码实现,要求p、q、e从控制台输入,且代码必须有注释
时间: 2024-02-03 09:04:32 浏览: 61
python的RSA加解密
5星 · 资源好评率100%
以下是RSA加解密的Python代码实现,其中p、q、e从控制台输入,代码有详细的注释:
```python
import math
# 辗转相除求最大公约数
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# 扩展欧几里得算法求模反元素
def mod_inverse(a, m):
for x in range(1, m):
if (a * x) % m == 1:
return x
return -1
# 判断一个数是否为质数
def is_prime(num):
if num == 2:
return True
if num < 2 or num % 2 == 0:
return False
for n in range(3, int(num ** 0.5) + 2, 2):
if num % n == 0:
return False
return True
# 生成RSA公钥和私钥
def generate_keypair(p, q, e):
# 如果p或q不是质数,则抛出异常
if not (is_prime(p) and is_prime(q)):
raise ValueError("Both numbers must be prime.")
# 如果p和q相等,则抛出异常
elif p == q:
raise ValueError("p and q cannot be equal")
# 计算n和phi(n)
n = p * q
phi = (p - 1) * (q - 1)
# 如果e和phi(n)不互质,则抛出异常
if gcd(phi, e) != 1:
raise ValueError("e must be coprime to phi")
# 计算d
d = mod_inverse(e, phi)
# 返回公钥和私钥
return ((n, e), (n, d))
# RSA加密
def encrypt(pk, plaintext):
n, e = pk
# 将明文转化为整数,并计算密文
cipher = [(ord(char) ** e) % n for char in plaintext]
return cipher
# RSA解密
def decrypt(pk, ciphertext):
n, d = pk
# 计算明文并将其转化为字符串
plain = [chr((char ** d) % n) for char in ciphertext]
return ''.join(plain)
# 主程序
if __name__ == '__main__':
# 从控制台读取p、q、e
p = int(input("Enter a prime number (p): "))
q = int(input("Enter another prime number (q): "))
e = int(input("Enter a number (e) coprime to (p-1)*(q-1): "))
# 生成公钥和私钥
public, private = generate_keypair(p, q, e)
print("Public key: ", public)
print("Private key: ", private)
# 从控制台读取要加密的明文
message = input("Enter a message to encrypt with your public key: ")
# 加密明文并输出密文
encrypted_msg = encrypt(public, message)
print("Your encrypted message is: ")
print(''.join(map(lambda x: str(x), encrypted_msg)))
# 使用私钥解密密文并输出原始明文
print("Decrypting message with private key: ", private)
print("Your message is:")
print(decrypt(private, encrypted_msg))
```
在运行程序时,用户需要按照提示输入p、q、e以及要加密的明文。程序将生成公钥和私钥,并使用公钥加密明文,最后使用私钥解密密文并输出原始明文。
阅读全文