美国第1代哈希散列算法SHA-1
美国第1代哈希散列算法SHA-1
SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1是SHA家族的第一个成员,后续还有SHA-224、SHA-256、SHA-384、SHA-512等版本。SHA-1与SHA-0几乎相同,除了前者比后者多了个循环移位。SHA-1采用了MD结构,其压缩函数的输入为512比特的消息块和160比特的链接变量。
SHA-1算法的哈希计算过程为:先执行消息填充算法(假设填充后的消息可以分为N个512bit的消息块),然后对每一个512bit消息块,先执行消息扩展算法(输入为16个消息字,输出为80个消息字),然后执行消息压缩算法(输入为80个消息字和5个移位寄存器值,输出为5个移位寄存器值)。循环N次后,5个移位寄存器的值即为SHA-1计算的Hash值。
SHA-1杂凑函数的三大操作:消息填充算法、消息扩展算法、消息压缩算法。
(1)消息填充算法
在运算之前先要对信息进行处理,在原始信息中增加填充位(1-512位,由一个1位和多个0位组成),使填充后的消息长度等于一个值,即比512的倍数少64位。然后在最后添加64比特的原始消息长度。例如消息为“Hello,World!”,则消息完整填充如下表:
长度小于264比特的消息M,经过填充,长度变为512比特的整数倍M*=M||100…0||length,再分为512比特的消息块M*=M1||M2||…||Mn,作为压缩函数的迭代输入。迭代链接变量的初始值取固定常数IV=(A0,B0,C0,D0,E0),当所有消息块都经过压缩函数处理后,得到的链值就作为最终的杂凑值。
(2)消息扩展算法
填充后的消息是512位的整数倍,把它们划分成512bit的分组,对于每一个512bit的分组分割成16个字(32bit),记为(M0,M1,……,M14,M15)。然后将这16个字用如下的扩展方式扩展成80个消息字。扩展方式为:
(3)消息压缩算法
SHA-1的压缩迭代函数一共需要80步,分成四轮来实现,每20步迭代称作一轮,每一轮使用不同的布尔函数Fj和常数Kj。第j轮第i步的步函数如下。
其中
等价于
链接变量的初始值IV为:
Kj为固定常数:
当80步迭代完成后,将初值和迭代值模加作为压缩函数的输出值(A0+A80,B0+B80,C0+C80,D0+D80,E0+E80)。
对每一个消息块依次进行上述80步迭代运算,当所有消息块计算完成之后,链接变量的值即为Hash运算的结果。
SHA-1算法(摘要值160bit)的安全性被认为强于MD5算法(摘要值128bit),但是弱于SHA-256(摘要值256bit)和SHA-512(摘要值512bit)等算法。随着国内外密码学者相继宣布找到SHA-1的实际碰撞,其已不再被推荐在有安全需求的环境中使用,因此大家转向使用安全性更高的SHA2算法。