详细烁眯RSA算法并附上代码
时间: 2024-04-30 07:20:12 浏览: 8
RSA算法是一种非对称加密算法,是目前最常用的公钥加密算法之一。它的安全性基于大数分解的难度,即将一个非常大的数进行因式分解的难度。
RSA加密算法的核心思想是:选择两个大质数p和q,计算出n=p*q,然后选择一个整数e,使得1<e<(p-1)*(q-1)且e与(p-1)*(q-1)互质。e和n组成公钥,n和d组成私钥。加密时,将明文m转化为整数M,然后用公钥进行加密,得到密文C = M^e mod n;解密时,用私钥进行解密,得到明文m = C^d mod n。
以下是RSA算法的Python代码实现:
```python
import random
from typing import Tuple
def gcd(a: int, b: int) -> int:
"""计算a和b的最大公约数"""
while b != 0:
a, b = b, a % b
return a
def is_prime(n: int) -> bool:
"""判断n是否为质数"""
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def generate_prime() -> int:
"""生成一个大质数"""
while True:
p = random.randint(100000, 1000000)
if is_prime(p):
return p
def generate_key() -> Tuple[Tuple[int, int], Tuple[int, int]]:
"""生成RSA公钥和私钥"""
p, q = generate_prime(), generate_prime()
n = p * q
phi = (p - 1) * (q - 1)
while True:
e = random.randint(2, phi - 1)
if gcd(e, phi) == 1:
break
d = pow(e, -1, phi)
public_key = (e, n)
private_key = (d, n)
return public_key, private_key
def encrypt(message: str, public_key: Tuple[int, int]) -> int:
"""用公钥加密明文"""
e, n = public_key
M = int.from_bytes(message.encode(), 'big')
C = pow(M, e, n)
return C
def decrypt(ciphertext: int, private_key: Tuple[int, int]) -> str:
"""用私钥解密密文"""
d, n = private_key
M = pow(ciphertext, d, n)
message = M.to_bytes((M.bit_length() + 7) // 8, 'big').decode()
return message
# 生成RSA公钥和私钥
public_key, private_key = generate_key()
# 加密明文
message = 'Hello, world!'
ciphertext = encrypt(message, public_key)
print('密文:', ciphertext)
# 解密密文
plaintext = decrypt(ciphertext, private_key)
print('明文:', plaintext)
```
在上面的代码中,我们定义了几个函数:
- `gcd(a, b)`:计算a和b的最大公约数;
- `is_prime(n)`:判断n是否为质数;
- `generate_prime()`:生成一个大质数;
- `generate_key()`:生成RSA公钥和私钥;
- `encrypt(message, public_key)`:用公钥加密明文;
- `decrypt(ciphertext, private_key)`:用私钥解密密文。
我们可以通过调用`generate_key()`函数来生成RSA公钥和私钥,然后用公钥加密明文,用私钥解密密文。
需要注意的是,加密时需要将明文转化为整数,解密时需要将解密结果转化为字符串。
以上就是RSA算法的Python代码实现。