huolong blog

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 相同的更新链接向量操作,计算完所有分组后,拼接链接向量即可。

Python 代码实现