无法用PyCryptodome解密旧版Blowfish CTR模式加密文件的技术求助
解决旧版Blowfish CTR解密移植到PyCryptodome的问题
我刚好熟悉2002年Michael Gilfix写的那款纯Python Blowfish实现,你的问题核心在于旧代码的CTR模式使用了硬编码的默认初始计数器,而PyCryptodome要求明确指定计数器规则,只要对齐两者的行为就能完成移植。
先拆解旧代码的CTR逻辑
那款旧实现的initCTR()方法会把内部计数器初始化为8字节全0值(对应Blowfish的64位块大小),decryptCTR()的流程是:
- 用Blowfish ECB模式加密当前计数器,生成密钥流块
- 密钥流块和密文块逐字节异或得到明文
- 按大端字节序将计数器加1(比如从
0x0000000000000000递增到0x0000000000000001)
对应PyCryptodome的移植代码
要复现这个行为,你需要精准对齐计数器规则和密钥处理逻辑,具体代码如下:
1. 导入依赖
from Crypto.Cipher import Blowfish from Crypto.Util import Counter
2. 对齐密钥格式(关键!)
旧版实现会自动将密钥补0到56字节(Blowfish最大密钥长度)或截断到合法长度(4-56字节),PyCryptodome不会自动处理,所以先手动对齐:
# 假设masterKey是字节串,如果是字符串先转成字节:masterKey = masterKey.encode('latin-1') masterKey = masterKey.ljust(56, b'\x00')[:56] # 补0到56字节,超出则截断
3. 构造匹配旧代码的计数器
用Counter.new()创建大端字节序、初始值为0的64位计数器:
# 64位计数器,大端递增,初始值0 ctr = Counter.new(64, initial_value=0, little_endian=False)
4. 解密数据
创建CTR模式的Blowfish实例并解密:
cipher = Blowfish.new(masterKey, mode=Blowfish.MODE_CTR, counter=ctr) cleanData = cipher.decrypt(encData)
注意事项
- 数据类型转换:旧代码用Python2的字符串存储数据,如果你拿到的
encData是字符串,需要先转成字节串:encData = encData.encode('latin-1') - 字节序验证:如果解密结果不对,可以尝试把
little_endian改成True(极少数旧实现可能用小端,但那款2002年的版本大概率是大端) - 密钥长度确认:如果旧代码的密钥处理逻辑和我描述的不一样(比如补0到最小长度4字节),需要对应调整密钥处理代码
内容的提问来源于stack exchange,提问作者Prev-I
相关产品推荐
相关产品推荐

