Blowfish 是由著名密码学家布鲁斯・施奈尔(Bruce Schneier)于 1993 年设计的一种对称密钥分组加密算法,旨在替代安全性不足的 DES。它以公开透明、无专利限制、安全性高等特点成为经典加密算法,广泛应用于早期的加密软件、VPN、磁盘加密等场景。以下从算法核心原理、流程、安全性等方面详细解析:

1. Blowfish 基本特性

  • 分组长度:固定为 64 位(即每次加密 64 位明文)。
  • 密钥长度:可变,范围为 32 位(4 字节)至 448 位(56 字节),灵活性高。
  • 设计目标:公开、高效(软件实现速度快)、安全(抵抗已知密码分析攻击)、无专利限制,适合各类应用场景。
  • 加密 / 解密对称性:加密和解密流程相似,仅子密钥使用顺序不同,便于实现。

2. Blowfish 核心结构

Blowfish 的工作过程分为两部分:密钥扩展(Key Expansion) 和数据加密(Data Encryption)

2.1  密钥扩展:生成子密钥

密钥扩展的作用是将用户提供的可变长度密钥(32-448 位)转换为固定结构的子密钥,供加密 / 解密使用。子密钥包括:

  • P 数组:18 个 32 位元素(记为 P [0] 至 P [17])。
  • S 盒(S-Boxes):4 个 S 盒(S0、S1、S2、S3),每个 S 盒包含 256 个 32 位元素(即每个 S 盒可通过 8 位索引访问)。

密钥扩展步骤如下:

  1. 初始化 P 数组和 S 盒
    先用 π 的小数部分(十六进制)初始化 P 数组和 S 盒(固定值,公开)。例如,P [0] 初始化为 0x243F6A88,P [1] 为 0x85A308D3,以此类推;S 盒的初始值同样基于 π 的十六进制展开。

  2. 用用户密钥更新 P 数组
    将用户密钥(拆分为 32 位块,不足则循环使用)与 P 数组按位异或(XOR)。例如,若密钥长度为 64 位(2 个 32 位块 K0、K1),则 P [0] ^= K0,P [1] ^= K1,P [2] ^= K0,P [3] ^= K1…… 直到 P 数组全部更新。

  3. 通过加密 “全零块” 扩散密钥
    用当前的 P 数组和 S 盒加密一个 64 位的 “全零块”(0x0000000000000000),得到的密文作为新的 P [0] 和 P [1];再用更新后的 P 数组和 S 盒加密该密文,结果作为 P [2] 和 P [3];重复此过程,直到所有 P 数组和 S 盒元素被更新。
    总循环次数为:18(P 数组长度) + 4×256(4 个 S 盒,每个 256 元素)= 1034 次,确保密钥充分扩散到所有子密钥中。

2.2 数据加密流程

Blowfish 对 64 位明文的加密过程如下(解密流程类似,仅子密钥使用顺序相反):

  1. 拆分明文:将 64 位明文分为左 32 位(L)和右 32 位(R)。

  2. 16 轮迭代
    对 L 和 R 进行 16 轮处理,每轮操作如下(i 从 0 到 15):

    • L = L XOR P[i]
    • R = R XOR F(L)
    • 交换 L 和 R(最后一轮不交换)
      其中,F 函数是 Blowfish 的核心非线性组件。
  3. 最终处理
    迭代结束后,L = L XOR P [16],R = R XOR P [17],拼接 L 和 R 得到 64 位密文。

2.3 核心组件:F 函数

F 函数是 Blowfish 的非线性变换核心,输入 32 位数据,输出 32 位结果,步骤如下:

  1. 将 32 位输入拆分为 4 个 8 位字节(b0, b1, b2, b3),每个字节范围 0-255。
  2. 分别查询 4 个 S 盒:S0 [b0]、S1 [b1]、S2 [b2]、S3 [b3](每个 S 盒返回 32 位值)。
  3. 将 4 个 S 盒的输出相加(模 2^32),结果即为 F 函数的输出。

公式:F(x) = (S0[b0] + S1[b1] + S2[b2] + S3[b3]) mod 2^32
 

2.4. 解密流程

解密与加密流程几乎相同,唯一区别是子密钥使用顺序相反
加密时使用子密钥顺序为 P [0] 至 P [17],解密时使用顺序为 P [17] 至 P [0]。
这是因为 Blowfish 的迭代结构对称,反向使用子密钥即可完成解密。

3. 安全性分析

  • 抗攻击能力:自 1993 年发布以来,经过多年密码分析,未发现致命漏洞。针对 16 轮迭代的 Blowfish,目前已知的最佳攻击需要 2^41 次操作(针对简化轮数的版本),远高于实际可实现的计算量。
  • 密钥长度优势:最大 448 位密钥长度,远超 DES 的 56 位,能有效抵抗暴力破解。
  • 潜在不足
    • 分组长度为 64 位,在现代应用中较短(如 AES 为 128 位),可能因 “分组碰撞” 导致安全风险(如生日攻击,概率随加密数据量增加而上升)。
    • 密钥扩展时间较长(需加密 1034 次全零块),不适合频繁更换密钥的场景(如实时通信)。

4. 优缺点与应用

优点 缺点
1. 软件实现速度快(比 DES 快 2-10 倍);
2. 密钥长度灵活(32-448 位),安全性高;
3. 无专利限制,公开透明,易于实现;
4. 抗已知密码分析攻击能力强。
1. 64 位分组长度在大数据场景下存在安全隐患;
2. 密钥扩展耗时,不适合高频密钥更新;
3. 现代应用中逐渐被 AES 替代(AES 分组更长、效率更高)。

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐