SHA 算法的原理及实现
章节目录
- 简介
- 算法描述
2.1 数据准备
2.1.1 <数据填充
2.1.2 数据分块
2.1.3 设置初始 Hash 值
2.2 Hash 计算
2.2.1 SHA-1
2.2.2 SHA-256
2.2.3 SHA-512 - 实现
<b>作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!</b>
简介
SHA 算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
本文我们将介绍以下 SHA 算法: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.
其中 SHA-224 和 SHA-256 使用相同的算法, 区别在于初始 Hash 值不同, 最终结果只使用算法输出的数据中的前224/256 bit.
SHA-384, SHA-512, SHA-512/224, SHA-512/256 使用相同的算法, 区别在于初始 Hash 值不同, 最终结果只使用算法输出的数据中的前384/512/224/256 bit.
而 SHA-2* 和 SHA-384,SHA-5* 算法也非常类似, 区别在于采用的字(Word) 长度不同, SHA-2*使用 32-bit 的字, 而 其他算法使用 64-bit 的字. 算法的迭代次数也不一样.
算法描述
本文中将介绍的 SHA 算法的计算步骤从大体上可以分为两步: <b>数据准备</b> 和 <b>Hash 计算</b>.
数据准备
在数据准备阶段, 我们也像 MD5 那样, 需要先将数据填充到特定长度,同时将原始数据长度填充进去,然后对数据进行分块, 因为我们的算法是基于块进行的. SHA 家族中的具体算法的实现大体相同, 只是填充长度的bit数,分块大小略有不同而已.
在数据准备阶段我们需要进行三个操作: 数据填充, 数据分块, 设置初始 Hash 值.
数据填充
我们使用 表示数据数据, 它的长度使用
表示.
对于算法 <b>SHA-1</b>, <b>SHA-224</b>, <b>SHA-256</b>, 数据填充方法如下:
先填充 1 bit 的 '1' 到数据末尾, 然后紧接着填充 k 个 '0', 这里 k 需要时最小的非负数且满足 , 也即是说需要将原始数据长度填充到<b>差64位就是512的整数倍</b>.
上述操作结束后, 将 表示为 64 bit 的bit数组填充到上述步骤所得的数据之后, 此时我们得到一个长度为512整数倍的数据.
举个例子:
假设我们的数据数据为"abc", 它的长度为24(bit). 我们通过计算得到 k 应该是 423(448 - 1 - 24). 此时填充之后的数据应该如下:
填充完成之后的长度是512(bit).
对于算法 <b>SHA-384</b>, <b>SHA-512</b>, <b>SHA-512/224</b>, <b>SHA-512/256</b>, 数据填充方法如下:
先填充 1 bit 的 '1' 到数据末尾, 然后紧接着填充 k 个 '0', 这里 k 需要时最小的非负数且满足 , 也即是说需要将原始数据长度填充到<b>差128位就是1024的整数倍</b>.