如何在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(命令行默认)
实现步骤
- 先安装依赖库
pycryptodome(替代已废弃的pycrypto):
pip install pycryptodome
- 编写解密代码:
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
相关产品推荐
相关产品推荐

