SHA-256 哈希算法中 Σ0 和 Σ1 函数的定义、作用与计算过程详解
题目描述
在SHA-256哈希算法的压缩函数中,每一轮计算都会用到两个重要的中间函数,通常称为 Σ0(Sigma0)和 Σ1(Sigma1)。本题要求详细解释这两个函数的数学定义、它们在压缩函数中的具体作用,以及每一步的计算过程。
1. SHA-256压缩函数的整体结构回顾
为了使你理解Σ0和Σ1的上下文,我们先快速回顾SHA-256压缩函数的核心结构。压缩函数处理一个512位的消息块,并更新一个256位的中间哈希值(由8个32位字A, B, C, D, E, F, G, H表示)。
在每一轮(共64轮)计算中,压缩函数会:
- 计算两个中间值:Ch(E, F, G) 和 Maj(A, B, C)。
- 计算两个“求和”函数:Σ0(A) 和 Σ1(E)。
- 使用一个预定义的常数 K_t 和当前消息扩展后的字 W_t。
- 更新临时变量,并最终轮换更新A到H的值。
Σ0和Σ1是其中关键的线性变换部分,它们的作用是引入扩散(diffusion),即让输入字的每一位变化能够扩散到输出的多个位上。
2. Σ0 和 Σ1 的数学定义
这两个函数都作用于一个32位的输入字(记作x),输出也是一个32位的字。它们是通过对输入x进行循环右移(rotate right, 记作 ROTR)和逻辑右移(shift right, 记作 SHR)操作,然后将结果进行异或(XOR, 记作 ⊕)而定义的。
具体定义如下:
- Σ0(x) = ROTR⁽²⁾(x) ⊕ ROTR⁽¹³⁾(x) ⊕ ROTR⁽²²⁾(x)
- Σ1(x) = ROTR⁽⁶⁾(x) ⊕ ROTR⁽¹¹⁾(x) ⊕ ROTR⁽²⁵⁾(x)
关键概念解释:
- 循环右移 (ROTRⁿ): 将32位字视为一个首尾相接的环,整体向右移动n位。右边移出的n位,从左边重新移入。
- 示例(用8位简化说明):设 x =
11010010(二进制),ROTR³(x) 的结果是:最右边的3位010被移出,然后放到最左边,得到01011010。
- 示例(用8位简化说明):设 x =
- 逻辑右移 (SHRⁿ): 将32位字整体向右移动n位,左边空出的n位用0填充。在Σ0和Σ1的定义中,使用的是循环右移,不是逻辑右移。请注意,在SHA-256的消息扩展过程中使用的σ0和σ1函数,才用到了SHR操作,不要与这里的Σ0/Σ1混淆。
- 异或 (⊕): 按位异或操作。对应位相同则输出0,不同则输出1。
3. 计算步骤分解(以Σ0为例)
假设我们有一个具体的32位输入字 A。计算 Σ0(A) 的步骤如下:
步骤1:计算三个循环右移的结果
a = ROTR²(A): 将A的二进制表示向右循环移动2位。b = ROTR¹³(A): 将A的二进制表示向右循环移动13位。c = ROTR²²(A): 将A的二进制表示向右循环移动22位。
步骤2:对三个结果进行异或
4. 结果 = a ⊕ b ⊕ c
由于异或运算满足结合律和交换律,顺序可以任意。
一个微型数值示例(为简化,用8位字演示原理):
设 A = 10110010 (二进制,十进制178)。
-
ROTR²(A):
10110010-> 移出最右10,放到最左 ->10101100 -
ROTR¹³(A): 对8位字,移动13位等价于移动 13 mod 8 = 5位。ROTR⁵(A):
10110010-> 移出最右10010,放到最左 ->01010110 -
ROTR²²(A): 22 mod 8 = 6位。ROTR⁶(A):
10110010-> 移出最右100010,放到最左 ->00101011(注意:这里10110010移出右6位100010后,剩下左2位10,组合后为10001010?更正:应为10110010循环右移6位:将100010移到左边,剩下10在右边,结果为10001010。我们重新计算以确保清晰)
让我们更仔细地手动计算8位示例:
A = b1 0 1 1 0 0 1 0
索引(从高位到低位): 位7 位6 位5 位4 位3 位2 位1 位0
值: 1 0 1 1 0 0 1 0ROTR²: 将最后2位(位1,0:
1 0)移到前面。前6位(位7-位2:1 0 1 1 0 0)移到右边。
结果: (1 0) + (1 0 1 1 0 0) =1 0 1 0 1 1 0 0->10101100(与之前一致)ROTR¹³: 13 mod 8 = 5. ROTR⁵: 将最后5位(位4-位0:
1 0 0 1 0)移到前面。前3位(位7-位5:1 0 1)移到右边。
结果: (1 0 0 1 0) + (1 0 1) =1 0 0 1 0 1 0 1->10010101(修正之前错误)ROTR²²: 22 mod 8 = 6. ROTR⁶: 将最后6位(位5-位0:
1 1 0 0 1 0)移到前面。前2位(位7-位6:1 0)移到右边。
结果: (1 1 0 0 1 0) + (1 0) =1 1 0 0 1 0 1 0->11001010 -
现在计算 Σ0(A) =
10101100⊕10010101⊕11001010- 先计算
10101100 ⊕ 10010101 = 00111001 - 再计算
00111001 ⊕ 11001010 = 11110011
- 先计算
-
所以 Σ0(A) =
11110011(二进制)。
Σ1(E)的计算过程完全类似,只是移动的位数变成了6、11、25。
4. Σ0 和 Σ1 在SHA-256轮函数中的作用
在SHA-256压缩函数的轮函数中,主要更新方程如下(对于轮次t):
T1 = H + Σ1(E) + Ch(E, F, G) + K_t + W_t
T2 = Σ0(A) + Maj(A, B, C)
然后更新:
H = G
G = F
...
A = T1 + T2
作用分析:
- 非线性扩散: Σ0和Σ1是纯线性的比特混合函数(只有循环移位和异或)。它们接收当前状态字(A或E),通过不同距离的循环移位,将输入字的每一个比特散布到输出的多个不同位置上,然后进行组合。这极大地增强了算法的扩散特性,使得输入中任何微小的变化,经过多轮迭代后,能迅速影响到哈希结果的每一个比特。
- 与非线性函数配合: Σ0(A)与非线性函数Maj(A,B,C)相加,Σ1(E)与非线性函数Ch(E,F,G)相加。这种“线性变换+非线性变换”的组合是构建强密码学哈希函数压缩函数的经典模式,同时提供了良好的混淆(confusion)和扩散。
- 打破对称性: 对A和E使用不同的位移常数(2,13,22 和 6,11,25),确保从两个不同路径(经由A的路径和经由E的路径)进行的计算具有不同的扩散模式,增加了算法的复杂性和抗分析能力。
5. 总结
- Σ0 和 Σ1 是SHA-256压缩函数轮计算中的两个关键的、线性的比特混合函数。
- 它们的定义是固定位移量的循环右移操作的异或和:Σ0(x)=ROTR²(x)⊕ROTR¹³(x)⊕ROTR²²(x);Σ1(x)=ROTR⁶(x)⊕ROTR¹¹(x)⊕ROTR²⁵(x)。
- 它们的核心作用是提供强大的比特扩散,与非线性函数Ch、Maj以及加法模2³²运算结合,共同确保SHA-256对输入消息高度敏感,满足密码学哈希函数的安全要求。