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

128 阅读2分钟

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

算法简介

SHA1(Secure Hash Algorithm 1,安全散列算法1)是一种密码散列函数,由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布为联邦信息处理标准(FIPS)的出版物之一。SHA1算法能够产生一个160位(20字节)的散列值,通常表示为40个十六进制字符。

算法详解

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

输出:160bit的消息摘要

SHA-1算法的主要流程如下图所示:

image.png

一. 预处理

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)}由以下五个32-bit字组成。

H0(0)=67452301H^{(0)}_0=67452301

H1(0)=efcdab89H^{(0)}_1=efcdab89

H2(0)=98badcfeH^{(0)}_2=98badcfe

H3(0)=10325476H^{(0)}_3=10325476

H4(0)=c3d2e1f0H^{(0)}_4=c3d2e1f0

二.计算

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

1.准备消息表

准备消息表Wt{W_t}

Wt={Mt(i),0t15ROTL1(Wt3Wt8Wt14Wt16),16t79{W_t} = \begin{cases} M^{(i)}_t, & \qquad 0 \le t \le 15 \\ ROTL^1{(W_{t-3} \oplus W_{t-8} \oplus W_{t-14} \oplus W_{t-16})}, & \qquad 16 \le t \le 79 \end{cases}

其中ROTLROTL为左移位运算。

2.初始化工作变量

初始化a,b,c,d,ea,b,c,d,e五个工作变量

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

3.执行80轮运算

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

T=ROTL5(a)+ft(b,c,d)+e+Kt+WtT=ROTL^5{(a)}+f_t{(b,c,d)}+e+K_t+W_t

e=de=d

d=cd=c

c=ROTL30(b)c=ROTL^{30}{(b)}

b=ab=a

a=Ta=T

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

Kt={5a8279990t196ed9eba120t398f1bbcdc40t59ca62c1d660t79K_t= \begin{cases} 5a827999 & \qquad 0 \le t \le 19 \\ 6ed9eba1 & \qquad 20 \le t \le 39 \\ 8f1bbcdc & \qquad 40 \le t \le 59 \\ ca62c1d6 & \qquad 60 \le t \le 79 \end{cases}

ft(x,y,z)={Ch(x,y,z)=(xy)(xz)0t19Parity(x,y,z)=xyz20t39Maj(x,y,z)=(xy)(xz)(yz)40t59Parity(x,y,z)=xyz20t39f_t{(x,y,z)}= \begin{cases} Ch(x,y,z)=(x \land y) \oplus (\sim x \land z) & \qquad 0 \le t \le 19 \\ Parity(x,y,z)=x \oplus y \oplus z & \qquad 20 \le t \le 39 \\ Maj(x,y,z)=(x \land y) \oplus (x \land z) \oplus (y \land z) & \qquad 40 \le t \le 59 \\ Parity(x,y,z)=x \oplus y \oplus z & \qquad 20 \le t \le 39 \end{cases}

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

三.最终结果

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

H0(N)H1(N)H2(N)H3(N)H4(N)H^{(N)}_0 \parallel H^{(N)}_1 \parallel H^{(N)}_2 \parallel H^{(N)}_3 \parallel H^{(N)}_4

参考资料

参考文档:Secure Hash Standard