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

无法用PyCryptodome解密旧版Blowfish CTR模式加密文件的技术求助

解决旧版Blowfish CTR解密移植到PyCryptodome的问题

我刚好熟悉2002年Michael Gilfix写的那款纯Python Blowfish实现,你的问题核心在于旧代码的CTR模式使用了硬编码的默认初始计数器,而PyCryptodome要求明确指定计数器规则,只要对齐两者的行为就能完成移植。

先拆解旧代码的CTR逻辑

那款旧实现的initCTR()方法会把内部计数器初始化为8字节全0值(对应Blowfish的64位块大小),decryptCTR()的流程是:

  1. 用Blowfish ECB模式加密当前计数器,生成密钥流块
  2. 密钥流块和密文块逐字节异或得到明文
  3. 按大端字节序将计数器加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:33