SHA256详解
SHA256 是 SHA-2 系列算法族细分出的一种算法,其中 SHA 是 Secure Hash Algorithm 的缩写,名称中的 256 表示最终生成的摘要长度是 256 bit。SHA256 算法的运算结构、流程与 MD5、SHA1 非常相似,可以比较学习记忆。
算法原理
填充数据
与 MD5、SHA1 的数据填充流程一致。
分组数据运算
首先赋值 8 个初始链接变量,因为摘要长度 256 bit,8 个很合理:
0x6a09e667 0xbb67ae85 0x3c6ef372 0xa54ff53a 0x510e527f 0x9b05688c 0x1f83d9ab 0x5be0cd19
与 MD5、SHA1 类似,SHA256 也有非线性函数,但是是 2 个三变量函数和 4 个单变量函数:
f0(x,y,z)=(x&y)^(x&z)
f1(x,y,z)=(x&y)^(x&z)^(y&z)
g0(x)=x>>>2 ^ x>>>13 ^ x>>>22
g1(x)=x>>>6 ^ x>>>11 ^ x>>>25
sigma_0(x)=x>>>7 ^ x>>>18 ^ x>>3
sigma_1(x)=x>>>17 ^ x>>>19 ^ x>>10
与 MD5 和 SHA1 相似,SHA256 在进行分组运算时,也会用到 Wt 和 Kt: $$ W_t = \begin{cases} M_i & 0 \le t \le15 \\ \sigma_1(W_{t-2})\oplus W_{t-7}\oplus \sigma_0 (W_{t-15})\oplus W_{t-16} & 16\le t\le79 \end{cases} $$
\\ Kt(k0,k1,....,k63)如下
428a2f98 71374491 b5c0fbcf e9b5dba5
3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3
72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc
2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7
c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13
650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3
d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5
391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208
90befffa a4506ceb bef9a3f7 c67178f2
基于这些非线性函数,SHA256 对每个分组进行 64 轮操作:
T1 = h + g1(e) + f0(e,f,g) + Kt + Wt
T2 = g0(a) + f1(a,b,c)
h = g
g = f
f = e
e = d + T1
d = c
c = b
b = a
a = T1 + T2
随后进行与 MD5、SHA1 相同的更新链接向量操作,计算完所有分组后,拼接链接向量即可。