RSA非对称加密算法在Python中的原理和应用介绍
发布时间:2023-12-17 17:01:43
RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,它由三位计算机科学家:Ron Rivest、Adi Shamir和Leonard Adleman 在1977年共同发明。RSA算法利用了两个不同的密钥:一个公钥和一个私钥。公钥用于加密数据,私钥用于解密数据。
RSA算法的原理如下:
1. 选择两个大质数p和q,并计算它们的乘积n = p * q。
2. 计算欧拉函数φ(n) = (p-1) * (q-1)。
3. 选择一个与φ(n)互质的整数e,e要大于1且小于φ(n)。
4. 计算与e关于模φ(n)的模逆d,即(d * e) % φ(n) = 1。
5. 公钥就是(n, e),私钥就是(n, d)。
6. 加密时,将消息m用公钥加密得到密文c:c = (m^e) % n。
7. 解密时,将密文c用私钥解密得到原始消息m:m = (c^d) % n。
RSA算法的应用有很多,主要包括以下几个方面:
1. 安全通信:RSA算法可以用于安全地传输数据。发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密,确保只有接收方能够解密数据。
2. 数字签名:RSA算法也可以用于数字签名,在数据传输过程中验证数据的完整性和真实性。发送方使用自己的私钥对数据进行签名,接收方使用发送方的公钥验证签名是否有效。
3. 密码学协议:RSA算法被广泛应用于各种密码学协议中,例如TLS、SSH等,用于建立和保护网络通信的安全性。
下面以一个具体的例子来说明RSA算法的使用。
首先,生成公钥和私钥:
import random
import math
def generate_key():
# 选择两个大质数p和q
p = generate_prime()
q = generate_prime()
# 计算n = p * q
n = p * q
# 计算欧拉函数φ(n)
phi = (p - 1) * (q - 1)
# 选择与φ(n)互质的公钥e
e = generate_coprime(phi)
# 计算私钥d
d = modular_inverse(e, phi)
# 返回公钥和私钥
return (n, e), (n, d)
def generate_prime():
# 生成一个大质数
while True:
num = random.randint(2**15, 2**16)
if is_prime(num):
return num
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_coprime(phi):
# 生成与phi互质的数
while True:
num = random.randint(2, phi - 1)
if math.gcd(num, phi) == 1:
return num
def modular_inverse(a, m):
# 计算a关于模m的模逆
_, x, _ = extended_gcd(a, m)
return x % m
def extended_gcd(a, b):
if a == 0:
return b, 0, 1
else:
g, x, y = extended_gcd(b % a, a)
return g, y - (b // a) * x, x
public_key, private_key = generate_key()
使用公钥进行加密:
def encrypt(message, public_key):
n, e = public_key
return pow(message, e, n)
message = 123456789
encrypted_message = encrypt(message, public_key)
使用私钥进行解密:
def decrypt(encrypted_message, private_key):
n, d = private_key
return pow(encrypted_message, d, n)
decrypted_message = decrypt(encrypted_message, private_key)
