但是,如果输出是256比特,攻击者需要进行 2^{128} 次哈希操作,每次哈希操作设为1 ms,那么这个破解过程需要至少 10^{40} 年。SHA 2 函数族SHA256是SHA-2之下细分出来的一种算法,SHA-2下又可以再分为六个不同的算法标准。其中包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度、循环运行的次数等一些微小差异外,算法的基本结构是一致的。
SHA 256sha256采用的是Merkle-Damgard结构。
整个流程如下:补位补位:假设消息 M 的二进制编码长度为 l 位,首先在消息末尾补上一位"1", 然后再补上 k 个"0", 其中 k 为下列方程的最小非负整数:
$$
l+1+k≡448 \ mod \ 512
$$然后,再在上述字符串后面补上 l 的二进制表示形式。示例:输入消息“abc”则,消息的二进制编码表示为:
$$
01100001\ 01100010\ 01100011
$$第一次补位,在消息末尾补上一位“1”,结果为:
$$
01100001\ 01100010\ 01100011\ 1
$$第二次补位,因为消息二进制长度为 l=24 ,可以得到 k=423,在后面补上423位“0”,结果为:
$$
01100001\ 01100010\ 01100011\ 1 \underbrace {00 \dots 0}_{423}
$$第三次补位,这里补的是原消息"abc"的二进制长度 l=24 的二进制表示形式(64位):00...011000, 补完以后的结果如下:
$$
01100001\ 01100010\ 01100011\ 1 \underbrace {00 \dots 0}_{423}\underbrace {00 \dots 011000}_{64}
$$最终补完以后,消息二进制位数长度是512的倍数。可视化结果:图片初始化哈希值 H创建8个哈希值。这些是硬编码的常数,代表前8个素数的平方根的小数部分的前32位:2、3、5、7、11、13、17、19。举个例子,\sqrt{2} 的小数部分约为0.414213562373095048, 而其中
$$
0.414213562373095048 \approx 6 *16^{-1}+a*16^{-2}+\dots
$$
于是, 质数2的平方根的小数部分取前32位就对应 0x6a09e667 。如此类推,初始哈希值 H^{(0)} 由以下8个32位的哈希值组成:
$$
H^{(0)}_0 = 6a09e667 \\H^{(0)}_1 = bb67ae85 \\H^{(0)}_2 = 3c6ef372 \\H^{(0)}_3 = a54ff53a \\H^{(0)}_4 = 510e527f \\H^{(0)}_5 = 9b05688c \\H^{(0)}_6 = 1f83d9ab \\H^{(0)}_7 = 5be0cd19 \\
$$
初始化常数 K用到64个常量,这些常量是对自然数中前64个质数的立方根的小数部分取前32比特而来。这64个常量如下:
$$
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
$$
消息分块将补码处理后的消息以512位为单位分块为: M^{(1)},M^{(2)},\dots,M^{(N)}。其中第 i 个消息块的前32位表示为: M^{(i)}_0, 第二个32位为: M^{(i)}_1, 以此类推, 最后一组32位的消息块可表示为: M^{(i)}_{15}。建立邮件时间表 w
$$
s0(x) = S^7(x) \oplus S^{18}(x) \oplus R^3(x)\\s1(x) = S^{17}(x) \oplus S^{19}(x) \oplus R^{10}(x)\\R^n:右移n位 \ S^n:循环右移n位\\+:相加以后对2^{32}求余\\w = w[i-16] + s0(w[i-15]) + w[i-7] + s1(w[i- 2])
$$
压缩
$$
a\gets H^{(0)}_0 \\b\gets H^{(0)}_1 \\c\gets H^{(0)}_2 \\d\gets H^{(0)}_3 \\e\gets H^{(0)}_4 \\f\gets H^{(0)}_5 \\g\gets H^{(0)}_6 \\h\gets H^{(0)}_7
$$
$$
S1(x) = S^6(x) \oplus S^{11}(x) \oplus S^{25}(x)\\ch = (e \wedge f) \oplus (\neg e \wedge g)\\temp1 = h + S1(e) + ch + k + w\\S0(x) = S^2(x) \oplus S^{13}(x) \oplus S^{22}(x)\\maj = (a \wedge b) \oplus (a \wedge c) \oplus (b \wedge c)\\temp2 := S0(a) + maj\\h = g\\g = f\\e = d + temp1\\d = c\\c = b\\b = a\\a = temp1 + temp2
$$
循环最终值将哈希值添加到变量中来修改哈希值,公式如下:
$$
h0 = h0 + a = 10111001010011010010011110111001\\h1 = h1 + b = 10010011010011010011111000001000\\h2 = h2 + c = 10100101001011100101001011010111\\h3 = h3 + d = 11011010011111011010101111111010\\h4 = h4 + e = 11000100100001001110111111100011\\h5 = h5 + f = 01111010010100111000000011101110\\h6 = h6 + g = 10010000100010001111011110101100\\h7 = h7 + h = 11100010111011111100110111101001\\
$$
计算哈希值串接 h0 \ h1 \dots h7 ,等到最终的哈希结果:
参考资料《应用密码学 | SHA-256哈希算法原理详解》https://zhuanlan.zhihu.com/p/431372152《哈希函数(Hash Functions - 散列函数)的基本介绍》https://blog.csdn.net/Rong_Toa/article/details/109016948《详细解释sha256算法》https://www.51credit.com/wenda/880488.html《introduction to Blockchain》运行示例来自:https://sha256algorithm.com/