python代码实现RSA,参数p、q选取3位的十进制数,并进行注释
时间: 2024-02-22 08:00:44 浏览: 117
好的,以下是Python代码实现RSA,参数p、q选取3位的十进制数,并进行注释:
```python
import random
# 生成3位质数
def generate_prime():
# 生成 3 位随机数
num = random.randint(100, 999)
while not is_prime(num):
num = random.randint(100, 999)
return num
# 判断是否为质数
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):
while b != 0:
a, b = b, a % b
return a
# 扩展欧几里得算法
def ext_euclid(a, b):
if b == 0:
return a, 1, 0
else:
d, x, y = ext_euclid(b, a % b)
return d, y, x - y * (a // b)
# 计算模逆元
def mod_inverse(a, m):
d, x, y = ext_euclid(a, m)
if d != 1:
raise ValueError("No inverse exists")
return x % m
# 计算公钥和私钥
def generate_key():
p = generate_prime() # 生成3位质数p
q = generate_prime() # 生成3位质数q
n = p * q # 计算模数n
phi = (p-1) * (q-1) # 计算欧拉函数φ(n)
e = 65537 # 选取公钥指数e
d = mod_inverse(e, phi) # 计算私钥指数d
return (n, e), (n, d) # 返回公钥和私钥
# RSA加密
def encrypt(plaintext, public_key):
n, e = public_key
ciphertext = pow(plaintext, e, n)
return ciphertext
# RSA解密
def decrypt(ciphertext, private_key):
n, d = private_key
plaintext = pow(ciphertext, d, n)
return plaintext
# 测试
if __name__ == '__main__':
# 生成公钥和私钥
public_key, private_key = generate_key()
print("公钥: ", public_key)
print("私钥: ", private_key)
# 加密和解密测试
plaintext = 123
print("明文: ", plaintext)
ciphertext = encrypt(plaintext, public_key)
print("密文: ", ciphertext)
decrypted_plaintext = decrypt(ciphertext, private_key)
print("解密后的明文: ", decrypted_plaintext)
```
这段代码中,我们使用了Python的随机数生成器和一些数学函数,实现了RSA加密算法的基本流程。您可以使用这段代码进行RSA加密和解密的测试。但需要注意的是,由于我们选取的是3位质数,因此密钥非常不安全,仅供教学和测试用途。在实际应用中,应该使用更长的密钥。
阅读全文