以下是使用類的方式封裝 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)}")@staticmethoddef 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填充方式的支持,或者增加批量解密的方法。