生成python代码,实现RSA算法
时间: 2024-06-09 14:04:30 浏览: 81
(纯算法,没有调用库)python实现RSA数字签名代码、ppt、文档.rar
5星 · 资源好评率100%
以下是Python实现RSA算法的代码:
```python
import random
def is_prime(n):
"""
判断一个数是否为素数
"""
if n <= 1:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
def gcd(a, b):
"""
求两个数的最大公约数
"""
while b:
a, b = b, a % b
return a
def mod_inverse(a, m):
"""
求模反元素
"""
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 - (a // b) * y
d, x, y = ext_euclid(a, m)
if d == 1:
return x % m
else:
return None
def generate_keys(p, q):
"""
生成RSA公钥、私钥
"""
n = p * q
phi_n = (p - 1) * (q - 1)
e = random.randrange(1, phi_n)
while gcd(e, phi_n) != 1:
e = random.randrange(1, phi_n)
d = mod_inverse(e, phi_n)
return (e, n), (d, n)
def encrypt(public_key, message):
"""
RSA加密
"""
e, n = public_key
return pow(message, e, n)
def decrypt(private_key, ciphertext):
"""
RSA解密
"""
d, n = private_key
return pow(ciphertext, d, n)
# 测试代码
if __name__ == '__main__':
p, q = 61, 53
if not (is_prime(p) and is_prime(q)):
raise ValueError('p和q必须为素数')
public_key, private_key = generate_keys(p, q)
message = 123456789
ciphertext = encrypt(public_key, message)
plaintext = decrypt(private_key, ciphertext)
print('明文:', message)
print('密文:', ciphertext)
print('解密后的明文:', plaintext)
```
在这个实现中,我们用到了以下函数:
- `is_prime(n)`:判断一个数是否为素数。
- `gcd(a, b)`:求两个数的最大公约数。
- `mod_inverse(a, m)`:求a在模m意义下的逆元素。
- `generate_keys(p, q)`:生成RSA公钥、私钥。
- `encrypt(public_key, message)`:RSA加密。
- `decrypt(private_key, ciphertext)`:RSA解密。
我们可以通过修改代码中的p和q来生成不同的RSA公钥、私钥。
阅读全文