[latexpage]

Hash函数又称哈希函数、散列函数、杂凑函数。它是一种单向密码体制,即从一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。
Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h=H(M)。
在安全应用中使用的Hash函数称为密码学Hash函数。(单向性)、(抗碰撞性)

Hash函数特点:
1. 易压缩
2. 易计算
3. 单向性
4. 抗碰撞性
5. 高灵敏性

密码学Hash函数的应用范围

消息认证

消息认证是用来验证消息完整性的一种机制或服务。消息认证确保收到的数据确实和发送时的一样(即没有修改、插入、删除或重放)。
当Hash函数用于提供消息认证功能时,Hash函数值通常称为消息摘要

数字签名

在进行数字签名过程中使用用户的私钥加密消息的Hash值,其他任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性。

其他应用

单向口令文件。
入侵检测。
病毒检测。
构建随机函数(PRF)或用做伪随机数发生器(PRNG)

安全Hash算法(SHA)

安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。

SHA-1

SHA-1产生160位的Hash值。
SHA1始终把消息当成一个位(bit)字符串来处理。

SHA-2

Hash值长度依次为256位、384位和512位,分别称为SHA-256、SHA-384和SHA-512,这些算法统称为SHA-2。
SHA-2同SHA-1类似,都使用同样的迭代结构和同样的模算术运算与二元逻辑操作。

消息摘要长度160224256384512
消息长度< 2< 2< 2< 2< 2
分组长度51251251210241024
字长度3232326464
步骤数8064648080

SHA-256算法

SHA-256算法的输入是最大长度小于2 位的消息,输出是256位的消息摘要,输入消息以512位的分组为单位进行处理。步骤如下
(1)消息填充

(2)初始化链接变量

(3)处理主循环模块

(4)得出最终的Hash值

步函数是SHA-256中最为重要的函数,也是SHA-256中最关键的部件。其运算过程如下图:
密码学hash函数-SHA256-512-LMLPHP
每一步都会生成两个临时变量,即T1、T2:
\[T_1=\Sigma_1(E)+Ch(E,F,G)+H+W_t+K_t\]
\[T_2=\Sigma_0(A)+Maj(A,B,C) mod 2^{32}\]
根据T1、T2的值,对寄存器A、E进行更新。A、B、C、D、E、F、G的输入值则一次赋值给B、C、D、F、G、H。
\(A=(T_1+T_2) mod 2^{32}\) \(E=(D+T_2) mod 2^{32}\)
其中\(Ch(E,F,G) = (E\wedge F)⊕(\overline{E}\wedge G)\)
\(Maj(A,B,C) = (A\wedge B)\bigoplus (A\wedge C)\bigoplus (B\wedge C)\)
\(\Sigma_0(A) = ROTR^{2}(A)\bigoplus ROTR^{13}(A)\bigoplus ROTR^{22}(A)\)
\(\Sigma_1(E) = ROTR^{6}(E)\bigoplus ROTR^{11}(E)\bigoplus ROTR^{25}(E)\)
且ROTR (E)表示对32位的变量x循环右移n位。
K的获取方法是取前64个素数(2,3,5,7……)立方根的小数部分,将其转换为二进制,然后取这64个数的前64位作为K。其作用是提供了64位随机串集合以消除输入数据里的任何规则性。
对于每个输入分组导出的消息分组W,前16个消息字W(0<=t<=15)直接按照消息输入分组对应的16个32位字,其他的则按照如下公式来计算得出:
\[W_{t} = W_{t-16} + \sigma _0(W_{t-15}) + W_{t-7} + \sigma _1(W_{t-2}) , 16\leqslant t\leqslant 63\]
其中:\(\sigma _0(x) = ROTR^{7}(x) \bigoplus ROTR^{18}(x) \bigoplus SHR^3(x)\)
\(\sigma _1(x) = ROTR^{17}(x) \bigoplus ROTR^{19}(x) \bigoplus SHR^{10}(x)\)
式中,\(SHR^{10}(x)\)表示32位的变量x右移n位,其导出方法如图:
密码学hash函数-SHA256-512-LMLPHP

SHA-512逻辑

算法的输入时最大长度小于2 位的消息,输出是512位的消息摘要,输入消息1024位的分组为单位进行处理。步骤1:附加填充位

步骤2:附加长度

密码学hash函数-SHA256-512-LMLPHP
前两步的结果产生了一个长度为1024整数倍的消息。

步骤3:初始化Hash缓冲区

步骤4:以1024位的分组(128个字节)为单位处理消息

步骤5:输出

总结SHA-512的运算如下:
H = IV
H = SUM(H, abcdefgh)
MD = H
其中,IV为第三步里中定义的abcdefgh缓冲区的初始值;abcdefgh为第i个消息分组处理的最后一轮的输出;N为消息(包括填充和长度域)中的分组数;SUM为对输入对中的每个字进行独立的模2

http://www.frankyang.cn/2017/09/02/mi-ma-xuehash-han-shusha256512/

05-11 17:44