SHA-1算法
SHA-1(Secure Hash Algorithm 1)是一种广泛使用的密码散列函数,生成160位(20字节)的哈希值。尽管已被证实存在安全漏洞并逐步被SHA-2和SHA-3取代,但其算法设计仍具学习价值。
消息预处理
填充消息:确保消息长度为512bit的倍数减64bit(即长度L ≡ 448 mod 512)。
- 第一位补 “1”,其余位补足够的0,直至满足长度 ≡ 448 mod 512
- 附加64位的原始消息长度(以位为单位,大端表示)
分块处理
- 将填充后的消息分割为多个 512位 的块。每个块进一步分为 16个32位字(记为 W[0] 到 W[15])。
扩展字生成
将16个32位字扩展为 80个字(W[0] 到 W[79]):
对 t ≥ 16, W[t]=ROTL1(W[t−3]⊕W[t−8]⊕W[t−14]⊕W[t−16])
其中,ROTLn 表示循环左移 n 位,⊕ 表示异或。
初始化哈希值
SHA-1使用5个32位初始常量:
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0
主循环处理
对每个512位块执行以下操作:
- 初始化变量
a = H0, b = H1, c = H2, d = H3, e = H4
- 80轮迭代
每轮更新变量 a, b, c, d, e:
- 计算临时变量 temp:temp=ROTL5(a) + f(b,c,d) + e + W[t] + K(所有加法为 模 232 )
- 逻辑函数 f 和常量 K 根据轮数选择:
轮次范围 逻辑函数 f(b, c, d) 常量 K 0-19 (b ∧ c) ∨ (¬b ∧ d)(选择函数) 0x5A827999 20-39 b ⊕ c ⊕ d(异或) 0x6ED9EBA1 40-59 (b ∧ c) ∨ (b ∧ d) ∨ (c ∧ d)(多数) 0x8F1BBCDC 60-79 b ⊕ c ⊕ d(异或) 0xCA62C1D6
- 更新变量
e = d
d = c
c = ROTL30(b)
b = a
a = temp
- 更新哈希值
- 处理完80轮后,累加结果到初始哈希值
H0 = H0 + a
H1 = H1 + b
H2 = H2 + c
H3 = H3 + d
H4 = H4 + e
(所有加法为 模 232)
生成最终哈希值
将 H0 到 H4 按大端顺序拼接为 160位 的哈希值,转换为40个十六进制字符。
示例:空字符串的SHA-1
- 输入:空字符串(0位)。
- 填充后:1个512位块,包含 0x80、447个 0 和64位的长度 0。
- 哈希结果:da39a3ee5e6b4b0d3255bfef95601890afd80709
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 懒懒洋洋的blog!
评论