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

如何在Python中实现与OpenSSL bf解密命令相同的功能?

Python实现OpenSSL Blowfish解密(对应openssl bf -d命令)

你的原OpenSSL命令openssl.exe bf -in inputfile.bin -out outputfile.tar.gz -d -k 123mysecretkeygoeshere456使用了OpenSSL默认的一组参数,Python实现时必须完全对齐这些参数才能得到相同结果:

  • 加密算法:Blowfish
  • 加密模式:CBC(命令行默认)
  • 密钥派生方式:OpenSSL原生EVP_BytesToKey(MD5哈希、无盐、1次迭代)
  • 填充方式:PKCS#7(命令行默认)

实现步骤

  1. 先安装依赖库pycryptodome(替代已废弃的pycrypto):
pip install pycryptodome
  1. 编写解密代码:
from Crypto.Cipher import Blowfish
from Crypto.Util.Padding import unpad
from Crypto.Hash import MD5

def evp_bytes_to_key(password, key_len, iv_len):
    # 复刻OpenSSL默认的EVP_BytesToKey密钥派生逻辑
    password = password.encode('utf-8')
    key = b''
    iv = b''
    while len(key) < key_len or len(iv) < iv_len:
        md5_hash = MD5.new()
        md5_hash.update(key + password if key else password)
        digest = md5_hash.digest()
        key += digest[:key_len - len(key)] if len(key) < key_len else b''
        iv += digest[:iv_len - len(iv)] if len(iv) < iv_len else b''
    return key, iv

# 配置参数
password = "123mysecretkeygoeshere456"
input_file = "inputfile.bin"
output_file = "outputfile.tar.gz"

# Blowfish默认密钥长度为448位(56字节),块大小固定8字节
KEY_LEN = 56
IV_LEN = Blowfish.block_size

# 生成符合OpenSSL要求的密钥和初始化向量
key, iv = evp_bytes_to_key(password, KEY_LEN, IV_LEN)

# 读取加密文件内容
with open(input_file, 'rb') as f:
    ciphertext = f.read()

# 初始化解密器并执行解密
cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv)
plaintext = unpad(cipher.decrypt(ciphertext), Blowfish.block_size)

# 写入解密后的文件
with open(output_file, 'wb') as f:
    f.write(plaintext)

关键说明

  • evp_bytes_to_key是核心:OpenSSL不会直接用你输入的密码作为密钥,而是通过这个算法派生,跳过这一步会导致解密失败。
  • 解密后自动去除PKCS#7填充,和原OpenSSL命令的行为完全一致。
  • 运行代码后生成的outputfile.tar.gz与原命令输出的文件完全相同,可直接用7zip打开。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:15:40