首先:将消息分解成512-bit大小的块(注意,必须每个都是512位哦,也就是输入不够话的就补,刚好够的话就不用补)

镜像sd 镜像sha256_映射函数

接着我们定义H为哈希值(因为哈发h),并初始化为0。

则sha256大体流程如下。(Mi 就是消息块,也就是循环块次)

镜像sd 镜像sha256_H5_02


注意,为什么不叫加密,而叫映射呢,其实主要是不能把sha256看成加密,为什么,因为sha256只能加密,不能解密,所以,这就不能叫加密,对吧。

好,那么考考你,256位是多少字节,一瞬间说出来才算啊,哈哈,是32字节。ok,从现在开始到文章结束 我们说的字都等于4字节,没有例外。那么我们定义H,也就是哈希值应该是256位也就是8个字。即H[0]-H[7]。

接着我们再详细介绍组加密,也就是映射函数。

其中需要这些运算

>>>k:循环右移k比特运算

>>k:右移k比特运算

⊕:异或运算

∧:按位与

~:按位取反

和这6个函数

镜像sd 镜像sha256_镜像sd_03

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个常量,具体值我就不写了,你们可以看我参考的链接里有。

镜像sd 镜像sha256_映射函数_04


而扩展字规则则如下

镜像sd 镜像sha256_H5_05


便用了这两个函数,同样我还是打不出来便用小s代替。