首先:将消息分解成512-bit大小的块(注意,必须每个都是512位哦,也就是输入不够话的就补,刚好够的话就不用补)
接着我们定义H为哈希值(因为哈发h),并初始化为0。
则sha256大体流程如下。(Mi 就是消息块,也就是循环块次)
注意,为什么不叫加密,而叫映射呢,其实主要是不能把sha256看成加密,为什么,因为sha256只能加密,不能解密,所以,这就不能叫加密,对吧。
好,那么考考你,256位是多少字节,一瞬间说出来才算啊,哈哈,是32字节。ok,从现在开始到文章结束 我们说的字都等于4字节,没有例外。那么我们定义H,也就是哈希值应该是256位也就是8个字。即H[0]-H[7]。
接着我们再详细介绍组加密,也就是映射函数。
其中需要这些运算
>>>k:循环右移k比特运算
>>k:右移k比特运算
⊕:异或运算
∧:按位与
~:按位取反
和这6个函数
Map( H,Mi){
//1)按照如下规则将Mi扩展成64个字。即w[0]-w[63],当然w[0]-w[15]就是Mi
for i from 16 to 63
s0= (w[i-15] ) >>> 7)⊕(w[i-15] >>> 18)⊕(w[i-15] >> 3)
s1= (w[i-2] >>> 17)⊕(w[i-2] >>> 19)⊕(w[i-2] >> 10)
w[i]= w[i-16] + s0 + w[i-7] + s1
//2)迭代计算64次
//abcdefgh为8个32bit字,存放中间变量
a= H0
b= H1
c= H2
d= H3
e= H4
f= H5
g= H6
h= H7
//按照如下规则计算
for i from 0 to 63
S1= (e >>> 6) ⊕ (e >>> 11) ⊕ (e >>> 25)
Ch= (e∧ f) ⊕ ((~ e) ∧ g)
temp1= h + S1 + Ch + k[i] + w[i]
S0= (a >>> 2) ⊕ (a >>> 13) ⊕ (a >>> 22)
Ma= (a∧b) ⊕ (a∧c)⊕(b∧c)
temp2= S0 + Ma
h= g
g= f
f= e
e= d + temp1
d= c
c= b
b= a
a= temp1 + temp2
//3)获取当前哈希值
H0= H0 + a
H1= H1 + b
H2= H2 + c
H3= H3 + d
H4= H4 + e
H5= H5 + f
H6= H6 + g
H7= H7 + h
}
要想更直观,得看图,要想更准确,就要看代码。
每次循环计算规则可以由下图描述,当然这个图看不懂,可以不用看,放出来只有一个目的,就是能直观的感受到每次循环需要Wt和Kt和那四个函数(也就是S0,S1,Ch,Ma,由于我打不出来那个数学符号就用大S代替~)。W是那64个字,K是什么呢,是64个常量,具体值我就不写了,你们可以看我参考的链接里有。
而扩展字规则则如下
便用了这两个函数,同样我还是打不出来便用小s代替。