以下是使用类的方式封装 RSA 解密逻辑,使其更易于调用和管理:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
class RSADecryptor:
"""
RSA 解密工具类,封装解密逻辑,方便调用
"""
def __init__(self, private_key_pem=None, private_key_file=None):
"""
初始化 RSA 解密器
参数:
private_key_pem (str): PEM 格式的私钥字符串
private_key_file (str): 私钥文件路径
"""
if private_key_pem is None and private_key_file is None:
raise ValueError("必须提供私钥(PEM字符串或文件路径)")
if private_key_pem:
self.private_key = RSA.import_key(private_key_pem)
else:
with open(private_key_file, 'r') as f:
self.private_key = RSA.import_key(f.read())
self.cipher = PKCS1_v1_5.new(self.private_key)
def decrypt(self, encrypted_text):
"""
解密 RSA 加密的文本
参数:
encrypted_text (str): Base64 编码的加密字符串
返回:
str: 解密后的原始字符串
"""
try:
encrypted_data = base64.b64decode(encrypted_text)
decrypted_data = self.cipher.decrypt(encrypted_data, None)
if decrypted_data is None:
raise ValueError("解密失败,可能是私钥不匹配")
return decrypted_data.decode('utf-8')
except Exception as e:
raise ValueError(f"解密过程中发生错误: {str(e)}")
@staticmethod
def decrypt_with_key(encrypted_text, private_key_pem):
"""
静态方法:直接用给定的私钥解密
参数:
encrypted_text (str): Base64 编码的加密字符串
private_key_pem (str): PEM 格式的私钥字符串
返回:
str: 解密后的原始字符串
"""
decryptor = RSADecryptor(private_key_pem=private_key_pem)
return decryptor.decrypt(encrypted_text)
示例用法
if __name__ == "__main__":
# 示例私钥 (实际使用时替换为您的私钥)
SAMPLE_PRIVATE_KEY = """-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAz7v5z5X9z5v5z5X9z5v5z5X9z5v5z5X9z5v5z5X9z5v5
...(这里放您的实际私钥)...
-----END RSA PRIVATE KEY-----"""
# 示例加密文本
ENCRYPTED_TEXT = "aGVsbG8gd29ybGQh" # Base64 编码的加密文本
# 使用方法1:实例化后解密
try:
decryptor = RSADecryptor(private_key_pem=SAMPLE_PRIVATE_KEY)
result = decryptor.decrypt(ENCRYPTED_TEXT)
print(f"解密结果: {result}")
except Exception as e:
print(f"解密失败: {e}")
# 使用方法2:静态方法直接解密
try:
result = RSADecryptor.decrypt_with_key(ENCRYPTED_TEXT, SAMPLE_PRIVATE_KEY)
print(f"静态方法解密结果: {result}")
except Exception as e:
print(f"静态方法解密失败: {e}")
主要特点:
灵活的初始化方式:
- 可以通过直接传入PEM格式的私钥字符串初始化
- 也可以通过指定私钥文件路径初始化
两种使用方式:
- 实例化后重复使用(适合需要多次解密的情况)
- 静态方法直接调用(适合一次性使用)
完善的错误处理:
- 初始化时检查私钥有效性
- 解密时检查解密结果有效性
- 捕获并处理各种可能的异常
清晰的接口设计:
- 方法命名和参数命名直观
- 包含详细的文档注释
使用建议:
- 如果是长期使用的场景,建议实例化后重复使用,避免重复加载私钥
- 如果是脚本或临时使用,可以直接使用静态方法
- 私钥建议存储在安全的地方,不要硬编码在代码中
您可以根据实际需求调整这个类,比如添加对OAEP填充方式的支持,或者增加批量解密的方法。