HASH和HMAC(4):SHA-224和SHA-256算法原理

协议标准:https://csrc.nist.gov/CSRC/media/Publications/fips/180/2/archive/2002-08-01/documents/fips180-2withchangenotice.pdf

算法处理分如下几步:

  • 消息填充 

消息填充分为两部分:第一部分是附加填充比特,第二部分是附加长度,目的是让整个消息满足指定的结构,从而处理起来可以统一化、格式化。

附加填充比特:指在消息尾部进行填充,使报文长度在对512取模后的余数为448。具体操作是:先被1比特1,然后都被0,直到满足对512取模余448。需要注意的是:即使原始消息长度已经满足对512取模余448,补位也需要进行,这时地填充512比特。所以附加填充时至少补1位,最多补512位。

附加长度:将原始数据的长度信息补到已经进行了填充的消息后面。

  • 消息分组

消息分组指将消息填充后的数据按512bit(16*32bit)进行分组,并扩充为64*32bit,扩充算法如下:

当 0 ≤ t ≤ 15  时,W[t] = M[t],M[t]为512bit原始数据中第t个32bit数据。

当 16 ≤ t ≤ 63时,W[t] = W[t-7] + (W[t-2] >>> 17) ⊕ (W[t-2] >>> 19) ⊕ (W[t-2] >> 10) + \

                                       W[t-16] + (W[t-15] >>> 7) ⊕ (W[t-15] >>> 18) ⊕ (W[t-15] >> 3)

消息填充和消息分组处理图示如下:

  •  迭代运算

SHA-224/SHA-256算法对输入的消息进行64轮迭代运算,分别输出224bit和256bit的HASH结果。

 SHA-224/SHA-256处理过程中会用到8个哈希初值和64个哈希常量。

SHA-224/SHA-256的8个哈希初值分别为:

SHA-224:

A=0xC1059ED8,B=0x367CD507,C=0x3070DD17,D=0xF70E5939

E=0xFFC00B31,F=0x68581511,G=0x64F98FA7,H=0xBEFA4FA4

SHA-256:

A=0x6A09E667,B=0xBB67AE85,C=0x3C6EF372,D=0xA54FF53A

E=0x510E527F,F=0x9B05688C,G=0x1F83D9AB,H=0x5BE0CD19

64个哈希常量:

0x428A2F98

0x71374491

0xB5C0FBCF

0xE9B5DBA5

0x3956C25B

0x59F111F1

0x923F82A4

0xAB1C5ED5

0xD807AA98

0x12835B01

0x243185BE

0x550C7DC3

0x72BE5D74

0x80DEB1FE

0x9BDC06A7

0xC19BF174

0xE49B69C1

0xEFBE4786

0x0FC19DC6

0x240CA1CC

0x2DE92C6F

0x4A7484AA

0x5CB0A9DC

0x76F988DA

0x983E5152

0xA831C66D

0xB00327C8

0xBF597FC7

0xC6E00BF3

0xD5A79147

0x06CA6351

0x14292967

0x27B70A85

0x2E1B2138

0x4D2C6DFC

0x53380D13

0x650A7354

0x766A0ABB

0x81C2C92E

0x92722C85

0xA2BFE8A1

0xA81A664B

0xC24B8B70

0xC76C51A3

0xD192E819

0xD6990624

0xF40E3585

0x106AA070

0x19A4C116

0x1E376C08

0x2748774C

0x34B0BCB5

0x391C0CB3

0x4ED8AA4A

0x5B9CCA4F

0x682E6FF3

0x748F82EE

0x78A5636F

0x84C87814

0x8CC70208

0x90BEFFFA

0xA4506CEB

0xBEF9A3F7

0xC67178F2

SHA-224/256迭代运算的详细流程为:

1. 哈希初值赋值:

H0=A,H1=B,H2=C,H3=D,H4=E,H5=F,H6=G,H7=H

2. 64轮迭代运算

for (t=0; t≤63; t++)

{

       T1 = H + (E >>> 6) ⊕ (E >>> 11) ⊕ (E >>>25) + (E & F)  ⊕ (~E & G) + K[t] + W[t]

       T2 = (A >>> 2) ⊕ (A >>> 13) ⊕ (A >>>22) + (A & B)  ⊕ (A & C)  ⊕ (B & C)

        H = G;

        G = F;

        F = E;

        E = D + T1;

        D = C;

        C = B;

        B = A;

        A = T1 + T2;

}

3. 结果输出

SHA-224输出224bit:

H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E,H5=H5+F,H6=H6+G

SHA-256输出256bit:

H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D,H4=H4+E,H5=H5+F,H6=H6+G,H7=H7+H

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值