RSA 解密逻辑

以下是使用类的方式封装 RSA 解密逻辑,使其更易于调用和管理:

python 复制代码
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}")

主要特点:

  1. 灵活的初始化方式:

    • 可以通过直接传入PEM格式的私钥字符串初始化
    • 也可以通过指定私钥文件路径初始化
  2. 两种使用方式:

    • 实例化后重复使用(适合需要多次解密的情况)
    • 静态方法直接调用(适合一次性使用)
  3. 完善的错误处理:

    • 初始化时检查私钥有效性
    • 解密时检查解密结果有效性
    • 捕获并处理各种可能的异常
  4. 清晰的接口设计:

    • 方法命名和参数命名直观
    • 包含详细的文档注释

使用建议:

  1. 如果是长期使用的场景,建议实例化后重复使用,避免重复加载私钥
  2. 如果是脚本或临时使用,可以直接使用静态方法
  3. 私钥建议存储在安全的地方,不要硬编码在代码中

您可以根据实际需求调整这个类,比如添加对OAEP填充方式的支持,或者增加批量解密的方法。

相关推荐
冷雨夜中漫步6 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴6 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再6 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
m0_736919108 小时前
C++代码风格检查工具
开发语言·c++·算法
喵手8 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934738 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy8 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
黎雁·泠崖9 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472469 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
肖永威9 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos