注:以下内容参考《新编密码学》范九伦 张雪锋 侯红霞 编著
6.4 安全Hash算法------SHA-1
安全Hash算法SHA-1(Security Hash Algorithm)是一个产生160位消息摘要的迭代Hash函数。该算法由美国国家标准和技术协会(NIST)提出,并于1993年作为联邦信息处理标准公布。SHA-1的设计基于MD4算法,在很大程度上模仿了MD4。2002年,NIST在SHA-1的基础上推出了SHA-256、SHA-384、SHA-512三个版本,消息摘要长度分别为256位、384位和512位。这些改进算法增强了安全性,便于与AES算法结合,其基本运算结构与SHA-1相似。
SHA各轮运算流程示意图如图6-3所示。

SHA-1算法输入消息的最大长度不超过 2⁶⁴ 位,按512位分组处理。具体操作包括:
-
填充过程:填充消息使长度与448模512同余(即 ∣x∣mod 512=448),填充位数范围为1到512,填充位的最高位为1,其余各位为0。
-
压缩过程:将一个64位的序列(等于初始序列位串的长度值)附加到填充结果末尾,得到长度为512位的分组序列。
-
初始化5个32位寄存器:
A=67452301 B=EFCDAB89 C=98BADCFE D=10325476 E=C3D2E1F0
-
主循环:将寄存器值赋给AA、BB、CC、DD、EE。对每个512位分组进行4轮操作,每轮20次操作,共80步。每次操作对AA、BB、CC、DD、EE中的三个进行非线性函数运算,然后进行移位和加法运算。
SHA-1中的非线性函数:

函数 F1,F2,F3,F4 的真值表如表6-4所示。

常量:SHA-1使用4个常量(与MD5的64个不同):

消息扩展:将16个32位消息分组扩展为80个32位序列:

主循环操作(0≤t≤79):

- 更新寄存器:A=A+AA,B=B+BB,C=C+CC,D=D+DD,E=E+EE
输出:H(x)=A∥B∥C∥D∥E,得到160位的消息摘要。
6.5 MD5与SHA-1的比较
(1) 抗穷举搜索攻击的强度:MD5摘要128位,SHA-1摘要160位。穷举攻击寻找给定摘要分别需 O(2¹²⁸)和 O(2¹⁶⁰) 次运算;寻找碰撞分别需 O(2⁶⁴)和 O(280) 次运算。SHA-1强度更高。一般认为SHA-1是抗密码分析的,而MD5可能易受攻击。
(2) 速度:两者主要运算为模2加法,易在32位结构上实现。但SHA-1迭代步数(80步)多于MD5(64步),缓冲区(160位)大于MD5(128位),因此在相同硬件上SHA-1速度较慢。
(3) 简洁与紧凑性:两者描述简单,实现简单,不需要较大的程序和代码。
6.6 消息认证码(MAC)
消息认证码(MAC,Message Authentication Codes)是实现消息鉴别的理论基础,MAC具有与Hash函数相同的特性,但包含密钥。一个MAC算法由一个秘密密钥 k 和参数化的一簇函数 Hk 构成,应具有:
(1) 容易计算 :给定密钥 k 和消息 x,Hk(x) 易计算。
(2) 压缩:将任意长度消息映射为固定长度输出。
6.6.1 基于分组密码的MAC
以DES为例(分组长度64位):
-
填充并分组:x=x1∥x2∥⋯∥xt
-
分组密码计算:
H1=DESk(x1),H2=DESk(x2⊕H1),...
-
可选输出(使用第二密钥 k′):对最后一组进行三重DES加密。

该算法效率较低,消息摘要仅64位,现多转向使用AES。
6.6.2 基于序列密码的MAC
-
建立消息多项式 Px(t)=x₀+x₁t+⋯+x(m−1) t^(m−1)
-
选择 n 次不可约多项式 q(t) 和随机 n 位密钥 k
-
计算 h(x)=coef(Px(t)⋅t^m mod q(t))
-
MAC:H(x)=h(x)⊕k
安全性依赖于Hash函数的抗碰撞性。
6.6.3 HMAC算法
HMAC由H. Krawczyk、M. Bellare、R. Canetti于1996年提出,基于Hash函数和密钥进行消息认证。其优点包括:软件执行速度快、无出口限制等。
HMAC算法描述 :
设 H 为嵌入的Hash函数,M 为消息,分组长度 b,密钥 K 长度 ≤ b。K+ 是 K 左边填充0后长度为 b 的结果。ipad=00110110(十六进制36)重复 b/8 次,opad=01011100(十六进制5C)重复 b/8 次。
-
在密钥 K 后添加0创建长度为 b 的字符串。
-
将结果与 ipad 异或。
-
将消息 M 填充到结果字符串中。
-
用 H 作用于(3)的结果。
-
将(1)的结果与 opad 异或。
-
将(4)的结果填充到(5)的结果中。
-
用 H 作用于(6)的结果,输出最终结果。
表示为:
HMACK(M)=H((K+⊕opad)∥H(K+⊕ipad)∥M)
HMAC结构如图6-6所示。

习题6 解答
6-1 证明 H(x)=f(x′⊕x′′) 不是第二原像稳固的
证明:
已知 f:{0,1}m→{0,1} 是一个原像稳固的双射。对于 x∈{0,1}^(2m),记 x=x′∥x′′,定义:
H(x)=f(x′⊕x′′)
要证明 H 不是第二原像稳固的,需要证明:给定一个 x,可以找到 y≠x 使得 H(y)=H(x)。
取任意 x=x′∥x′′,令:
y=x′′∥x′
则:
y′⊕y′′=x′′⊕x′=x′⊕x′′
因此:
H(y)=f(y′⊕y′′)=f(x′⊕x′′)=H(x)
且 y≠x(因为 x′≠x′′ 时显然不同;即使 x′=x′′,交换后仍相同,但此时取其他构造如 y=x′∥(x′′⊕1) 等可保证不同)。
所以 H 不满足第二原像稳固的定义。
6-2 利用碰撞分解 n=603241
-
由三个碰撞消息,计算两两差值的 最大公约数 d。
-
此时 a^ d≡1(modn)。
-
取 m=d/2(若 d 为偶数),计算 t=ammod nt=ammodn。
-
若 t≠±1(mod n),则:
p=gcd(t−1,n),q=gcd(t+1,n)
得到分解。
(注:具体数值需通过大数运算验证,此处给出方法。)
6-3 证明 H2 和 Hi 是碰撞稳定的
(1) 证明 H2 是碰撞稳定的
假设存在 x≠y使得 H2(x)=H2(y),其中 x=x1∥x2,y=y1∥y2,∣x1∣=∣x2∣=∣y1∣=∣y2∣=2^m。
由定义:
H2(x)=H1(H1(x1)∥H1(x2))
H2(y)=H1(H1(y1)∥H1(y2))
若 H2(x)=H2(y),则要么:
-
情况1:H1(x1)=H1(y1)且 H1(x2)=H1(y2),且 H1(x1)∥H1(x2)≠H1(y1)∥H1(y2)不可能,因为相等;
-
情况2:H1(x1)∥H1(x2)≠H1(y1)∥H1(y2) 但 H1 碰撞。
若 x1≠y1 且 H1(x1)=H1(y1),则找到 H1 的碰撞,与 H1 碰撞稳定矛盾。
若 x1=y1 但 x2≠y2 且 H1(x2)=H1(y2),同样矛盾。
若 x1=y1 且 x2=y2,则 x=y,与假设矛盾。
因此 H2 是碰撞稳定的。
(2) 证明 Hi 是碰撞稳定的
用数学归纳法。
-
基础:i=1 时,H1 已知碰撞稳定。
-
归纳假设:Hi−1 碰撞稳定。
-
归纳步骤:由 Hi(x)=Hi(Hi−1(x1)∥Hi−1(x2)),与(1)同理,若 Hi(x)=Hi(y)且 x≠yx=y,则必然导致 Hi−1 的碰撞或 H1 的碰撞,矛盾。
因此 Hi 是碰撞稳定的。
6-4 比较 SHA-1 与 MD4 的主要区别
| 对比项 | MD4 | SHA-1 |
|---|---|---|
| 消息摘要长度 | 128位 | 160位 |
| 寄存器个数 | 4个(A,B,C,D) | 5个(A,B,C,D,E) |
| 轮数 | 3轮 | 4轮 |
| 每轮步数 | 每轮16步 | 每轮20步 |
| 总步数 | 48步 | 80步 |
| 常量个数 | 3个(每轮一个) | 4个(每轮一个) |
| 消息扩展 | 无 | 有(16→80个字) |
| 循环移位 | 每步不同 | 每步不同且更复杂 |
6-5 什么是Hash函数?基本要求和安全性要求是什么?
Hash函数定义:将任意长度的消息映射为较短、固定长度输出的函数,输出称为消息摘要或哈希值。
基本要求:
-
能处理任意大小的数据
-
产生定长输出
-
易于计算
安全性要求:
-
单向性(原像稳固):给定 y,难以找到 x 使 H(x)=y
-
抗第二原像性:给定 x,难以找到 x′≠x 使 H(x′)=H(x)
-
抗碰撞性:难以找到任意一对不同的 x,x′ 使 H(x)=H(x′)
6-6 单选题
在Hash函数中,已知 x,找到 y≠x 满足 H(y)=H(x) 在计算上是不可行的,这一性质称为 ______。
A. 抗碰撞性
B. 抗第二原像性
C. 单向性
D. 杂凑性
答案 :B. 抗第二原像性
6-7 MD5填空
MD5算法以 512 位的分组长度来处理消息,得到的消息摘要的长度为 128 位。
6-8 SHA-1填空
SHA-1算法以 512 位的分组长度来处理消息,得到的消息摘要的长度为 160 位。
6-9 为什么要进行Hash填充?
原因:
-
使消息长度成为分组长度的整数倍:Hash函数按固定长度分组处理消息,填充使消息能被正确分割。
-
包含原始消息长度:填充的最后通常包含原始消息的长度信息,这有助于防止长度扩展攻击等安全威胁。
-
保证安全性:正确的填充方式(如MD5/SHA-1的填充方式)是Hash函数安全性的重要组成部分,确保不同消息不会因长度不同而产生相同的填充结果。
注:以上内容的理解和计算,如果有任何错误,希望各位读者和大佬指出改正,非常感谢!!!