密码学中的 Blowfish 算法

2024 年 8 月 28 日 | 阅读 19 分钟

Blowfish 是一种对称的、64 位块密码,其长度可变。 1993 年,Bruce Schneier 创建了它作为对久负盛名的“数据加密标准”(DES)和“国际数据加密算法”(IDEA)加密技术的快速、免费的替代方案,因为它是一个“通用算法”。

Blowfish 未经专利,比 DES 和 IDEA 快得多,并且可以免费用于所有目的。 但是,由于其短块大小被认为不安全,因此它无法完全取代 DES。

其后继者 Twofish 解决了安全问题,它使用了 128 位的更高块大小。 尽管如此,当今市场上的许多密码套件和加密解决方案仍在使用 Blowfish 算法,因为完整的 Blowfish 加密从未被破解。

识别 blowfish

Blowfish 具有 64 位块大小,密钥长度可以是 32 位或 448 位。 它有 16 次迭代,类似于 Feistel,并且每次迭代都在一个被分成两个 32 位字的 64 位块上运行。 Blowfish 使用单个加密密钥来编码和解码数据。

Blowfish 算法的两个主要部分如下:

数据加密:数据加密使用一个 16 轮的 Feistel 网络,每一轮包括一个依赖于密钥的置换和一个依赖于密钥和数据的替换。 替换方法与大型的、依赖于密钥的 S 盒结合使用,以在 Blowfish 中加密数据。 所有加密过程都包括对 32 位字和异或的添加,这是一种逻辑门。

密钥扩展和子密钥:在整个密钥扩展过程中,最大 448 位的密钥被扩展成几个子密钥数组,总共 4,168 字节。 Blowfish 算法大量使用子密钥,这取决于它们。 在进行任何加密或解密之前,会预先计算这些子密钥。

Blowfish 中的 P 数组由四个 32 位 S 盒组成,每个 S 盒有 256 个条目,以及 18 个 32 位子密钥。 以下是子密钥的计算:

  1. 预定的 pi 的十六进制数字字符串用作 P 数组和 S 盒的初始化值。
  2. 现在,将第一个 P 数组元素 (P1) 与密钥的前 32 位异或,然后将 P2 与后 32 位异或,依此类推,直到所有 P 数组元素都与密钥位异或。
  3. 该过程应用于所有零字符串,方式如前几个阶段所示。
  4. 使用上述第 3 步的结果替换 P1 和 P2 数组。
  5. Blowfish 用于使用更改的子密钥加密此输出。
  6. P 数组的 P3 和 P4 由第 5 步的输出修改。
  7. 当此操作完成后,所有 P 数组和四个 S 盒都会被更新。

为了产生所有子密钥和过程,Blowfish 总共执行 521 次,使用大约 4 千字节 (KB) 的数据。

Blowfish 加密和解密技术的示例

假设将使用 Blowfish 对消息“Hi world”进行加密。 步骤如下:

  1. 第一个输入字符串“Hi world”由七个字符和一个空格组成,总共八个字节或 64 位。
  2. 它将输入分成 32 位。 密钥扩展生成一个称为 P1 的值,然后将其与剩余的 32 位“Hi w”异或,以产生所需的结果。 (注意:P 代表一个质数,它只能被它自己和另一个数字 1 整除。)
  3. 然后将 32 位分成每组 4 个字节,并在 P1 经过变换 F 函数 (F In) 后将其传递给四个 S 盒。
  4. 将前两个 S 盒的前两个值组合在一起,然后将第三个 S 盒的第三个值与它们异或。
  5. 为了产生 32 位作为输出,将此结果添加到第四个 S 盒的输出中。
  6. 为了创建输出 F1',F In 的输出与输入消息“orld”的右 32 位异或。
  7. 然后用 F1' 替换消息的左半部分,用 P1' 替换右半部分。
  8. 对于总共 16 轮,对 P 数组的每个新成员执行相同的过程。
  9. 16 个周期后,输出 P16' 和 F16' 最终与 P 数组的最后两个条目 P17 和 P18 异或。 之后,它们再次合并以创建输入消息的 64 位密文。

图片

Blowfish 的优点

Blowfish 是目前使用中速度最快、最小的块密码之一,它使用对称加密密钥将数据转换为密文。 30 多年前,它最初被创建,至今仍被广泛使用,因为它具有以下优点:

  • 数据加密过程在大微处理器上高效
  • 尽管在加密之前有复杂的初始化阶段,但它比 DES 和 IDEA 算法更快、更有效。
  • 它还为基于 Java 的软件和应用程序提供了广泛的安全性,为备份工具提供了安全的访问权限。
  • 并支持远程访问的安全用户身份验证。

Blowfish 的缺点

使用 Blowfish 进行加密有各种缺点,例如:

  • 密钥速度的变化会降低速度。
  • 完成主时间表需要时间。
  • 由于块大小较短(64 位),该技术容易受到生日攻击(一种暴力攻击)的影响。
  • 每个新密钥都需要进行预处理,占用 4 KB 的文本,这会降低速度,并使其对某些应用程序无用。

Blowfish 的使用

Blowfish 适用于各种用途,例如:

  • 移动处理器
  • 电子邮件
  • 文件或磁盘加密
  • 数据包加密
  • 随机比特生成
  • 密码哈希
  • 数据备份
  • 保护 Shell

许多知名产品都使用 Blowfish,包括 CryptoDisk、PasswordWallet、Access Manager、Symantec NetBackup 和 SplashID。 电子商务公司和社交媒体平台也广泛使用 Blowfish 来保护用户数据。

下面是一个演示 Blowfish 加密的 Java 程序

输出

subkey 1: 8e846390
subkey 2: a295c40e
subkey 3: b9a28336
subkey 4: 2446bf99
subkey 5: 0eb2313a
subkey 6: 0ea9fd0d
subkey 7: a295f380
subkey 8: cb78a054
subkey 9: ef9328fe
subkey 10: 1fe6dfaa
subkey 11: 14ef6fd7
subkey 12: 13dfc0b1
subkey 13: 6a1720af
subkey 14: ee4a9c00
subkey 15: 953fdcad
subkey 16: 9271c5ca
subkey 17: 38addcc1
subkey 18: ae4f37c6
-----Encryption-----
round 0: 77b3ba639cb0353b
round 1: 0cc7d63fd5267e6d
round 2: c799728ab5655509
round 3: 69612395e3dfcd13
round 4: f3f5b74b67d312af
round 5: 52023d4efd5c4a46
round 6: 5b785180f097cece
round 7: cc946d119000f1d4
round 8: 6af47a4b230745ef
round 9: 9fb82cc57512a5e1
round 10: 1106c1ab8b574312
round 11: 7d7a616502d9011a
round 12: 81e9ce71176d41ca
round 13: 9727e50a6fa35271
round 14: eb761e34021839a7
round 15: 0599d9367907dbfe
Cipher Text: d748ec383d3405f7

以下是一个演示如何解码数据的 Java 程序

输出

subkey 1: 8e846390
subkey 2: a295c40e
subkey 3: b9a28336
subkey 4: 2446bf99
subkey 5: 0eb2313a
subkey 6: 0ea9fd0d
subkey 7: a295f380
subkey 8: cb78a054
subkey 9: ef9328fe
subkey 10: 1fe6dfaa
subkey 11: 14ef6fd7
subkey 12: 13dfc0b1
subkey 13: 6a1720af
subkey 14: ee4a9c00
subkey 15: 953fdcad
subkey 16: 9271c5ca
subkey 17: 38addcc1
subkey 18: ae4f37c6
-----Decryption-----
round 17: 3ab5e5667907dbfe
round 16: fdd297bb021839a7
round 15: 82529d676fa35271
round 14: ec939d1a176d41ca
round 13: e14063bd02d9011a
round 12: 66cd65508b574312
round 11: 37e82a387512a5e1
round 10: 8fe62e7e230745ef
round 9: 1f04e6309000f1d4
round 8: 3624ea12f097cece
round 7: c546e12ffd5c4a46
round 6: ed76301e67d312af
round 5: bbd76433e3dfcd13
round 4: f160c1f4b5655509
round 3: 2512b60dd5267e6d
round 2: 6f86e1389cb0353b
Plain Text: 123456abcd132536

Blowfish 算法的优点和缺点

  • Blowfish 是一种快速的块密码,不包括密钥更改。 每个新密钥所需的预处理等于 4KB 的文本。
  • 与 DES 加密相比,它明显更快、更好。
  • 由于其使用 64 位块大小,Blowfish 容易受到生日攻击的影响。
  • 使用更少轮数的 Blowfish 已被证明容易受到众所周知的明文攻击(2 阶差分攻击 - 4 轮)。

Blowfish 算法的用途

  • 批量加密
  • 密码哈希
  • 数据包加密(ATM 数据包)