You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

可使用哪些Python依赖库解密openssl cms命令加密的数据

报错根因

openssl cms -encrypt 输出的是符合CMS(Cryptographic Message Syntax,密码消息语法)标准的混合加密封装结构,不是纯RSA加密的密文:

  • 加密流程会先生成随机对称密钥(默认一般为AES密钥),用该对称密钥加密实际的明文数据
  • 再用接收方证书对应的RSA公钥加密这个随机对称密钥,最后把加密后的对称密钥、密文、算法参数等内容按ASN.1编码规则打包成完整的CMS格式文件
    你之前的代码把整个CMS结构直接传给RSA OAEP接口解密,必然会触发ValueError: Ciphertext with incorrect length错误。
可行解密方案

方案1:使用cryptography库(推荐)

这是当前Python生态维护最活跃、兼容性最好的密码学库,原生支持CMS/PKCS#7格式的解密,不需要手动解析复杂的ASN.1结构。

  1. 安装依赖:
    pip install cryptography
    
  2. 参考解密代码:
    from cryptography.hazmat.primitives import serialization
    from cryptography.hazmat.primitives.serialization import pkcs7
    
    # 加载无密码的RSA私钥
    with open("private_key_no_pass.pem", "rb") as f:
        private_key = serialization.load_pem_private_key(
            f.read(),
            password=None
        )
    
    # 读取PEM格式的CMS加密文件
    with open("test_encrypted_data.txt", "rb") as f:
        cms_content = f.read()
    
    # 调用内置接口完成全流程解密,自动处理会话密钥解析、对称算法解密逻辑
    plaintext = pkcs7.pkcs7_decrypt(cms_content, private_key, None)
    print(f"解密结果:{plaintext.decode()}")
    

该接口完全兼容openssl生成的CMS格式,不需要手动删除PEM头尾、手动做base64解码。

方案2:调用本地openssl命令(零额外Python依赖)

如果运行环境本身已经安装了openssl,可以直接通过subprocess调用openssl cms解密命令,和加密时使用的工具完全同源,不会出现格式兼容问题:

import subprocess

run_result = subprocess.run(
    [
        "openssl", "cms", "-decrypt",
        "-in", "test_encrypted_data.txt",
        "-inform", "PEM",
        "-inkey", "private_key_no_pass.pem"
    ],
    capture_output=True,
    check=True
)

plaintext = run_result.stdout
print(f"解密结果:{plaintext.decode()}")
注意事项

不建议手动使用pycryptodome拆解CMS结构:CMS结构嵌套复杂,不同版本openssl默认使用的对称加密算法、填充规则、参数存储位置都可能存在差异,手动解析需要处理大量边界兼容问题,不仅开发成本高,还容易引入安全漏洞。

内容的提问来源于stack exchange,提问作者Nikesh Urkude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:33:19