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

29 阅读2分钟

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

---

SHA-256是安全散列算法(Secure Hash Algorithm)的256位版本,属于SHA-2(SHA第二版)系列的一部分。它是一个加密散列函数,用于生成一个固定长度(256位,即32字节)的散列值,通常表示为一个64位的十六进制字符串。SHA-256被设计用来替代旧的SHA-1算法,因为它提供了更高的安全性。

算法详解

输入:0<L<2640<L<2^{64}

输出:256bit的消息摘要

一.预处理

1.消息填充

填充消息也就是进行补位操作,第一位补1,其余位补足够的0,直到满足L mod 512=448L \ mod \ 512 = 448

这里有一个问题,那就是为什么要补这个数量的0呢?答案就是剩余的512448=64512-448=64位,要存储消息的长度。

一个消息填充的示例如下图:

2.填充消息解析

将填充后的消息分成 N 个512-bit的信息块,可以表示为M(1)M^{(1)}M(2)M^{(2)},...,M(N)M^{(N)}。因为512bits的信息块可以表示为16个32-bitz字,所以第i个信息块可以表示为M0(i)M^{(i)}_0M1(i)M^{(i)}_1,...,M15(i)M^{(i)}_{15}

3.设置初始哈希值

初始哈希值H(0)H^{(0)}由以下8个32-bit字组成。

H0(0)=6a09e667H^{(0)}_0=6a09e667

H1(0)=bb67ae85H^{(0)}_1=bb67ae85

H2(0)=3c6ef372H^{(0)}_2=3c6ef372

H3(0)=a54ff53aH^{(0)}_3=a54ff53a

H4(0)=510e527fH^{(0)}_4=510e527f

H5(0)=9b05688cH^{(0)}_5=9b05688c

H6(0)=1f83d9abH^{(0)}_6=1f83d9ab

H7(0)=5be0cd19H^{(0)}_7=5be0cd19

二.计算

预处理完成后,每个消息块M(1)M^{(1)}M(2)M^{(2)},...,M(N)M^{(N)}按照以下顺序进行处理。

1.准备消息表

准备消息表Wt{W_t}

Wt={Mt(i),0t15σ1{256}(Wt2)+Wt7+σ0{256}(Wt15)+Wt16,16t63{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}

其中ROTLROTL为左移位运算。

2.初始化工作变量

初始化a,b,c,d,e,f,g,ha,b,c,d,e,f,g,h八个工作变量

a=H0(i1)a=H^{(i-1)}_0

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

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

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

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

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

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

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

3.执行80轮运算

由准备消息表中可知,t的数值范围为0到63,则根据t的数值,进行64轮运算,每轮运算执行以下计算:

T1=h+Σ1{256}(e)+Ch(e,f,g)+Kt{256}+WtT_1=h+\Sigma ^{\{256\}}_1(e)+Ch(e,f,g)+ K^{\{256\}}_t+W_t

T2=Σ0{256}(a)+Maj(a,b,c)T_2=\Sigma ^{\{256\}}_0(a)+Maj(a,b,c)

h=gh=g

g=fg=f

f=ef=e

e=d+T1e=d+T_1

d=cd=c

c=bc=b

b=ab=a

a=T1+T2a=T_1+T_2

其中涉及的有关运算如下:

Ch(x,y,z) = (xy)(xz)Ch(x,y,z) \ = \ (x \land y) \oplus (x \land z)

Maj(x,y,z) = (xy)(xz)(yz)Maj(x,y,z) \ = \ (x \land y) \oplus (x \land z) \oplus (y \land z)

Σ0{256}(x) = ROTR2(x)ROTR13(x)ROTR22(x)\Sigma ^{\{256\}}_0(x) \ = \ ROTR^2 (x) \oplus ROTR^{13}(x) \oplus ROTR^{22}(x)

Σ1{256}(x) = ROTR6(x)ROTR11(x)ROTR25(x)\Sigma ^{\{256\}}_1(x) \ = \ ROTR^6 (x) \oplus ROTR^{11}(x) \oplus ROTR^{25}(x)

S0{256}(x) = ROTR7(x)ROTR18(x)SHR3(x)S ^{\{256\}}_0(x) \ = \ ROTR^7 (x) \oplus ROTR^{18}(x) \oplus SHR^{3}(x)

S1{256}(x) = ROTR17(x)ROTR19(x)SHR10(x)S ^{\{256\}}_1(x) \ = \ ROTR^{17} (x) \oplus ROTR^{19}(x) \oplus SHR^{10}(x)

K0{256},K1{256},...,K63{256}K^{\{256\}}_0,K^{\{256\}}_1,...,K^{\{256\}}_{63}的值为: 428a2f9871374491b5c0fbcfe9b5dba53956c25b59f111f1923f82a4ab1c5ed5428a2f98\quad 71374491 \quad b5c0fbcf \quad e9b5dba5 \quad3956c25b \quad59f111f1\quad 923f82a4 \quad ab1c5ed5

d807aa9812835b01243185be550c7dc372be5d7480deb1fe9bdc06a7c19bf174d807aa98\quad 12835b01 \quad243185be \quad550c7dc3 \quad 72be5d74\quad 80deb1fe \quad 9bdc06a7 \quad c19bf174

e49b69c1efbe47860fc19dc6240ca1cc2de92c6f4a7484aa5cb0a9dc76f988dae49b69c1\quad efbe4786\quad 0fc19dc6\quad 240ca1cc \quad2de92c6f\quad 4a7484aa\quad 5cb0a9dc \quad76f988da

983e5152a831c66db00327c8bf597fc7c6e00bf3d5a7914706ca635114292967983e5152\quad a831c66d\quad b00327c8 \quad bf597fc7 \quad c6e00bf3\quad d5a79147\quad 06ca6351 \quad14292967

27b70a852e1b21384d2c6dfc53380d13650a7354766a0abb81c2c92e92722c8527b70a85\quad 2e1b2138 \quad4d2c6dfc\quad 53380d13\quad 650a7354\quad 766a0abb \quad 81c2c92e \quad 92722c85

a2bfe8a1a81a664bc24b8b70c76c51a3d192e819d6990624f40e3585106aa070a2bfe8a1 \quad a81a664b\quad c24b8b70\quad c76c51a3 \quad d192e819\quad d6990624\quad f40e3585\quad 106aa070

19a4c1161e376c082748774c34b0bcb5391c0cb34ed8aa4a5b9cca4f682e6ff319a4c116 \quad1e376c08 \quad2748774c\quad 34b0bcb5\quad 391c0cb3\quad 4ed8aa4a\quad 5b9cca4f \quad 682e6ff3

748f82ee78a5636f84c878148cc7020890befffaa4506cebbef9a3f7c67178f2748f82ee \quad78a5636f \quad84c87814\quad 8cc70208\quad 90befffa\quad a4506ceb \quad bef9a3f7\quad c67178f2

4.计算中间哈希值

计算中间哈希值H(i)H^{(i)}

H0(i)=a+H0(i1)H^{(i)}_0=a+H^{(i-1)}_0

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

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

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

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

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

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

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

三.最终结果

在重复进行上述计算过程N次后,消息M的160-bit消息摘要为

H0(N)H1(N)H2(N)H3(N)H4(N)H5(N)H6(N)H7(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

参考资料

参考文档:Secure Hash Standard