Blowfish / Twofish

Blowfish & Twofish
设计者
Bruce Schneier
(Twofish: Schneier 团队)
首次发布
Blowfish: 1993
Twofish: 1998
类别
对称分组密码
分组大小
64 bit (Blowfish)
128 bit (Twofish)
密钥长度
32-448 bit (Blowfish)
128/192/256 bit (Twofish)
结构
Feistel
轮数
16 (Blowfish)
16 (Twofish)
安全状态
安全(推荐使用 Twofish)

BlowfishTwofish是由密码学家 Bruce Schneier 设计的两个分组密码。Blowfish(1993)以 64 位分组处理数据,使用可变长度密钥(32-448 位),因其快速和免费而广泛流行。Twofish(1998)是 AES 竞赛的五个决赛选手之一,使用 128 位分组和最长 256 位密钥。

Blowfish

Blowfish 使用 16 轮 Feistel 网络,其独特之处在于使用密钥相关的 S-box。密钥扩展阶段将主密钥扩展为 P 数组(18 个 32 位值)和 4 个 S-box(各 256 个 32 位值),总计 4168 字节。密钥扩展较慢(需要加密一个全零字符串 521 次),但这也使得暴力破解更加困难。

注意:Blowfish 的 64 位分组大小在当今被认为是不足的——当加密约 232 个分组(32 GB)后,生日边界攻击变得可行。新系统推荐使用 Twofish 或 AES。

Twofish

Twofish 使用 128 位分组(与 AES 相同),支持 128/192/256 位密钥。其独特设计包括:

  • 密钥相关的 S-box:与 Blowfish 类似但更复杂,使用两个固定的 8×8 GF(2⁸) 矩阵乘以密钥相关的向量
  • 双 Feistel 网络:每轮并行处理两对数据
  • 白化(Whitening):在首尾各增加一轮密钥异或,增强安全性
  • 多种实现选项:可根据平台选择不同的性能/内存权衡
对比
特性BlowfishTwofishAES
分组64 bit128 bit128 bit
密钥32-448 bit128-256 bit128-256 bit
轮数161610-14
结构FeistelFeistel 变体SPN
S-box密钥相关密钥相关固定
白化
分组碰撞风险~32 GB~264 GB~264 GB
参考文献
  1. Schneier, B. (1993). "Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)". FSE 1993.
  2. Schneier, B., et al. (1998). "Twofish: A 128-Bit Block Cipher". AES Proposal.