SHA-1算法
SHA算法采用迭代行Hash函数的一般结构,输入消息的最大长度不超过2^64bit,输入消息分组为512bit,输出160位的报文摘要。
对于任意长度的明文,SHA-1首先对其进行分组,使得每一组的长度为512位,然后对这些明文分组反复重复处理。
SHA -1算法流程
对于每个明文分组的摘要生成过程如下:
1)将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。
2)申请5个32位的链接变量,记为A、B、C、D、E。
3)16份子明文分组扩展为80份。
4)80份子明文分组进行4轮运算。
5)链接变量与初始链接变量进行求和运算。
6)链接变量作为下一个明文分组的输入重复进行以上操作。
7)最后,5个链接变量里面的数据就是SHA1摘要。
1、消息填充
消息必须进行填充,填充的目的是使报文长度在对512取模以后的余数是448(即长度≡448 mod 512)。填充位数在1到512位之间。即使长度已经满足对512取模后余数是448,填充也必须要进行。填充的方法是填充一个“1”和若干个“0”使其长度模512和448同余。最后附加64比特的无符号整数(最高有效位在前),其值标识原始报文消息的长度。
2、初始化缓冲区
SHA-1算法使用160位的缓冲区保存存储中间结果和最终的消息摘要,缓冲区由5个32位的寄存器A,B,C,D,E组成,字的最高位存于低地址字节位置(十六进制),处置如下:A = 0x67452301, B = 0xEFCDAB89, C = 0x98BADCFE, D = 0x10325476, E = 0xC3D2E1F0。
3、执行算法主循环
消息分组:
经过添加位数处理的明文,其长度正好为512位的整数倍,然后按512位的长度进行分组(block),可以划分成L份明文分组,我们用M0,M1,…, ML-1表示这些明文分组。对于每一个明文分组,都要重复反复的处理,这些与MD5是相同的。
4轮运算:
SHA-1有4轮运算,也就是经过4轮函数(f1,f2,f3,f4)处理,每一轮函数由20步迭代组成,一共80步,每轮的输入为当前消息块Mt和缓冲区当前值A,B,C,D,E,输出仍放在缓冲区,第四轮输出于第一轮输入进行异或运算,得到压缩函数的输出。
当第1轮运算中的第1步骤开始处理时,A,B,C,D,E五个链接变量中的值先赋值到另外5个记录单元A′,B′,C′,D′,E′中。这5个值将保留,用于在第4轮的最后一个步骤完成之后与链接变量A,B,C,D,E进行求和操作。
SHA1的4轮运算,共80个步骤使用同一个操作程序,描述如下:
A,B,C,D,E←[(A<<<5)+ ft(B,C,D)+E+Wt+Kt],A,(B<<<30),C,D
其中A,B,C,D,E为缓冲区的5个字;
t为迭代的步数(0≤t≤79);
ft(B,C,D)为第t步使用的基本逻辑函数;
<<<s为循环左移s位;
Wt是当前512位消息块中扩充后的一个32位字;
Kt为加法常量;
+为模2^32加法;
这个操作程序的意义为:
将[(A<<<5)+ ft(B,C,D)+E+Wt+Kt]的结果赋值给链接变量A;
将链接变量A初始值赋值给链接变量B;
将链接变量B初始值循环左移30位赋值给链接变量C;
将链接变量C初始值赋值给链接变量D;
将链接变量D初始值赋值给链接变量E。
非线性函数f函数:
ft(B,C,D)为逻辑函数,函数计算规则如下:
W值的获取:
Wt为子明文分组,首先将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。我们使用Mk(k= 0,1,…,15)来表示这16个子明文分组。之后还要将这16个子明文分组扩充到80个子明文分组Wt(t= 0, 1,……79),扩充的方法如下:
K值的获取:
Kt为固定常数,其取值为:
4、输出哈希值
第四轮最后一个步骤的A,B,C,D,E输出,将分别与记录单元A′,B′,C′,D′,E′中的数值求和运算。其结果将作为输入成为下一个512位明文分组的链接变量A,B,C,D,E,当最后一个明文分组ML-1计算完成后,A,B,C,D,E中的数据级联就是最后散列函数值。
SHA-1算法应用
目前SHA算法的应用较为广泛,主要应用于CA和数字证书中,另外在目前互联网中流行的BT软件中,也是使用SHA-1来进行文件校验的。同时,SHA算法还可以应用在消息鉴别,数字签名等方面。
SHA-1算法应用越来越少。
注:
如有错误、侵权,请联系笔者更改删除!