SHA-224摘要算法(带示例)

原创不易,转载请注明出处。

目录

1.算法简介

2.符号

3.加密算法流程

3.1 概述

3.2 填充

3.3 加密处理

附录A 运算示例

附录B 下载链接

1.算法简介

SHA英文全称Secure Hash Algorithm,即安全散列算法。散列算法又称杂凑算法或哈希算法,能将一定长度的消息计算出固定长度的字符串(又称消息摘要)。SHA包含5个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384和SHA-512,后四者并称为SHA-2。

SHA-224最大计算明文长度为2^64bit,属于分组算法,分组长度为512bit,产生的信息摘要长度为224bit。SHA-224算法属于密码杂凑算法,原则上不能通过密文推出明文。

本文将通过实例,详细介绍SHA-224加密算法的加密流程。

2.符号

下列符号适用于本文本。

h0~h7:8个32bit字,初始哈希值,也存放每组计算的当前哈希值

abcdefgh:8个32bit字,存放中间变量

m :消息

m’:填充后的消息

mod:模运算

s0,s1:字节扩展时中间变量

S0,S1,ch,maj,temp1,temp2:循环迭代时中间变量

w[i]:第i个扩展字

∧:32bit与运算

∨:32bit或运算

⊕:异或运算

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

>>k:右移k比特运算

←:左向赋值运算符

~:32bit字按位取反

3.加密算法流程

3.1 概述

对长度为l (l<2^64bit )比特的消息 ,SHA-224杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为224比特。

3.2 填充

假设消息 m的长度为 l比特。首先将比特“1”添加到消息的末尾,再添加 个k“0”,k 是满足 l+1+k=448mod512的最小的非负整数。然后再添加一个64位比特串,该比特串是长度l 的二进制表示。填充后的消息m’ 的比特长度为512的倍数。

例如:对消息01100001 01100010 01100011,其长度 =24,经填充得到比特串:

                  《SHA-224摘要算法(带示例)》

事实上,在编写程序时,应该先进行分组,对满足512bit的分组先进行计算。当分到最后一组不足512bit时,再进行填充。

3.3 加密处理

将填充后的消息m’ 按512比特进行分组:m’=B0B1……Bn-1,其中n=(l+k+65)/512 。

3.3.1 常量及初始值

初始哈希值

h0= 0xc1059ed8

h1= 0x367cd507

h2= 0x3070dd17

h3= 0xf70e5939

h4= 0xffc00b31

h5= 0x68581511

h6= 0x64f98fa7

h7= 0xbefa4fa4

初始常量矩阵

k[0..63]=

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

3.3.2 加密流程

每组数据按照如下流程进行加密操作:

1)分组数据按照32bit字存放在w[0]~w[15]中,然后按照如下规则扩展成64个字。注意 s0, s1 最后是右移, 不是循环右移

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

ENDFOR

2)赋值初始哈希值

a= h0

b= h1

c= h2

d= h3

e= h4

f= h5

g= h6

h= h7

3)迭代计算64次

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)

    maj= (a∧b) ⊕ (a∧c)⊕(b∧c)

    temp2= S0 + maj

 

    h= g

    g= f

    f= e

    e= d + temp1

    d= c

    c= b

    b= a

    a= temp1 + temp2

ENDFOR

4)获取当前哈希值

h0= h0 + a

h1= h1 + b

h2= h2 + c

h3= h3 + d

h4= h4 + e

h5= h5 + f

h6= h6 + g

h7= h7 + h

注意前一组得到的哈希值h0~h7作为下一分组的初始值,最终取h0~h6224bit作为杂凑值。

附录A 运算示例

原始输入消息:

abc

填充后消息:

0x61      0x62      0x63      0x80      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x00

0x00      0x00      0x00      0x00      0x00      0x00      0x00      0x18

64个扩展字

w[0]~w[3]:  0x61626380    0x00000000        0x00000000        0x00000000

w[4]~w[7]:  0x00000000    0x00000000        0x00000000        0x00000000

w[8]~w[11]: 0x00000000    0x00000000        0x00000000        0x00000000

w[12]~w[15]:0x00000000    0x00000000        0x00000000        0x00000018

w[16]~w[19]:0x61626380    0x000f0000         0x7da86405        0x600003c6

w[20]~w[23]:0x3e9d7b78    0x0183fc00         0x12dcbfdb        0xe2e2c38e

w[24]~w[27]:0xc8215c1a     0xb73679a2        0xe5bc3909         0x32663c5b

w[28]~w[31]:0x9d209d67   0xec8726cb         0x702138a4        0xd3b7973b

w[32]~w[35]:0x93f5997f     0x3b68ba73        0xaff4ffc1           0xf10a5c62

w[36]~w[39]:0x0a8b3996    0x72af830a         0x9409e33e         0x24641522

w[40]~w[43]:0x9f47bf94     0xf0a64f5a          0x3e246a79         0x27333ba3

w[44]~w[47]:0x0c4763f2     0x840abf27         0x7a290d5d        0x065c43da

w[48]~w[51]:0xfb3e89cb     0xcc7617db        0xb9e66c34         0xa9993667

w[52]~w[55]:0x84badedd    0xc21462bc         0x1487472c        0xb20f7a99

w[56]~w[59]:0xef57b9cd     0xebe6b238         0x9fe3095e         0x78bc8d4b

w[60]~w[63]:0xa43fcf15     0x668b2ff8         0xeeaba2cc          0x12b1edeb

64轮迭代(十六进制表示)

A

B

c

d

e

f

g

h

0

c1059ed8

367cd507

3070dd17

f70e5939

ffc00b31

68581511

64f98fa7

befa4fa4

1

0e96b2da

c1059ed8

367cd507

3070dd17

0434225e

ffc00b31

68581511

64f98fa7

2

c20dab6b

0e96b2da

c1059ed8

367cd507

9cab416f

0434225e

ffc00b31

68581511

3

ab113b7a

c20dab6b

0e96b2da

c1059ed8

82177fe8

9cab416f

0434225e

ffc00b31

4

8253cc1a

ab113b7a

c20dab6b

0e96b2da

8346b27d

82177fe8

9cab416f

0434225e

5

08a0dc0c

8253cc1a

ab113b7a

c20dab6b

05b557db

8346b27d

82177fe8

9cab416f

6

b2ca3a91

08a0dc0c

8253cc1a

ab113b7a

898dc7bb

05b557db

8346b27d

82177fe8

7

0b6b9023

b2ca3a91

08a0dc0c

8253cc1a

a2e49147

898dc7bb

05b557db

8346b27d

8

f09d116d

0b6b9023

b2ca3a91

08a0dc0c

7a84120d

a2e49147

898dc7bb

05b557db

9

ed6fa633

f09d116d

0b6b9023

b2ca3a91

c037faad

7a84120d

a2e49147

898dc7bb

10

55e6a367

ed6fa633

f09d116d

0b6b9023

aae50091

c037faad

7a84120d

a2e49147

11

0817e82b

55e6a367

ed6fa633

f09d116d

c8c53a2c

aae50091

c037faad

7a84120d

12

17142334

0817e82b

55e6a367

ed6fa633

dd4c7be9

c8c53a2c

aae50091

c037faad

13

fc4f023e

17142334

0817e82b

55e6a367

87bea51a

dd4c7be9

c8c53a2c

aae50091

14

be316902

fc4f023e

17142334

0817e82b

65141125

87bea51a

dd4c7be9

c8c53a2c

15

1d80d178

be316902

fc4f023e

17142334

4545f53a

65141125

87bea51a

dd4c7be9

16

9f341a45

1d80d178

be316902

fc4f023e

6a61c411

4545f53a

65141125

87bea51a

17

0f324db9

9f341a45

1d80d178

be316902

06c80d6a

6a61c411

4545f53a

65141125

18

ffe7012b

0f324db9

9f341a45

1d80d178

b7b601f4

06c80d6a

6a61c411

4545f53a

19

62932ab8

ffe7012b

0f324db9

9f341a45

763b627a

b7b601f4

06c80d6a

6a61c411

20

5207d867

62932ab8

ffe7012b

0f324db9

7fbba936

763b627a

b7b601f4

06c80d6a

21

07d55ccb

5207d867

62932ab8

ffe7012b

9ba5a6ea

7fbba936

763b627a

b7b601f4

22

dece98a4

07d55ccb

5207d867

62932ab8

293ffb5d

9ba5a6ea

7fbba936

763b627a

23

e62a812e

dece98a4

07d55ccb

5207d867

28fe0fd9

293ffb5d

9ba5a6ea

7fbba936

24

57206fb8

e62a812e

dece98a4

07d55ccb

c76084ea

28fe0fd9

293ffb5d

9ba5a6ea

25

6a6abcf0

57206fb8

e62a812e

dece98a4

b2614c5e

c76084ea

28fe0fd9

293ffb5d

26

937514f0

6a6abcf0

57206fb8

e62a812e

b42ec21c

b2614c5e

c76084ea

28fe0fd9

27

82af3ffb

937514f0

6a6abcf0

57206fb8

be6f6760

b42ec21c

b2614c5e

c76084ea

28

eca3bcd5

82af3ffb

937514f0

6a6abcf0

1dccbb10

be6f6760

b42ec21c

b2614c5e

29

2d1576c4

eca3bcd5

82af3ffb

937514f0

01641929

1dccbb10

be6f6760

b42ec21c

30

fe3c8658

2d1576c4

eca3bcd5

82af3ffb

fc4b36c5

01641929

1dccbb10

be6f6760

31

0d7cce07

fe3c8658

2d1576c4

eca3bcd5

a4a4a3a4

fc4b36c5

01641929

1dccbb10

32

cce1951d

0d7cce07

fe3c8658

2d1576c4

4be9475c

a4a4a3a4

fc4b36c5

01641929

33

09b76257

cce1951d

0d7cce07

fe3c8658

0ccddd86

4be9475c

a4a4a3a4

fc4b36c5

34

f827767e

09b76257

cce1951d

0d7cce07

db116db7

0ccddd86

4be9475c

a4a4a3a4

35

e4a0bb48

f827767e

09b76257

cce1951d

994e2bac

db116db7

0ccddd86

4be9475c

36

d8bb1041

e4a0bb48

f827767e

09b76257

5b730abb

994e2bac

db116db7

0ccddd86

37

2a2e32f4

d8bb1041

e4a0bb48

f827767e

22e15c59

5b730abb

994e2bac

db116db7

38

0d275ca8

2a2e32f4

d8bb1041

e4a0bb48

f6c39382

22e15c59

5b730abb

994e2bac

39

7902369c

0d275ca8

2a2e32f4

d8bb1041

d9f8c2e0

f6c39382

22e15c59

5b730abb

40

f3c80288

7902369c

0d275ca8

2a2e32f4

00e3a7bb

d9f8c2e0

f6c39382

22e15c59

41

483bba4d

f3c80288

7902369c

0d275ca8

f0a8198c

00e3a7bb

d9f8c2e0

f6c39382

42

d75d4d26

483bba4d

f3c80288

7902369c

fcecdcd4

f0a8198c

00e3a7bb

d9f8c2e0

43

0744b618

d75d4d26

483bba4d

f3c80288

03186faa

fcecdcd4

f0a8198c

00e3a7bb

44

9cce9f01

0744b618

d75d4d26

483bba4d

a56f6bbf

03186faa

fcecdcd4

f0a8198c

45

a3701bd9

9cce9f01

0744b618

d75d4d26

af1bef5f

a56f6bbf

03186faa

fcecdcd4

46

131d4c09

a3701bd9

9cce9f01

0744b618

ecb77e1b

af1bef5f

a56f6bbf

03186faa

47

fb3777d9

131d4c09

a3701bd9

9cce9f01

1d601f44

ecb77e1b

af1bef5f

a56f6bbf

48

847ea00e

fb3777d9

131d4c09

a3701bd9

503a7b95

1d601f44

ecb77e1b

af1bef5f

49

aaa69347

847ea00e

fb3777d9

131d4c09

5eeb9930

503a7b95

1d601f44

ecb77e1b

50

505caf28

aaa69347

847ea00e

fb3777d9

ce695893

5eeb9930

503a7b95

1d601f44

51

675e0b02

505caf28

aaa69347

847ea00e

c22dd75f

ce695893

5eeb9930

503a7b95

52

abd26099

675e0b02

505caf28

aaa69347

1409c3f8

c22dd75f

ce695893

5eeb9930

53

0df9857a

abd26099

675e0b02

505caf28

2d864d9f

1409c3f8

c22dd75f

ce695893

54

308b8799

0df9857a

abd26099

675e0b02

02524f02

2d864d9f

1409c3f8

c22dd75f

55

909cc059

308b8799

0df9857a

abd26099

6f2a444a

02524f02

2d864d9f

1409c3f8

56

8d25bd94

909cc059

308b8799

0df9857a

1273c622

6f2a444a

02524f02

2d864d9f

57

f32141da

8d25bd94

909cc059

308b8799

1771ed3f

1273c622

6f2a444a

02524f02

58

8ce24395

f32141da

8d25bd94

909cc059

f52f66a6

1771ed3f

1273c622

6f2a444a

59

07bcd846

8ce24395

f32141da

8d25bd94

149db547

f52f66a6

1771ed3f

1273c622

60

622d5e5b

07bcd846

8ce24395

f32141da

b6f4c630

149db547

f52f66a6

1771ed3f

61

c693fc7a

622d5e5b

07bcd846

8ce24395

13dfb889

b6f4c630

149db547

f52f66a6

62

55d1c760

c693fc7a

622d5e5b

07bcd846

7e730e00

13dfb889

b6f4c630

149db547

63

fd89031b

55d1c760

c693fc7a

622d5e5b

55489ee6

7e730e00

13dfb889

b6f4c630

64

6203de4a

fd89031b

55d1c760

c693fc7a

2aedb1b3

55489ee6

7e730e00

13dfb889

杂凑值h0~h6

h0:0x23097d22

h1:0x3405d822

h2:0x8642a477

h3:0xbda255b3

h4:0x2aadbce4

h5:0xbda0b3f7

h6:0xe36c9da7

附录B 下载链接

https://download.csdn.net/download/u013073067/13138360

编译环境:VS2010

语言:C

参考文献:

[1]https://en.wikipedia.org/wiki/Secure_Hash_Algorithms

    原文作者:wangfeng.com
    原文地址: https://blog.csdn.net/u013073067/article/details/86605223
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞