杂凑函数之SHA-256学习笔记

杂凑函数之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 512448=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}(Wt2)+Wt7+σ0{256}(Wt15)+Wt16,0t1516t63

其中 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(i1)

b = H 1 ( i − 1 ) b=H^{(i-1)}_1 b=H1(i1)

c = H 2 ( i − 1 ) c=H^{(i-1)}_2 c=H2(i1)

d = H 3 ( i − 1 ) d=H^{(i-1)}_3 d=H3(i1)

e = H 4 ( i − 1 ) e=H^{(i-1)}_4 e=H4(i1)

f = H 5 ( i − 1 ) f=H^{(i-1)}_5 f=H5(i1)

g = H 6 ( i − 1 ) g=H^{(i-1)}_6 g=H6(i1)

h = H 7 ( i − 1 ) h=H^{(i-1)}_7 h=H7(i1)

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) = (xy)(xz)

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) = (xy)(xz)(yz)

Σ 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(i1)

H 1 ( i ) = b + H 1 ( i − 1 ) H^{(i)}_1=b+H^{(i-1)}_1 H1(i)=b+H1(i1)

H 2 ( i ) = c + H 2 ( i − 1 ) H^{(i)}_2=c+H^{(i-1)}_2 H2(i)=c+H2(i1)

H 3 ( i ) = d + H 3 ( i − 1 ) H^{(i)}_3=d+H^{(i-1)}_3 H3(i)=d+H3(i1)

H 4 ( i ) = e + H 4 ( i − 1 ) H^{(i)}_4=e+H^{(i-1)}_4 H4(i)=e+H4(i1)

H 5 ( i ) = f + H 5 ( i − 1 ) H^{(i)}_5=f+H^{(i-1)}_5 H5(i)=f+H5(i1)

H 6 ( i ) = g + H 6 ( i − 1 ) H^{(i)}_6=g+H^{(i-1)}_6 H6(i)=g+H6(i1)

H 7 ( i ) = h + H 7 ( i − 1 ) H^{(i)}_7=h+H^{(i-1)}_7 H7(i)=h+H7(i1)

三.最终结果

在重复进行上述计算过程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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值