SHA-256哈希算法
字数 1039 2025-10-28 00:29:09
SHA-256哈希算法
题目描述
SHA-256是SHA-2家族中的一种密码学哈希函数,可将任意长度的输入转换为256位(32字节)固定长度的哈希值。要求你理解其核心流程,包括消息填充、分块处理、循环运算等步骤,并解释其抗碰撞性等安全特性。
解题过程
1. 哈希算法基础概念
- 哈希函数需满足:单向性(不可逆)、抗碰撞性(不同输入难产生相同哈希)、雪崩效应(微小输入变化导致哈希值巨大改变)。
- SHA-256常用于数据完整性验证(如文件校验)和数字签名(如比特币的挖矿算法)。
2. 消息预处理(填充与分块)
假设输入消息为二进制字符串,步骤如下:
- 步骤1:补位
- 在消息末尾添加一个"1",然后补"0"直至长度模512等于448(即最后64位留作长度表示)。
- 例如消息"abc"(长度24位),补1个"1"和423个"0",使总长达到448位。
- 步骤2:附加长度
- 将原始消息的位长度(64位大端表示)附加到补位后的消息末尾,最终总长度为512的整数倍。
- "abc"的原始长度24(二进制
11000),扩展为64位后添加到末尾。
3. 初始化哈希值(H⁽⁰⁾)与常量
- 初始哈希值H⁽⁰⁾由8个32位常数确定,取自前8个质数的平方根小数部分的前32位:
H₀ = 0x6a09e667, H₁ = 0xbb67ae85, H₂ = 0x3c6ef372, H₃ = 0xa54ff53a, H₄ = 0x510e527f, H₅ = 0x9b05688c, H₆ = 0x1f83d9ab, H₇ = 0x5be0cd19 - 循环中使用的64个常量Kₜ,来自前64个质数的立方根小数部分的前32位。
4. 分块处理主循环
对每个512位消息块执行以下操作:
- 步骤1:扩展消息(64字 → 64字)
- 将512位块划分为16个32位字(W[0]到W[15])。
- 通过递推公式扩展至64个字(W[16]到W[63]):
W[t] = σ₁(W[t-2]) + W[t-7] + σ₀(W[t-15]) + W[t-16] 其中σ₀(x) = (x右旋7) ⊕ (x右旋18) ⊕ (x右移3) σ₁(x) = (x右旋17) ⊕ (x右旋19) ⊕ (x右移10)
- 步骤2:压缩函数(更新哈希值)
初始化a~h为当前哈希值H⁽ⁱ⁾,进行64轮循环(t=0~63):
每轮更新:T1 = h + Σ₁(e) + Ch(e,f,g) + K[t] + W[t] T2 = Σ₀(a) + Maj(a,b,c) 其中: Ch(e,f,g) = (e ∧ f) ⊕ (¬e ∧ g) Maj(a,b,c) = (a ∧ b) ⊕ (a ∧ c) ⊕ (b ∧ c) Σ₀(x) = (x右旋2) ⊕ (x右旋13) ⊕ (x右旋22) Σ₁(x) = (x右旋6) ⊕ (x右旋11) ⊕ (x右旋25)h = g, g = f, f = e, e = d + T1 d = c, c = b, b = a, a = T1 + T2 - 步骤3:计算新哈希值
将a~h与初始H⁽ⁱ⁾相加得到H⁽ⁱ⁺¹⁾。
5. 输出最终哈希值
- 处理完所有消息块后,将最后的H⁽ⁿ⁾的8个32位值按大端序拼接,即为256位哈希值。
- 例如"abc"的SHA-256结果为:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
6. 安全特性分析
- 抗碰撞性:寻找两个不同输入得到相同哈希需约2¹²⁸次尝试(生日攻击)。
- 实际应用:结合HMAC可实现消息认证,在区块链中用于工作量证明(如比特币)。
通过以上步骤,SHA-256确保了数据完整性和不可篡改性,是密码学哈希的经典代表。