Blowfish加解密工具
Bruce Schneier设计的快速对称分组密码
⚠️ 安全提示
Blowfish的64位分组大小在加密大量数据时可能受到生日攻击。对于需要最高安全性的新项目,建议使用AES-256。
关于Blowfish加密
Blowfish 是 Bruce Schneier 于 1993 年设计的对称 64 位分组密码,作为无专利的 DES 快速替代品发布。其 16 轮 Feistel 结构使用 32 到 448 位的可变长度密钥。密钥编排通过加密 π 的十六进制展开来生成 18 个 P 数组条目和四个 256 条目 S 盒(共约 4 KB 子密钥材料),这是一个公开且确定的过程,确保子密钥不含任何隐藏结构。Blowfish 是 OpenVPN 直到 2.4.0 版本(2017 年)的默认密码(BF-CBC 模式),之后被 AES-256-GCM 取代。
Blowfish 的密钥设置故意设计得很慢——需要进行 521 次自身迭代来派生子密钥——这使得暴力密钥搜索成本高昂。bcrypt(使用修改版“Eksblowfish”变体)利用此特性进行密码哈希,可配置 4 到 31 的成本因子,每增加一个级别加倍密钥设置时间。Blowfish 的主要限制是其 64 位分组大小:Sweet32 攻击(CVE-2016-2183,Bhargavan 和 Leurent,2016)证明在同一 CBC 密钥下加密 32 GB 数据会在统计上产生具有显著概率的生日界块碰撞,允许从捕获的流量中恢复明文。
主要特点
- 可变密钥长度:32 到 448 位(8 位递增)——相同的 16 轮 Feistel 结构适用于所有密钥长度,性能仅受一次性密钥设置影响,不影响每块加密速度
- Pi 派生密钥编排:在混入密钥材料之前,所有子密钥从 π 的十六进制数字初始化,确保密钥编排有透明、公开的初始化,没有隐藏的弱密钥后门
- 32 位硬件上的快速每块吞吐量:在 AES-NI 提出之前设计,在没有 AES 硬件加速的 32 位平台上,Blowfish 在纯软件实现上具有竞争力
- bcrypt 血统:bcrypt 密码哈希(OpenBSD 1999)中使用的 Eksblowfish 密钥设置源于 Blowfish 的慢速子密钥生成——支持独立于底层分组密码的工作因子调整
加密模式说明
- CBC: Blowfish 的密码块链接模式——Blowfish 的 64 位块在每个 Feistel 轮序列前与前一密文异或。Sweet32 限制适用:同一 CBC 密钥下大约 32 GB 数据后,生日界(2³² 块)被达到,块碰撞变得可统计利用。任何超过 32 GB 的会话或密钥,在达到阈值前应切换到 AES-256-GCM 或重新生成密钥。
- ECB: Blowfish 的电子密码本模式——每个 8 字节(64 位)块独立通过使用相同派生子密钥的 16 轮 Feistel 处理。当明文中出现相同的 8 字节块时,ECB 会暴露模式。仅用于单块操作,如测试、令牌加密或包装 64 位密钥材料段。
- CFB: Blowfish 的密码反馈模式——Blowfish 的块函数对运行中的密文(从 IV 开始)加密,高 n 位与 n 位明文异或。适合流式传输和错误传播数据,但受与 CBC 相同的每密钥 32 GB Sweet32 限制;在达到 2³² 块生日界之前重新生成密钥。
- OFB: Blowfish 的输出反馈模式——Blowfish 块函数对反馈寄存器(从 IV 初始化)独立于明文进行迭代,生成确定性密钥流。与 CBC 和 CFB 不同,OFB 错误不会传播,但 2³² 块密钥流循环限制(64 位内部状态生日界)仍然适用;在耗尽密钥流之前重新生成密钥。
算法对比
| 算法 | 密钥长度 | 分组大小 | 安全性 | 速度 |
|---|---|---|---|---|
| Blowfish | 32-448位 | 64 bits | 良好 | 快 |
| AES | 128/192/256 bits | 128 bits | 优秀 | 快 |
| DES | 56 bits | 64 bits | 较弱 | 快 |
| 3DES | 112/168 bits | 64 bits | 中等 | 慢 |
安全建议
- Sweet32(CVE-2016-2183,Bhargavan 和 Leurent,2016):Blowfish 的 64 位块使 CBC 模式加密在同一密钥下约 32 GB 流量后容易受到生日界攻击。研究人员演示了针对使用 Triple-DES 和 Blowfish 的 HTTPS 会话的实时漏洞利用。阈值为 2³² 块 = 32 GiB;任何 CBC 密钥必须在达到此限制之前轮换。
- OpenVPN 在 Sweet32 披露后于 2.4.0 版(2017 年)将 BF-CBC 从默认设置中弃用,以 AES-256-GCM 作为推荐密码替代。使用 BF-CBC 的 OpenVPN 连接现在会生成弃用警告。遗留 VPN 配置和存档流量仍可能使用 BF-CBC 并需要 Blowfish 进行访问。
- 没有算法攻击能破解完整 16 轮 Blowfish。该密码经历了超过三十年的差分和线性密码分析的考验。唯一实际问题是大量数据的 64 位块 Sweet32 问题——Feistel 结构和 S 盒设计对已知攻击仍然具有密码学健全性。
- 所有需要分组密码的新应用请使用 AES-128-GCM 或 AES-256-GCM。Blowfish 适用于解密遗留 BF-CBC 数据(OpenVPN 存档、旧 PGP 实现)、bcrypt 相关测试(理解 Eksblowfish),或研究导致 AES 竞赛的权衡取舍的密码学教育。
使用场景
- 密码哈希传承(bcrypt):bcrypt(Niels Provos 和 David Mazieres,1999)使用修改版 Eksblowfish 密钥设置,接受成本因子和 128 位盐,产生 184 位输出哈希;理解底层 Blowfish 密钥编排是理解 bcrypt 安全模型的基础
- OpenVPN 遗留存档解密:2016 年及之前使用 BF-CBC 作为默认数据通道密码的 OpenVPN 配置生成的流量需要原始 BF-CBC 实现才能解密;将这些存档迁移到 AES-256-GCM 需要先解密 BF-CBC 层
- 低资源嵌入式系统:Blowfish 的小代码占用和 32 位优化设计使其可部署在没有 AES-NI 且 RAM 不足以进行 AES-256 密钥编排扩展的微控制器上,前提是每密钥数据量保持在 32 GB Sweet32 阈值以下
- 密码学教育:Blowfish 透明记录的结构(pi 子密钥派生、S 盒替换、Feistel 轮函数)和 30 年攻击历史使其成为教授对称密码设计权衡的理想教学示例