SHA-1加密算法原理

SHA-1是一种能够根据上限为2^64位的消息计算出160比特的散列值的单向散列函数,它的分组及对数据的填充方式与MD5是一样的,512位为1组,填充数据时先填1,后面填0,一直填满448位,最后64位表示原始数据长度。

 

1. SHA-1: 填充

以Hello.这条长度为6字节的消息进行填充。

Hello. = 48 65 6C 6C 6F 2E,写成二进制形式如下:

技术分享

01001000 01100101 01101100 01101100 01101111 00101110

原始数据长度为6字节(48位)

 

①. 对数据的填充,一直填满448位

技术分享

01001000 01100101 01101100 01101100 01101111 00101110 1  (先填充1个1)

01001000 01100101 01101100 01101100 01101111 00101110 10000000000000000000000........ (再填充0,一直填满448位)

 

②.  在最末位添加原始数据长度(6字节)

技术分享

01001000 01100101 01101100 01101100 01101111 00101110 10000000000000000000000........ 00000000 (假设到这里填满448位了)

000000000000000000000000000000000000000000000000000000000110000 (末尾增加原始数据长度48位,二进制形式添加)

到此,总共的数据就为512位了

 

2. SHA-1: 计算W0~W79

完成数据的填充后,我们将以输入分组为单位进行下面的处理,这一步要对每个输入分组计算80个32位的值(W0~W79),首先将输入分组的512位分为32位*16组,并将它们命名为W0~W15,然后,剩下的W16~W79的计算方法如下:

技术分享

W16 = (W0 ^ W2 ^ W8 ^ W13) 循环左移1位

即:

Wt = (Wt - 16 ^ Wt - 14 ^ Wt - 8 ^ Wt - 3) 循环左移1位

完成后,W0~W79的数据就生成完成了。

 

3. SHA-1: 分组处理

接下来,对输入分组进行80个步骤的处理,目的是根据输入分组的信息来改变内部状态。

在对分组处理时,SHA-1中常数Kt及Ht:

技术分享

技术分享

技术分享

SHA-1使用了f0, f1, .... f79这样的一个逻辑函数序列,每一个ft对3个32位双字B,C,D进行操作,产生一个32位双字的输出。

技术分享

对W0~W19的处理:

技术分享

对W20~W39的处理:

技术分享

对W40~W59的处理:

技术分享

对W60~W79的处理:

技术分享

在一个步骤完成之后,缓冲区a,b,c,d的内容会被分别复制到b,c,d,e中(其中b要循环左移30位之后再复制),而缓冲区e的内容则会与其他缓冲区的内容以及Wt、Kt相加之后再复制到缓冲区a中。

最终将循环80个步骤的值与原始相加,即更新原始的5个H常量,得到最终160位的消息摘要。

技术分享

文章来自:http://www.cnblogs.com/dacainiao/p/5554756.html
© 2021 jiaocheng.bubufx.com  联系我们
ICP备案:鲁ICP备09046678号-3