RIPEMD-160 哈希算法的压缩函数设计
字数 2329 2025-12-06 08:21:31

RIPEMD-160 哈希算法的压缩函数设计

RIPEMD-160 是一个输出为 160 位的密码学哈希函数,属于 MD4 家族。与 MD5 和 SHA-1 类似,它采用了 Merkle-Damgård 迭代结构。其核心是压缩函数,它将一个 160 位的状态(5 个 32 位字)和一个 512 位的消息块作为输入,输出一个新的 160 位状态。它的设计特点是采用两条并行的处理线路,最后将结果合并,以增强安全性。

1. 压缩函数的输入与初始化

  • 输入
    1. 当前哈希值 (H):一个 160 位的链值变量,通常表示为 5 个 32 位寄存器:A, B, C, D, E。在初始块处理时,这是由 5 个 32 位初始常量 IV0-IV4 设定的。
    2. 消息块 (M):一个 512 位的待压缩数据块,可以表示为 16 个 32 位字:M[0]M[15]
  • 目标:压缩函数 CF(H, M) 输出一个新的 160 位值 A', B', C', D', E',它将作为下一个消息块的输入哈希值 H'

2. 压缩函数的核心结构:双管线
RIPEMD-160 的核心创新在于其压缩函数内部采用两条并行且设计略有差异的处理管线,通常称为左管线右管线

  • 每条管线本质上是一个类似于 MD5 或 SHA-1 的单向循环函数,对寄存器 (A, B, C, D, E) 进行 5 轮、每轮 16 步(共 80 步)的迭代更新。
  • 每条管线在每一步中,会使用:
    1. 一个非线性布尔函数 f_j (j 表示轮次,从 0 到 4)。
    2. 一个加法常量 K_j (左管线用 KL_j,右管线用 KR_j)。
    3. 消息扩展顺序:每条管线按照不同的固定顺序,从 16 个消息字 M[0..15] 中选取一个字参与当前步的运算。这个顺序是预定义好的,左管线和右管线的顺序不同,确保了消息块中的每个比特在两条管线中都得到充分、复杂的混合。
    4. 一个循环左移位数 s (左管线用 sL,右管线用 sR,每一步的位移数都预先定义好)。

3. 单一步骤的详细过程
让我们以左管线的第 i 步(i 从 0 到 79)为例,看看它如何更新 5 个寄存器 (A, B, C, D, E)。在每一步开始前,寄存器有当前值。

  1. 计算组合函数 F:首先计算一个组合值 X
    X = (A + f_j(B, C, D) + M[r_L(i)] + KL_j) mod 2^32
    其中:
    • A, B, C, D, E 是当前步骤开始时寄存器的值。
    • f_j 是当前轮次 j = i // 16 对应的非线性函数(例如,异或、与非、或非等逻辑运算)。
    • M[r_L(i)] 是根据左管线的消息顺序表 r_L 查到的第 i 步应使用的消息字。r_L(i) 的值在 0 到 15 之间。
    • KL_j 是左管线第 j 轮的加法常量。
    • 所有加法都是模 2^32 加法。
  2. 循环移位与寄存器更新
    • X 进行循环左移 sL(i) 位(sL 是左管线的位移表),得到 X' = ROL_sL(i) (X)
    • 然后更新寄存器:A_new = (E + X') mod 2^32
    • 同时,其他寄存器进行“右向旋转”:
      B_new = A
      C_new = ROL_10 (B)
      D_new = C
      E_new = D
    • 这里的 ROL_10 (B) 表示将 B 循环左移 10 位。这个额外的 10 位移位是 RIPEMD-160 区别于 MD5/SHA-1 的一个特殊设计,增加了扩散性。

右管线的每一步与左管线结构完全相同,但使用自己的非线性函数 g_j、加法常量 KR_j、消息字顺序表 r_R(i) 和循环左移表 sR(i),独立地对另一组寄存器 (A', B', C', D', E') 进行更新。初始化时,(A', B', C', D', E') = (A, B, C, D, E)

4. 两条管线的合并
在完成全部 80 步迭代后:

  • 左管线产生了最终的寄存器值 (A, B, C, D, E)
  • 右管线产生了最终的寄存器值 (A', B', C', D', E')
  • 合并过程是交叉相加
    C_final = (C + D') mod 2^32
    D_final = (D + E') mod 2^32
    E_final = (E + A') mod 2^32
    A_final = (A + B') mod 2^32
    B_final = (B + C') mod 2^32
  • 最终输出:压缩函数 CF(H, M) 的输出就是这 5 个新的 32 位字 (A_final, B_final, C_final, D_final, E_final)

5. 与 SHA-1 的简要对比
RIPEMD-160 的双管线设计使其与 SHA-1 的单管线结构在抗攻击能力上有所不同。这种并行的、不对称的设计,使得寻找能使两条管线同时产生期望冲突的输入消息变得极其困难。尽管在速度上不如 SHA-256 家族,但在需要 160 位输出的场景中,RIPEMD-160 因其更强的抗碰撞性(特别是对比于已破的 MD5 和存在理论弱点的 SHA-1)而备受信任,至今仍被广泛用于比特币地址生成等关键应用中。

总而言之,RIPEMD-160 的压缩函数通过精心设计的两条并行、参数各异的处理线路,以及对中间状态的复杂移位和交叉合并,实现了强大的单向性和抗碰撞性。

RIPEMD-160 哈希算法的压缩函数设计 RIPEMD-160 是一个输出为 160 位的密码学哈希函数,属于 MD4 家族。与 MD5 和 SHA-1 类似,它采用了 Merkle-Damgård 迭代结构。其核心是压缩函数,它将一个 160 位的状态(5 个 32 位字)和一个 512 位的消息块作为输入,输出一个新的 160 位状态。它的设计特点是采用两条并行的处理线路,最后将结果合并,以增强安全性。 1. 压缩函数的输入与初始化 输入 : 当前哈希值 (H) :一个 160 位的链值变量,通常表示为 5 个 32 位寄存器: A, B, C, D, E 。在初始块处理时,这是由 5 个 32 位初始常量 IV0-IV4 设定的。 消息块 (M) :一个 512 位的待压缩数据块,可以表示为 16 个 32 位字: M[0] 到 M[15] 。 目标 :压缩函数 CF(H, M) 输出一个新的 160 位值 A', B', C', D', E' ,它将作为下一个消息块的输入哈希值 H' 。 2. 压缩函数的核心结构:双管线 RIPEMD-160 的核心创新在于其压缩函数内部采用两条并行且设计略有差异的处理管线,通常称为 左管线 和 右管线 。 每条管线本质上是一个类似于 MD5 或 SHA-1 的单向循环函数,对寄存器 (A, B, C, D, E) 进行 5 轮、每轮 16 步(共 80 步)的迭代更新。 每条管线在每一步中,会使用: 一个非线性布尔函数 f_j (j 表示轮次,从 0 到 4)。 一个加法常量 K_j (左管线用 KL_j ,右管线用 KR_j )。 消息扩展顺序 :每条管线按照不同的固定顺序,从 16 个消息字 M[0..15] 中选取一个字参与当前步的运算。这个顺序是预定义好的,左管线和右管线的顺序不同,确保了消息块中的每个比特在两条管线中都得到充分、复杂的混合。 一个循环左移位数 s (左管线用 sL ,右管线用 sR ,每一步的位移数都预先定义好)。 3. 单一步骤的详细过程 让我们以左管线的第 i 步(i 从 0 到 79)为例,看看它如何更新 5 个寄存器 (A, B, C, D, E) 。在每一步开始前,寄存器有当前值。 计算组合函数 F :首先计算一个组合值 X 。 X = (A + f_j(B, C, D) + M[r_L(i)] + KL_j) mod 2^32 其中: A, B, C, D, E 是当前步骤开始时寄存器的值。 f_j 是当前轮次 j = i // 16 对应的非线性函数(例如,异或、与非、或非等逻辑运算)。 M[r_L(i)] 是根据左管线的消息顺序表 r_L 查到的第 i 步应使用的消息字。 r_L(i) 的值在 0 到 15 之间。 KL_j 是左管线第 j 轮的加法常量。 所有加法都是模 2^32 加法。 循环移位与寄存器更新 : 对 X 进行循环左移 sL(i) 位( sL 是左管线的位移表),得到 X' = ROL_sL(i) (X) 。 然后更新寄存器: A_new = (E + X') mod 2^32 同时,其他寄存器进行“右向旋转”: B_new = A C_new = ROL_10 (B) D_new = C E_new = D 这里的 ROL_10 (B) 表示将 B 循环左移 10 位。这个额外的 10 位移位是 RIPEMD-160 区别于 MD5/SHA-1 的一个特殊设计,增加了扩散性。 右管线的每一步与左管线结构完全相同,但使用自己的非线性函数 g_j 、加法常量 KR_j 、消息字顺序表 r_R(i) 和循环左移表 sR(i) ,独立地对另一组寄存器 (A', B', C', D', E') 进行更新。初始化时, (A', B', C', D', E') = (A, B, C, D, E) 。 4. 两条管线的合并 在完成全部 80 步迭代后: 左管线产生了最终的寄存器值 (A, B, C, D, E) 。 右管线产生了最终的寄存器值 (A', B', C', D', E') 。 合并过程是 交叉相加 : C_final = (C + D') mod 2^32 D_final = (D + E') mod 2^32 E_final = (E + A') mod 2^32 A_final = (A + B') mod 2^32 B_final = (B + C') mod 2^32 最终输出 :压缩函数 CF(H, M) 的输出就是这 5 个新的 32 位字 (A_final, B_final, C_final, D_final, E_final) 。 5. 与 SHA-1 的简要对比 RIPEMD-160 的双管线设计使其与 SHA-1 的单管线结构在抗攻击能力上有所不同。这种并行的、不对称的设计,使得寻找能使两条管线同时产生期望冲突的输入消息变得极其困难。尽管在速度上不如 SHA-256 家族,但在需要 160 位输出的场景中,RIPEMD-160 因其更强的抗碰撞性(特别是对比于已破的 MD5 和存在理论弱点的 SHA-1)而备受信任,至今仍被广泛用于比特币地址生成等关键应用中。 总而言之,RIPEMD-160 的压缩函数通过精心设计的两条并行、参数各异的处理线路,以及对中间状态的复杂移位和交叉合并,实现了强大的单向性和抗碰撞性。