Python中RSA加密算法的原理与实例
发布时间:2023-12-27 15:53:27
RSA加密算法是一种非对称加密算法,由Rivest、Shamir和Adleman三位大学教授在1977年共同提出,以其安全性和可靠性被广泛应用于数据加密领域。
RSA算法利用了两个大质数之间乘积的难解性,其原理如下:
1. 生成公钥和私钥:
- 选择两个大质数p和q,并计算其乘积N=p*q。
- 计算欧拉函数φ(N)=(p-1)*(q-1)。
- 选择一个小于φ(N)且与之互质的整数e,作为公钥指数。
- 计算整数d,满足(ed)%φ(N)=1,作为私钥指数。
2. 加密过程:
- 将明文M转换为整数m,使得0≤m<N。
- 计算密文C,满足C = m^e mod N。
3. 解密过程:
- 将密文C转换为整数c,使得0≤c<N。
- 计算解密后的明文M,满足M = c^d mod N。
下面是一个使用RSA算法进行加密和解密的Python例子:
import random
# 生成大质数的函数
def generate_prime_number():
while True:
prime = random.randint(100, 1000) # 生成一个100到1000之间的随机数
if is_prime(prime):
return prime
# 判断一个数是否为质数的函数
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:
a, b = b, a % b
return a
# 求mod逆元的函数
def mod_inverse(a, m):
if gcd(a, m) != 1:
return None
u1, u2, u3 = 1, 0, a
v1, v2, v3 = 0, 1, m
while v3 != 0:
quotient = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - quotient * v1), (u2 - quotient * v2), (u3 - quotient * v3), v1, v2, v3
return u1 % m
# 生成公钥和私钥的函数
def generate_keys():
p = generate_prime_number()
q = generate_prime_number()
N = p * q
phi_N = (p - 1) * (q - 1)
e = random.randint(2, phi_N)
d = mod_inverse(e, phi_N)
return (e, N), (d, N)
# 加密函数
def encrypt(message, public_key):
e, N = public_key
encrypted_message = pow(message, e, N)
return encrypted_message
# 解密函数
def decrypt(encrypted_message, private_key):
d, N = private_key
decrypted_message = pow(encrypted_message, d, N)
return decrypted_message
# 示例
if __name__ == "__main__":
# 生成公钥和私钥
public_key, private_key = generate_keys()
print("公钥:", public_key)
print("私钥:", private_key)
# 待加密的明文
message = 123
print("明文:", message)
# 加密过程
encrypted_message = encrypt(message, public_key)
print("加密后的密文:", encrypted_message)
# 解密过程
decrypted_message = decrypt(encrypted_message, private_key)
print("解密后的明文:", decrypted_message)
在上面的例子中,首先定义了三个辅助函数,分别用于生成大质数、判断质数和求最大公约数及mod逆元。然后定义了生成公钥和私钥的函数generate_keys,使用随机生成的大质数生成相关参数并返回公钥和私钥。
接下来是加密和解密函数encrypt和decrypt,利用RSA算法对明文进行加密和解密。最后是示例代码,生成公钥和私钥,并使用公钥对明文进行加密,再使用私钥对密文进行解密,输出结果。
需要注意的是,RSA算法运算过程中使用的数值较大,为了防止溢出,Python提供了pow函数,用于求解大数的幂余运算。
总结来说,RSA加密算法通过利用质数之间乘积的难解性构建了一套复杂的公钥和私钥体系,实现了非对称加密的功能,被广泛应用于保护通信内容的安全性。
