SHA1详解
SHA1(Secure Hash Algorithm 1)是一种散列函数,由美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦资料处理标准(FIPS)。它接受任意长度的输入(其实是不超过 2^64 长度)并输出 160 bit 的摘要。它的处理流程与 MD5 有很多相似之处,且在 2017 年已经发现碰撞,建议使用 SHA2 或 SHA3 算法替代。
算法原理
填充数据
与 MD5 的数据填充流程一致。
分组数据运算
首先赋值 5 个初始链接变量,因为每个变量为 32 bit,SHA1 的摘要长度比 MD5 多 32 bit,即正好多一个链接变量。
A: 0x67452301 B: 0xefcdab89 C: 0x98badcfe D: 0x10325476 E: 0xC3D2E1F0
与 MD5 类似,SHA1 也有 4 个非线性函数:
Ft(B,C,D) = (B&C)|(~B&D) (0<=t<=19)
Ft(B,C,D) = B^C^D (20<=t<=39)
Ft(B,C,D) = (B&C)|(B&D)|(C&D) (40<=t<=59)
Ft(B,C,D) = B^C^D (60<=t<=79)
与 MD5 相似,SHA1 在进行分组数据运算时,也会用到 Mi 和 tj(SHA1 中一般用 Wt 和 Kt 表示)
$$ W_t = \begin{cases} M_i & 0 \le t \le15 \\ (W_{t-3}\oplus W_{t-8}\oplus W_{t-14}\oplus W_{t-16})«<1 & 16\le t\le79 \end{cases} $$
Kt=0x5A827999 (0<=t<=19)
Kt=0x6ED9EBA1 (20<=t<=39)
Kt=0x8F188CDC (40<=t<=59)
Kt=0xCA62C1D6 (60<=t<=79)
基于这四种非线性函数,SHA1 对每个分组进行 80 轮操作,与 MD5 相似,以下操作的 a,b,c,d,e 的初值与初始链接变量相同:
\\ 以下操作执行80轮
T = a<<<5 + Ft(b,c,d) + e + Wt + Kt
e = d
d = c
c = b<<<30
b = a
a = T
与 MD5 的后续操作一致,将 A,B,C,D 值更新,当所有的分组运算完毕后,将 A,B,C,D 拼接起来并按照小端序展示即可。