SHA-2是如何工作的:一个关于SHA-256的教程
SHA-2 (安全散列算法2),其中包括SHA-256,是一个非常流行的散列算法。本文,我们将通过一个实例来尽可能地把这个算法简单的介绍一下。
SHA-2以他的安全性著称,(不像SHA-1那样容易破解),并且它的速度很快。在未生成密钥的情况下,比如挖掘比特币,像SHA-2这种快速的hash算法是非常有优势的。
什么是一个哈希函数?
假如你想比较详细的立即通用的哈希函数,可以参考这里。本文就不详细介绍了,不过我们还是要回顾一下哈希函数的三个重要的作用:
- 确定性的加扰数据。
- 接收任何长度的输入,但是输入的长度是固定的。
- 操作不可逆,也就是说不能从输出推出输入。
SHA-2 VS SHA-256
SHA-2是一个算法,他是一个通用的产生hash数据的想法。SHA-256就是假如一些额外的常量,用来定义SHA-2算法的行为。一个比较常见的常量就是输出的长度。比如256或者512,用这个来设置他们输出的比特大小。
下面让我们来一步一步看一个关于SHA-256的例子。
SHA-256 “Hello World”
第一步 – 预处理
- 把“hello world”转变为二进制:
- 在后面加上一个1
- 填充0,使得它是512的整数倍减去64比特,我们这里选择了448比特
- 在最后加入64比特,这个64比特用来表示之前输入的二进制的长度,用大端来表示。我们这里是88,所以二进制就是“1011000”
这样我们就有了我们的输入,他总是可以被512整除的。
第二步 — 初始化哈希值 (h)
现在我们来创建8个哈希值,他们是硬编码,代表前8个素数的平方根的小数部分的前32位: 2,3,5,7,11,13,17,19
第三步 — 初始化一个舍入常数 (k)
和第二步类似,我们要创建一个常数 (关于这些常数更多信息以及什么时候使用他们可以参见这里)。这篇文章中,我们用到了64个。每个值(0-63)是前64个素数(2-311)的立方根小数部分的前32位。
第四步 — 块循环
下面这些步骤每512比特(一块)循环一次。在我们的例子中,因为“hello world”比较短,我们只有一个块。在循环的每一个迭代中,我们都需要对哈希值得h0-h7进行突变,从而产生最终的输出。
第五步 — 创建消息时间表 (w)
- 把上面第一步中的输入数据拷贝到一个新的数组中,每一个元素是一个32比特的word:(我们例子中512就是16个元素)
- 然后增加48个word初始化为0,这样我们就有一个数组w[0…63]
使用下面的算法来修改我们后面假如的全0的元素:
对w[16…63]中的每一个i:
- S0 = (w[i-15]向右旋转7) xor (w[0-15] 向右旋转 18) xor (w[i-15] 右移3)
- S0 = (w[i-2]向右旋转17) xor (w[0-2] 向右旋转 19) xor (w[i-2] 右移10)
- w[i] = w[i-16] + s0 + w[i-7] + s1
我们下面以w[16]为例来详细说明一下:
这样,我们的w中就有64个words了:
第六步 — 压缩
初始化变量a,b,c,d,e,f,g,h让他们的值分别等于我们前面设置的哈希值 h0, h1, h2, h3, h4,h5, h6, h7。
运行下面的压缩循环。这个压缩循环需要突变a .. h的值,如下所示:
i从0到63:
- S1 = (e 向右旋转6) xor (e 向右旋转 11) xor (e 向右旋转 25)
- ch = (e and f) xor ((not e) and g)
- emp1 = h + S1 + ch + k[i] + w[i]
- S0 = (a 向右旋转2) xor (a 向右旋转13) xor (a 向右旋转22)
- maj = (a and b) xor (a and c) xor (b and c)
- temp2 := S0 + maj
- h = g
- g = f
- e = d + temp1
- d = c
- c = b
- b = a
- a = temp1 + temp2
我们来过一下第一个迭代,所有的加法都对2^32取模
这个计算过程要继续做63次,始终改变a-h的值,我们不一一计算了,不过我们最终会有这样的结果:
第七步 — 修改最终的值
在压缩循环之后,在每一个块循环内,我们通过加上相应的变量来改变哈希值 a-h。同样的,没有给加法最后都对2^23取模。
第八步 — 级联最终的哈希值
最后一步,把他们连起来:
好了,这样我们就经历了SHA-256的每一步了。
伪代码
假如你想得到上面所有步骤的伪代码,我们从维基百科得到如下:
原文地址:https://hackernoon.com/how-sha-2-works-a-step-by-step-tutorial-sha-256-46103t6k
Recent Comments