杂凑函数之SHA-256学习笔记
—
SHA-256是安全散列算法(Secure Hash Algorithm)的256位版本,属于SHA-2(SHA第二版)系列的一部分。它是一个加密散列函数,用于生成一个固定长度(256位,即32字节)的散列值,通常表示为一个64位的十六进制字符串。SHA-256被设计用来替代旧的SHA-1算法,因为它提供了更高的安全性。
算法详解
输入: 0 < L < 2 64 0<L<2^{64} 0<L<264
输出:256bit的消息摘要
一.预处理
1.消息填充
填充消息也就是进行补位操作,第一位补1,其余位补足够的0,直到满足 L m o d 512 = 448 L \ mod \ 512 = 448 L mod 512=448。
这里有一个问题,那就是为什么要补这个数量的0呢?答案就是剩余的 512 − 448 = 64 512-448=64 512−448=64位,要存储消息的长度。
一个消息填充的示例如下图:
2.填充消息解析
将填充后的消息分成 N 个512-bit的信息块,可以表示为 M ( 1 ) M^{(1)} M(1), M ( 2 ) M^{(2)} M(2),…, M ( N ) M^{(N)} M(N)。因为512bits的信息块可以表示为16个32-bitz字,所以第i个信息块可以表示为 M 0 ( i ) M^{(i)}_0 M0(i), M 1 ( i ) M^{(i)}_1 M1(i),…, M 15 ( i ) M^{(i)}_{15} M15(i)。
3.设置初始哈希值
初始哈希值 H ( 0 ) H^{(0)} H(0)由以下8个32-bit字组成。
H 0 ( 0 ) = 6 a 09 e 667 H^{(0)}_0=6a09e667 H0(0)=6a09e667
H 1 ( 0 ) = b b 67 a e 85 H^{(0)}_1=bb67ae85 H1(0)=bb67ae85
H 2 ( 0 ) = 3 c 6 e f 372 H^{(0)}_2=3c6ef372 H2(0)=3c6ef372
H 3 ( 0 ) = a 54 f f 53 a H^{(0)}_3=a54ff53a H3(0)=a54ff53a
H 4 ( 0 ) = 510 e 527 f H^{(0)}_4=510e527f H4(0)=510e527f
H 5 ( 0 ) = 9 b 05688 c H^{(0)}_5=9b05688c H5(0)=9b05688c
H 6 ( 0 ) = 1 f 83 d 9 a b H^{(0)}_6=1f83d9ab H6(0)=1f83d9ab
H 7 ( 0 ) = 5 b e 0 c d 19 H^{(0)}_7=5be0cd19 H7(0)=5be0cd19
二.计算
预处理完成后,每个消息块 M ( 1 ) M^{(1)} M(1), M ( 2 ) M^{(2)} M(2),…, M ( N ) M^{(N)} M(N)按照以下顺序进行处理。
1.准备消息表
准备消息表 W t {W_t} Wt
W t = { M t ( i ) , 0 ≤ t ≤ 15 σ 1 { 256 } ( W t − 2 ) + W t − 7 + σ 0 { 256 } ( W t − 15 ) + W t − 16 , 16 ≤ t ≤ 63 {W_t} = \begin{cases} M^{(i)}_t, & \qquad 0 \le t \le 15 \\ \sigma^{\{256\}}_1{(W_{t-2})+W_{t-7}+ \sigma^{\{256\}}_0{(W_{t-15})}+W_{t-16}}, & \qquad 16 \le t \le 63 \end{cases} Wt={Mt(i),σ1{256}(Wt−2)+Wt−7+σ0{256}(Wt−15)+Wt−16,0≤t≤1516≤t≤63
其中 R O T L ROTL ROTL为左移位运算。
2.初始化工作变量
初始化 a , b , c , d , e , f , g , h a,b,c,d,e,f,g,h a,b,c,d,e,f,g,h八个工作变量
a = H 0 ( i − 1 ) a=H^{(i-1)}_0 a=H0(i−1)
b = H 1 ( i − 1 ) b=H^{(i-1)}_1 b=H1(i−1)
c = H 2 ( i − 1 ) c=H^{(i-1)}_2 c=H2(i−1)
d = H 3 ( i − 1 ) d=H^{(i-1)}_3 d=H3(i−1)
e = H 4 ( i − 1 ) e=H^{(i-1)}_4 e=H4(i−1)
f = H 5 ( i − 1 ) f=H^{(i-1)}_5 f=H5(i−1)
g = H 6 ( i − 1 ) g=H^{(i-1)}_6 g=H6(i−1)
h = H 7 ( i − 1 ) h=H^{(i-1)}_7 h=H7(i−1)
3.执行80轮运算
由准备消息表中可知,t的数值范围为0到63,则根据t的数值,进行64轮运算,每轮运算执行以下计算:
T 1 = h + Σ 1 { 256 } ( e ) + C h ( e , f , g ) + K t { 256 } + W t T_1=h+\Sigma ^{\{256\}}_1(e)+Ch(e,f,g)+ K^{\{256\}}_t+W_t T1=h+Σ1{256}(e)+Ch(e,f,g)+Kt{256}+Wt
T 2 = Σ 0 { 256 } ( a ) + M a j ( a , b , c ) T_2=\Sigma ^{\{256\}}_0(a)+Maj(a,b,c) T2=Σ0{256}(a)+Maj(a,b,c)
h = g h=g h=g
g = f g=f g=f
f = e f=e f=e
e = d + T 1 e=d+T_1 e=d+T1
d = c d=c d=c
c = b c=b c=b
b = a b=a b=a
a = T 1 + T 2 a=T_1+T_2 a=T1+T2
其中涉及的有关运算如下:
C h ( x , y , z ) = ( x ∧ y ) ⊕ ( x ∧ z ) Ch(x,y,z) \ = \ (x \land y) \oplus (x \land z) Ch(x,y,z) = (x∧y)⊕(x∧z)
M a j ( x , y , z ) = ( x ∧ y ) ⊕ ( x ∧ z ) ⊕ ( y ∧ z ) Maj(x,y,z) \ = \ (x \land y) \oplus (x \land z) \oplus (y \land z) Maj(x,y,z) = (x∧y)⊕(x∧z)⊕(y∧z)
Σ 0 { 256 } ( x ) = R O T R 2 ( x ) ⊕ R O T R 13 ( x ) ⊕ R O T R 22 ( x ) \Sigma ^{\{256\}}_0(x) \ = \ ROTR^2 (x) \oplus ROTR^{13}(x) \oplus ROTR^{22}(x) Σ0{256}(x) = ROTR2(x)⊕ROTR13(x)⊕ROTR22(x)
Σ 1 { 256 } ( x ) = R O T R 6 ( x ) ⊕ R O T R 11 ( x ) ⊕ R O T R 25 ( x ) \Sigma ^{\{256\}}_1(x) \ = \ ROTR^6 (x) \oplus ROTR^{11}(x) \oplus ROTR^{25}(x) Σ1{256}(x) = ROTR6(x)⊕ROTR11(x)⊕ROTR25(x)
S 0 { 256 } ( x ) = R O T R 7 ( x ) ⊕ R O T R 18 ( x ) ⊕ S H R 3 ( x ) S ^{\{256\}}_0(x) \ = \ ROTR^7 (x) \oplus ROTR^{18}(x) \oplus SHR^{3}(x) S0{256}(x) = ROTR7(x)⊕ROTR18(x)⊕SHR3(x)
S 1 { 256 } ( x ) = R O T R 17 ( x ) ⊕ R O T R 19 ( x ) ⊕ S H R 10 ( x ) S ^{\{256\}}_1(x) \ = \ ROTR^{17} (x) \oplus ROTR^{19}(x) \oplus SHR^{10}(x) S1{256}(x) = ROTR17(x)⊕ROTR19(x)⊕SHR10(x)
K
0
{
256
}
,
K
1
{
256
}
,
.
.
.
,
K
63
{
256
}
K^{\{256\}}_0,K^{\{256\}}_1,...,K^{\{256\}}_{63}
K0{256},K1{256},...,K63{256}的值为:
428
a
2
f
98
71374491
b
5
c
0
f
b
c
f
e
9
b
5
d
b
a
5
3956
c
25
b
59
f
111
f
1
923
f
82
a
4
a
b
1
c
5
e
d
5
428a2f98\quad 71374491 \quad b5c0fbcf \quad e9b5dba5 \quad3956c25b \quad59f111f1\quad 923f82a4 \quad ab1c5ed5
428a2f9871374491b5c0fbcfe9b5dba53956c25b59f111f1923f82a4ab1c5ed5
d 807 a a 98 12835 b 01 243185 b e 550 c 7 d c 3 72 b e 5 d 74 80 d e b 1 f e 9 b d c 06 a 7 c 19 b f 174 d807aa98\quad 12835b01 \quad243185be \quad550c7dc3 \quad 72be5d74\quad 80deb1fe \quad 9bdc06a7 \quad c19bf174 d807aa9812835b01243185be550c7dc372be5d7480deb1fe9bdc06a7c19bf174
e 49 b 69 c 1 e f b e 4786 0 f c 19 d c 6 240 c a 1 c c 2 d e 92 c 6 f 4 a 7484 a a 5 c b 0 a 9 d c 76 f 988 d a e49b69c1\quad efbe4786\quad 0fc19dc6\quad 240ca1cc \quad2de92c6f\quad 4a7484aa\quad 5cb0a9dc \quad76f988da e49b69c1efbe47860fc19dc6240ca1cc2de92c6f4a7484aa5cb0a9dc76f988da
983 e 5152 a 831 c 66 d b 00327 c 8 b f 597 f c 7 c 6 e 00 b f 3 d 5 a 79147 06 c a 6351 14292967 983e5152\quad a831c66d\quad b00327c8 \quad bf597fc7 \quad c6e00bf3\quad d5a79147\quad 06ca6351 \quad14292967 983e5152a831c66db00327c8bf597fc7c6e00bf3d5a7914706ca635114292967
27 b 70 a 85 2 e 1 b 2138 4 d 2 c 6 d f c 53380 d 13 650 a 7354 766 a 0 a b b 81 c 2 c 92 e 92722 c 85 27b70a85\quad 2e1b2138 \quad4d2c6dfc\quad 53380d13\quad 650a7354\quad 766a0abb \quad 81c2c92e \quad 92722c85 27b70a852e1b21384d2c6dfc53380d13650a7354766a0abb81c2c92e92722c85
a 2 b f e 8 a 1 a 81 a 664 b c 24 b 8 b 70 c 76 c 51 a 3 d 192 e 819 d 6990624 f 40 e 3585 106 a a 070 a2bfe8a1 \quad a81a664b\quad c24b8b70\quad c76c51a3 \quad d192e819\quad d6990624\quad f40e3585\quad 106aa070 a2bfe8a1a81a664bc24b8b70c76c51a3d192e819d6990624f40e3585106aa070
19 a 4 c 116 1 e 376 c 08 2748774 c 34 b 0 b c b 5 391 c 0 c b 3 4 e d 8 a a 4 a 5 b 9 c c a 4 f 682 e 6 f f 3 19a4c116 \quad1e376c08 \quad2748774c\quad 34b0bcb5\quad 391c0cb3\quad 4ed8aa4a\quad 5b9cca4f \quad 682e6ff3 19a4c1161e376c082748774c34b0bcb5391c0cb34ed8aa4a5b9cca4f682e6ff3
748 f 82 e e 78 a 5636 f 84 c 87814 8 c c 70208 90 b e f f f a a 4506 c e b b e f 9 a 3 f 7 c 67178 f 2 748f82ee \quad78a5636f \quad84c87814\quad 8cc70208\quad 90befffa\quad a4506ceb \quad bef9a3f7\quad c67178f2 748f82ee78a5636f84c878148cc7020890befffaa4506cebbef9a3f7c67178f2
4.计算中间哈希值
计算中间哈希值 H ( i ) H^{(i)} H(i)
H 0 ( i ) = a + H 0 ( i − 1 ) H^{(i)}_0=a+H^{(i-1)}_0 H0(i)=a+H0(i−1)
H 1 ( i ) = b + H 1 ( i − 1 ) H^{(i)}_1=b+H^{(i-1)}_1 H1(i)=b+H1(i−1)
H 2 ( i ) = c + H 2 ( i − 1 ) H^{(i)}_2=c+H^{(i-1)}_2 H2(i)=c+H2(i−1)
H 3 ( i ) = d + H 3 ( i − 1 ) H^{(i)}_3=d+H^{(i-1)}_3 H3(i)=d+H3(i−1)
H 4 ( i ) = e + H 4 ( i − 1 ) H^{(i)}_4=e+H^{(i-1)}_4 H4(i)=e+H4(i−1)
H 5 ( i ) = f + H 5 ( i − 1 ) H^{(i)}_5=f+H^{(i-1)}_5 H5(i)=f+H5(i−1)
H 6 ( i ) = g + H 6 ( i − 1 ) H^{(i)}_6=g+H^{(i-1)}_6 H6(i)=g+H6(i−1)
H 7 ( i ) = h + H 7 ( i − 1 ) H^{(i)}_7=h+H^{(i-1)}_7 H7(i)=h+H7(i−1)
三.最终结果
在重复进行上述计算过程N次后,消息M的160-bit消息摘要为
H 0 ( N ) ∥ H 1 ( N ) ∥ H 2 ( N ) ∥ H 3 ( N ) ∥ H 4 ( N ) ∥ H 5 ( N ) ∥ H 6 ( N ) ∥ H 7 ( N ) H^{(N)}_0 \parallel H^{(N)}_1 \parallel H^{(N)}_2 \parallel H^{(N)}_3 \parallel H^{(N)}_4 \parallel H^{(N)}_5 \parallel H^{(N)}_6 \parallel H^{(N)}_7 H0(N)∥H1(N)∥H2(N)∥H3(N)∥H4(N)∥H5(N)∥H6(N)∥H7(N)
参考资料
参考文档:Secure Hash Standard