SHA-1算法

背景

SHA全称Secure Hash Algorithm,即安全散列算法。它是一个算法簇,包含多种算法。是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

SHA-1于1995年发布,应用相当广泛,被认为是MD5的替代者,但是随着技术的进步SHA-1已经被认为是不安全的,特别是2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1

SHA-2在2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似,所以理论上也有漏洞

SHA-3在2015年正式发布,SHA-3并不是要取代SHA-2,因为SHA-2当前并没有出现明显的弱点。由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。

SHA家族几种算法比较如下:

这里我们先来梳理SHA-1的详细过程

详细流程

SHA-1和MD5设计非常类似,标准文档链接,基本步骤如下

填充

和MD5一样,填充总是增加的,也就是512的倍数少64

添加长度

将原始长度的64位表示添加到末尾

分块

每512位一块

初始化链接变量

总共有5个,其中ABCD和MD5一样,D的值位C3D2E1F0。五个值如下

A=67452301
B=efcdab89
C=98badcfe
D=10325476
E=c3d2e1f0

处理块

  1. 将AE赋值到ae
  2. 将每块分为16个子块,每个子块32位
  3. SHA共4轮,每轮20步,输入为子块,abcde,常量。整体算法和MD5类似。与MD5不同,这里的常量仅有四个值,每轮用一个,分别是:5a827999,6ed9eba1,8f1bbcdc,ca62c1d6。
  4. 每一步的逻辑如下图所示

具体来说,一次操作的数学表达式如下:

abcde=(e + P + a<<5 + W[] + K[]),a,b<<30,c,d

P依然还是一个非线性操作,<<表示循环左移,W[]表示计算某一子块,K[]表示该轮的常量

w是将16个子块扩展为80个,前16个就是原16个子块,后面的按照下面公式计算

w[t] = (w[t-16] xor w[t-14] xor w[t-8] xor w[t-3])<<1

P的具体运算如下
轮次 | P
—|—
1 | (b AND c) OR ((NOT b) AND d)
2 | b xor c xor d
3 | (b AND c) or (b AND d) OR (c AND d)
4 | b xor c xor d

就这样对每一块执行80次后,输出的abcde就是160位的散列值。相比于MD5无规则的运算,SHA-1基本可以用公式表示整个算法

题图来自unsplash:https://unsplash.com/photos/I2UR7wEftf4