FFT-Hash II:高效密码哈希算法解析
在当今数字化时代,密码哈希算法在保障信息安全方面起着至关重要的作用。FFT-Hash II 作为一种高效的密码哈希算法,旨在将任意长度的消息哈希为 128 位的哈希值,同时确保生成碰撞消息在计算上不可行。本文将深入探讨 FFT-Hash II 算法的原理、实现细节以及相关的安全分析。
1. 哈希算法概述
FFT-Hash II 算法是一种新颖的密码哈希算法设计,可作为 Rivest 的 MD4 / MD5 算法的替代方案。该算法不依赖于任何加密方案,其设计目标是使得在少于 $2^{64}$ 次操作内生成碰撞消息变得不可能。它通过离散傅里叶变换(DFT)和有限域上的多项式递归,实现了信息的理想扩散和局部随机性的生成。
1.1 消息填充
消息必须填充为 128 位的倍数。具体做法是在消息末尾添加一个“1”位,接着添加若干个“0”位,最后添加消息原始长度的二进制表示。填充后的消息由多个 128 位的块组成。
1.2 初始值
初始值 $H_0$ 以十六进制表示为:
$H_0 = 0123\ 4567\ 89ab\ cdef\ fedc\ ba98\ 7654\ 3210$
2. 哈希函数 h 的算法
哈希函数 $h$ 的输出为 $H_n$,其依赖于函数 $g$:${0, 1}^{256} \to {0, 1}^{128}$。为了使 $h$ 函数无碰撞,需要满足以下两个问题在计算上不可行:
-
问题 1
:找到消息块 $M, M’ \in {0, 1}^{128}$,使得 $g(H, M) = g(H’, M’)$。
-
问题 2
:找到 $M \in {0, 1}^{128}$,使得 $g(H’, M) = H$。
2.1 函数 g 的描述
设 $p$ 为素数 $p = 65537 = 2^{16} + 1$,元素在 $\mathbb{Z}_p = \mathbb{Z} / p\mathbb{Z}$ 中用区间 $[0, 2^{16}]$ 内的余数表示。函数 $g$ 的算法如下:
INPUT (e_0, ..., e_15) E (0, 1)^(16*16) c Z_p^16
1. FOR i = 0, ..., 15
DO e_i := e_i + e_{i-1}e_{i-2} + e_{i-3} + 2^i (mod p)
where e' = e if e # 0 and e+ = 1 if e = 0.
(The indices i, i - 1, i - 2, i - 3 are taken modulo 16)
OUTPUT e_i (mod 2^16) for i = 8, ..., 15
2.2 与 FFT-Hash I 的比较
FFT-Hash I 算法的 $g$ 函数版本存在弱点,已被 BOSSELAER 和 DAEMEN 以及 M. GIRAULT 破解。其弱点在于输入元素的信息扩散不充分,部分输入元素对最终输出的影响有限,且在某些情况下变换几乎是线性的。而 FFT-Hash II 的 $g$ 函数通过以下改进解决了这些问题:
- 用 $e_{i-3}$ 替换 $e_{e_{i-3}}$。
- 对所有 16 个元素进行完整的傅里叶变换。
- 消除多项式递归中的零乘数。
- 颠倒 FFT-Hash I 中步骤 1 和步骤 2 的顺序。
3. 函数 g 的设计原则
函数 $g$ 的多项式递归位于过程的两端,为步骤 2 的线性变换形成了一个外壳。步骤 1 和步骤 3 各自生成一个多项式变换,使得输出的每个坐标都是输入坐标的至少 229976 次多项式。这种高次多项式变换使得在最坏情况下,通过操纵输入的前半部分来强制输出后半部分的特定模式变得困难。
4. 评估 g 的成本
评估函数 $g$ 的成本主要包括傅里叶变换和多项式递归的计算。具体如下:
| 操作类型 | 数量 |
| ---- | ---- |
| 模 p 加法 | 112 次 |
| 模 p 乘法 | 32 次 |
| 模 p 移位 | 48 次 |
| 总操作次数 | 192 次 |
5. 部分碰撞和完全碰撞的构造
5.1 部分碰撞的构造
通过一系列计算,找到消息 $M_1$ 和 $M_1’$,使得它们的哈希值部分碰撞。具体来说,找到满足 $c_{I4} = c_0 = c_{I4}’ = c_0’ = 0$ 的消息 $M_1$,其概率略小于 $1 / 16.2 = 2^{-4.47}$。而这样的消息 $M_1$ 导致部分碰撞的概率接近 $1 / 8$。大约需要 $2^{23}$ 次 $g$ 函数的部分计算才能得到合适的消息 $M_1$。
5.2 完全碰撞的构造
为了找到 128 位消息 $M_2$,使得之前获得的哈希值 $H_1$ 和 $H_1’$ 与 $M_2$ 组合后产生相同的哈希值 $H_2$,即 $g(H_1, M_2) = g(H_1’, M_2)$,搜索 $M_2$ 分为两个主要步骤:
-
步骤 1:选择 $c_8, c_{10}, c_{12}, c_{14}, c_9$
- 随机选取 $c_{14}$ 的值。
- 通过求解线性系统,从 $c_{14}$ 推导出 $c_8, c_{10}, c_{12}$ 的值。
- 进行初步计算,将 $c_9, c_{11}$ 和 $c_{15}$ 设置为临时值 0,$c_{13}$ 设置为临时值 14,记录得到的 $c_6$ 值。
- 若 $c_8, c_{10}, c_{12}, c_{14}$ 是某些方程的解,并且 $c_9 = p - 6, c_{11} = 0, c_{13} = 14, c_{15} = 0$ 满足一定条件,则对于任意 $c_{13} \geq 14$ 和 $c_{15} \neq 0$,有特定的结果。
-
步骤 2:选择 $c_{11}, c_{13}, c_{15}$
- 从步骤 1 中获取 $c_8, c_{10}, c_{12}, c_{14}, c_9$ 的值,并假设它们满足上述条件。
- 随机选取 $c_{11}$ 的值,将 $c_{13}$ 设置为临时值 14,$c_{15}$ 设置为临时值 0。
- 进行初步计算,记录 $c_{12}$ 和 $c_8$ 的值。
- 根据初步计算结果,调整 $c_{13}$ 的临时值 $\Delta c_{13}$,并考虑 $c_{15}$ 的新值 $c_{15} + \Delta c_{15}$。选择 $\Delta c_{13}$ 使得 $e_8 + \Delta e_8$ 有很大概率等于 -2。
通过多次试验,大约需要 $2^{23}$ 次 $g$ 函数的总计算才能得到产生完全碰撞的消息 $M_2$。
6. 实现细节
该攻击方法使用非优化的 Pascal 程序实现。在 SUN3 工作站上搜索碰撞需要几个小时,在 SPARC 工作站上则不到一个小时。文中还提供了两个碰撞消息 $M_1M_2$ 和 $M_1’M_2$ 的中间计算细节。
7. 安全分析
FFT-Hash II 算法利用了 FFT-Hashing 算法的两个弱点:
- 递归式 $c_i := c_i + c_{i-1}c_{i-2} + c_{i-3} + 2^i (\text{mod } p)$ 中某些项对算法安全性有负面影响。
- 算法的扩散效果有限,特别是 FFT 只作用于部分中间值。
这些弱点表明,对算法进行一些简单的修改可能会显著提高其安全性。
综上所述,FFT-Hash II 算法通过离散傅里叶变换和多项式递归实现了高效的哈希计算,但仍存在一些安全弱点需要进一步改进。未来的研究可以针对这些弱点进行优化,以提高算法的安全性和性能。
以下是搜索 $M_2$ 的步骤流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(步骤 1: 选择 c8, c10, c12, c14, c9):::process
B --> C(随机选取 c14 的值):::process
C --> D(求解线性系统得到 c8, c10, c12 的值):::process
D --> E(初步计算,记录 c6 的值):::process
E --> F{是否满足条件?}:::decision
F -- 是 --> G(步骤 2: 选择 c11, c13, c15):::process
F -- 否 --> C
G --> H(随机选取 c11 的值):::process
H --> I(设置 c13 和 c15 的临时值):::process
I --> J(初步计算,记录 c12 和 c8 的值):::process
J --> K(调整 c13 和 c15 的值):::process
K --> L{是否满足条件?}:::decision
L -- 是 --> M([结束,得到 M2]):::startend
L -- 否 --> H
通过以上分析,我们对 FFT-Hash II 算法有了更深入的理解,为进一步研究和改进密码哈希算法提供了有价值的参考。
FFT-Hash II:高效密码哈希算法解析
8. 函数 g 的可逆性及变体
函数 $g$ 具有易逆性,因为其步骤 1 - 3 可轻松反转。我们可以通过对输出元素 $e_8, \ldots, e_{15}$ 补充任意元素 $e_0, \ldots, e_7$,然后对 $e_0, \ldots, e_7, e_8, \ldots, e_{15}$ 反转步骤 1 - 3 来找到 $g$ 的对应输入。若反转后得到的元素在区间 $[0, 2^{16} - 1]$ 内,就找到了 $(e_8, \ldots, e_{15})$ 对于 $g$ 的逆像。
不过,函数 $g$ 的易逆性并不一定意味着哈希函数 $h$ 存在弱点,因为它不会产生以 $H_0 \in {0, 1}^{128}$ 为前缀的逆像。
此外,还有一些保持 $g$ 可逆性的变体:
-
变体 1
:将 $g$ 算法的步骤 1 和 3 替换为 $e_i := e_i + f(e_0, \ldots, e_{i - 1}, e_{i + 1}, \ldots, e_{15}, i) \text{ mod } p$,其中 $f$ 是任意函数。对于任何这样的 $f$,$g$ 算法的步骤 1、2、3 仍然可逆。
-
变体 2
:使用递归 $e_i := e_i \oplus f(e_0, \ldots, e_{i - 1}, e_{i + 1}, \ldots, e_{15}, i) \text{ mod } p$,其中 $\oplus$ 定义为:设 $x, y \in \mathbb{Z}
p$,$x = \sum
{i = 0}^{16} 2^i x_i$,$y = \sum_{i = 0}^{16} 2^i y_i$,则 $x \oplus y = \sum_{i = 0}^{16} 2^i (x_i + y_i \text{ mod } 2) \text{ mod } p$。由于 $\oplus$ 具有结合性,$g$ 算法的步骤 1 和 3 仍然可逆。
9. 将 g 转换为大概率无碰撞的函数
有一种简单的启发式方法可以将 $g$ 转换为大概率无碰撞的函数 $\tilde{g}$。具体做法是在计算过程中插入步骤 4:
Step 4.
e_i := e_i + e_{i - p}(\text{mod } p) for i = 8, ..., 15.
10. 总结与展望
FFT-Hash II 算法作为一种新型的密码哈希算法,具有一定的优势和特点。它通过离散傅里叶变换和多项式递归实现了信息的扩散和局部随机性的生成,在一定程度上保障了哈希计算的效率。然而,该算法也存在一些安全弱点,如递归式中某些项对安全性的负面影响以及扩散效果有限等问题。
为了提高 FFT-Hash II 算法的安全性和性能,可以考虑以下改进方向:
-
优化递归式
:对递归式 $c_i := c_i + c_{i - 1}c_{i - 2} + c_{i - 3} + 2^i (\text{mod } p)$ 进行调整,减少其对安全性的负面影响。
-
增强扩散效果
:改进算法的扩散机制,使信息能够更全面地在中间值中传播,避免 FFT 只作用于部分中间值的问题。
-
结合其他技术
:可以结合其他密码学技术,如混淆和扩散的更复杂组合,进一步提高算法的安全性。
以下是 FFT-Hash II 算法的整体流程表格:
| 步骤 | 操作内容 |
| ---- | ---- |
| 消息填充 | 在消息末尾添加“1”位,若干“0”位和消息原始长度的二进制表示,使其长度为 128 位的倍数 |
| 初始值设置 | 设置初始值 $H_0 = 0123\ 4567\ 89ab\ cdef\ fedc\ ba98\ 7654\ 3210$ |
| 哈希计算 | 通过函数 $g$ 对消息块和中间哈希值进行迭代计算 |
| 碰撞构造 | 包括部分碰撞和完全碰撞的构造过程 |
| 转换为无碰撞函数 | 插入步骤 4 将 $g$ 转换为大概率无碰撞的函数 $\tilde{g}$ |
以下是 FFT-Hash II 算法整体流程的 mermaid 流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(消息填充):::process
B --> C(设置初始值 H0):::process
C --> D(哈希计算: g 函数迭代):::process
D --> E(部分碰撞构造):::process
E --> F(完全碰撞构造):::process
F --> G(转换为无碰撞函数 g~):::process
G --> H([结束,得到哈希值]):::startend
通过对 FFT-Hash II 算法的深入研究和分析,我们可以更好地理解密码哈希算法的设计原理和安全机制,为未来密码学的发展提供有价值的参考。同时,也需要不断探索和改进现有的算法,以应对日益增长的安全挑战。
1676

被折叠的 条评论
为什么被折叠?



