rsa加密算法python实现
时间: 2023-08-31 16:28:56 浏览: 111
### 回答1:
以下是Python实现RSA加密算法的示例代码:
```python
import random
import math
# 判断是否为素数
def is_prime(num):
if num < 2:
return False
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
return False
return True
# 生成大素数
def generate_prime(bit_length):
while True:
prime = random.getrandbits(bit_length)
if is_prime(prime):
return prime
# 扩展欧几里得算法
def exgcd(a, b):
if b == 0:
return 1, 0, a
x, y, gcd = exgcd(b, a % b)
return y, x - a // b * y, gcd
# 求模反元素
def mod_inverse(a, n):
x, y, gcd = exgcd(a, n)
if gcd != 1:
raise ValueError("a is not invertible")
return x % n
# 生成公钥和私钥
def generate_key_pair(p, q):
n = p * q
phi_n = (p - 1) * (q - 1)
e = 65537 # 选取一个较大的素数
d = mod_inverse(e, phi_n)
return (e, n), (d, n)
# RSA加密
def encrypt(msg, public_key):
e, n = public_key
return pow(msg, e, n)
# RSA解密
def decrypt(cipher_text, private_key):
d, n = private_key
return pow(cipher_text, d, n)
# 示例
if __name__ == "__main__":
p = generate_prime(512)
q = generate_prime(512)
public_key, private_key = generate_key_pair(p, q)
msg = 123456789
cipher_text = encrypt(msg, public_key)
decrypted_text = decrypt(cipher_text, private_key)
print("原始消息:", msg)
print("加密后的消息:", cipher_text)
print("解密后的消息:", decrypted_text)
```
在代码中,我们使用了Python自带的`random`库生成随机数,使用`math`库进行数学计算。`generate_prime`函数用于生成一个大素数,`exgcd`函数用于求解扩展欧几里得算法,`mod_inverse`函数用于求解模反元素,`generate_key_pair`函数用于生成公钥和私钥,`encrypt`函数用于加密,`decrypt`函数用于解密。最后将加密、解密结果与原始消息进行比较,以验证加密解密是否正确。
### 回答2:
RSA加密算法是一种非对称加密算法,常被用于数据加密和数字签名的应用中。下面是用Python实现RSA加密算法的基本步骤:
1. 选择两个大素数p和q,并计算它们的乘积n = p * q。
2. 计算欧拉函数值φ(n) = (p - 1) * (q - 1)。
3. 选择一个整数e(1 < e < φ(n)),e与φ(n)互质。
4. 计算e的模反元素d(即d * e ≡ 1 mod φ(n))。
5. 公钥为(n, e),私钥为(n, d)。
6. 对明文M进行加密,加密结果为密文C = M^e mod n。
7. 对密文C进行解密,解密结果为明文M = C^d mod n。
下面是一个简单的Python代码实现RSA加密算法的例子:
```python
import random
def generate_prime_number(length):
"""生成指定位数的素数"""
while True:
num = random.randint(2**(length-1), 2**length)
if is_prime(num):
return num
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 != 0:
a, b = b, a % b
return a
def extended_gcd(a, b):
"""扩展欧几里得算法"""
if b == 0:
return 1, 0, a
x, y, gcd = extended_gcd(b, a % b)
return y, x - a // b * y, gcd
def generate_keys(length):
"""生成RSA公钥和私钥"""
p = generate_prime_number(length)
q = generate_prime_number(length)
n = p * q
phi_n = (p - 1) * (q - 1)
e = random.randint(1, phi_n)
while gcd(e, phi_n) != 1:
e = random.randint(1, phi_n)
d, _, _ = extended_gcd(e, phi_n)
d = d % phi_n
return (n, e), (n, d)
def encrypt(message, public_key):
"""RSA加密"""
n, e = public_key
ciphertext = [(ord(char) ** e) % n for char in message]
return ciphertext
def decrypt(ciphertext, private_key):
"""RSA解密"""
n, d = private_key
plaintext = [chr((char ** d) % n) for char in ciphertext]
return ''.join(plaintext)
# 生成RSA公钥和私钥
public_key, private_key = generate_keys(512)
# 明文
message = "Hello, RSA!"
# 加密
ciphertext = encrypt(message, public_key)
print("密文:", ciphertext)
# 解密
plaintext = decrypt(ciphertext, private_key)
print("明文:", plaintext)
```
这段代码实现了RSA加密算法的基本流程,包括生成公钥和私钥、加密和解密过程。其中,生成素数使用了随机算法,最大公约数使用了欧几里得算法,求解模反元素使用了扩展欧几里得算法。加密和解密过程中,分别对明文和密文进行了ASCII编码和解码的转换。
### 回答3:
RSA加密算法是一种非对称加密算法,被广泛应用于信息安全领域。下面是Python实现RSA加密算法的步骤:
1. 生成两个随机质数p和q,并计算n=p*q。n将作为公钥的一部分,p和q应保密。
2. 根据欧拉函数的性质,计算φ(n)=(p-1)*(q-1)。φ(n)将用于生成私钥。
3. 选择一个公钥e,满足1 < e < φ(n)且e与φ(n)互质。e将与n一起构成公钥。
4. 计算e关于φ(n)的模逆元d,即满足d*e mod φ(n) = 1。d将作为私钥的一部分。
5. 公钥为(n, e),私钥为(n, d)。
6. 加密时,将明文m通过公式c = m^e mod n进行加密。其中,c为密文。
7. 解密时,将密文c通过公式m = c^d mod n进行解密。其中,m为明文。
下面是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):
# 计算最大公约数
while b != 0:
a, b = b, a % b
return a
def extended_gcd(a, b):
# 计算扩展欧几里得算法
if b == 0:
return 1, 0 ,a
else:
x, y, gcd = extended_gcd(b, a % b)
x, y = y, (x - (a // b) * y)
return x, y, gcd
def mod_inverse(a, m):
# 计算模逆元
x, y, gcd = extended_gcd(a, m)
if gcd == 1:
return x % m
else:
return None
def generate_keypair():
# 生成公钥和私钥
p = random.randint(100, 1000)
while not is_prime(p):
p += 1
q = random.randint(100, 1000)
while not is_prime(q):
q += 1
n = p * q
phi = (p - 1) * (q - 1)
e = random.randint(2, phi - 1)
while gcd(e, phi) != 1:
e += 1
d = mod_inverse(e, phi)
return (n, e), (n, d)
def encrypt(pk, plaintext):
# 加密
n, e = pk
ciphertext = [(ord(char) ** e) % n for char in plaintext]
return ciphertext
def decrypt(sk, ciphertext):
# 解密
n, d = sk
plaintext = [chr((char ** d) % n) for char in ciphertext]
return ''.join(plaintext)
# 测试
public_key, private_key = generate_keypair()
message = "Hello, RSA!"
encrypted_message = encrypt(public_key, message)
decrypted_message = decrypt(private_key, encrypted_message)
print("Original message:", message)
print("Encrypted message:", encrypted_message)
print("Decrypted message:", decrypted_message)
```
这是使用Python实现RSA加密算法的基本步骤和代码示例。根据需要进行修改和适配,以实现具体的加密和解密任务。
阅读全文