SHA-256摘要算法(帶示例)

原創不易,轉載請註明出處。

目錄

1.      算法簡介

2.      符號

3.      加密算法流程

3.1 概述

3.2 填充

3.3 加密處理

附錄A 運算示例

1.算法簡介

SHA英文全稱Secure Hash Algorithm,即安全散列算法。散列算法又稱雜湊算法或哈希算法,能將一定長度的消息計算出固定長度的字符串(又稱消息摘要)。SHA包含5個算法,分別是SHA-1、SHA-224、SHA-256、SHA-384和SHA-512,後四者並稱爲SHA-2。

SHA-256最大計算明文長度爲2^64bit,屬於分組算法,分組長度爲512bit,產生的信息摘要長度爲256bit。SHA-256算法屬於密碼雜湊算法,原則上不能通過密文推出明文。

本文將通過實例,詳細介紹SHA-256加密算法的加密流程。

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-256雜湊算法經過填充和迭代壓縮,生成雜湊值,雜湊值長度爲256比特。

3.2 填充

假設消息m 的長度爲 l比特。首先將比特“1”添加到消息的末尾,再添加 k個“0”,k 是滿足l+1+k=448mod512 的最小的非負整數。然後再添加一個64位比特串,該比特串是長度l 的二進制表示。填充後的消息 m'的比特長度爲512的倍數。

例如:對消息01100001 01100010 01100011,其長度 =24,經填充得到比特串:

                  

事實上,在編寫程序時,應該先進行分組,對滿足512bit的分組先進行計算。當分到最後一組不足512bit時,再進行填充。

3.3 加密處理

將填充後的消息m' 按512比特進行分組:m'=B0B1……Bn-1,其中n=(l+k+65)/512 。

3.3.1 常量及初始值

初始哈希值:

h0= 0x6a09e667

h1= 0xbb67ae85

h2= 0x3c6ef372

h3= 0xa54ff53a

h4= 0x510e527f

h5= 0x9b05688c

h6= 0x1f83d9ab

h7= 0x5be0cd19

初始常量矩陣:

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~h7就是256bit雜湊值

附錄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

6a09e667

bb67ae85

3c6ef372

a54ff53a

510e527f

9b05688c

1f83d9ab

5be0cd19

1

5d6aebcd

6a09e667

bb67ae85

3c6ef372

fa2a4622

510e527f

9b05688c

1f83d9ab

2

5a6ad9ad

5d6aebcd

6a09e667

bb67ae85

78ce7989

fa2a4622

510e527f

9b05688c

3

c8c347a7

5a6ad9ad

5d6aebcd

6a09e667

f92939eb

78ce7989

fa2a4622

510e527f

4

d550f666

c8c347a7

5a6ad9ad

5d6aebcd

24e00850

f92939eb

78ce7989

fa2a4622

5

04409a6a

d550f666

c8c347a7

5a6ad9ad

43ada245

24e00850

f92939eb

78ce7989

6

2b4209f5

04409a6a

d550f666

c8c347a7

714260ad

43ada245

24e00850

f92939eb

7

e5030380

2b4209f5

04409a6a

d550f666

9b27a401

714260ad

43ada245

24e00850

8

85a07b5f

e5030380

2b4209f5

04409a6a

0c657a79

9b27a401

714260ad

43ada245

9

8e04ecb9

85a07b5f

e5030380

2b4209f5

32ca2d8c

0c657a79

9b27a401

714260ad

10

8c87346b

8e04ecb9

85a07b5f

e5030380

1cc92596

32ca2d8c

0c657a79

9b27a401

11

4798a3f4

8c87346b

8e04ecb9

85a07b5f

436b23e8

1cc92596

32ca2d8c

0c657a79

12

f71fc5a9

4798a3f4

8c87346b

8e04ecb9

816fd6e9

436b23e8

1cc92596

32ca2d8c

13

87912990

f71fc5a9

4798a3f4

8c87346b

1e578218

816fd6e9

436b23e8

1cc92596

14

d932eb16

87912990

f71fc5a9

4798a3f4

745a48de

1e578218

816fd6e9

436b23e8

15

c0645fde

d932eb16

87912990

f71fc5a9

0b92f20c

745a48de

1e578218

816fd6e9

16

b0fa238e

c0645fde

d932eb16

87912990

07590dcd

0b92f20c

745a48de

1e578218

17

21da9a9b

b0fa238e

c0645fde

d932eb16

8034229c

07590dcd

0b92f20c

745a48de

18

c2fbd9d1

21da9a9b

b0fa238e

c0645fde

846ee454

8034229c

07590dcd

0b92f20c

19

fe777bbf

c2fbd9d1

21da9a9b

b0fa238e

cc899961

846ee454

8034229c

07590dcd

20

e1f20c33

fe777bbf

c2fbd9d1

21da9a9b

b0638179

cc899961

846ee454

8034229c

21

9dc68b63

e1f20c33

fe777bbf

c2fbd9d1

8ada8930

b0638179

cc899961

846ee454

22

c2606d6d

9dc68b63

e1f20c33

fe777bbf

e1257970

8ada8930

b0638179

cc899961

23

a7a3623f

c2606d6d

9dc68b63

e1f20c33

49f5114a

e1257970

8ada8930

b0638179

24

c5d53d8d

a7a3623f

c2606d6d

9dc68b63

aa47c347

49f5114a

e1257970

8ada8930

25

1c2c2838

c5d53d8d

a7a3623f

c2606d6d

2823ef91

aa47c347

49f5114a

e1257970

26

cde8037d

1c2c2838

c5d53d8d

a7a3623f

14383d8e

2823ef91

aa47c347

49f5114a

27

b62ec4bc

cde8037d

1c2c2838

c5d53d8d

c74c6516

14383d8e

2823ef91

aa47c347

28

77d37528

b62ec4bc

cde8037d

1c2c2838

edffbff8

c74c6516

14383d8e

2823ef91

29

363482c9

77d37528

b62ec4bc

cde8037d

6112a3b7

edffbff8

c74c6516

14383d8e

30

a0060b30

363482c9

77d37528

b62ec4bc

ade79437

6112a3b7

edffbff8

c74c6516

31

ea992a22

a0060b30

363482c9

77d37528

0109ab3a

ade79437

6112a3b7

edffbff8

32

73b33bf5

ea992a22

a0060b30

363482c9

ba591112

0109ab3a

ade79437

6112a3b7

33

98e12507

73b33bf5

ea992a22

a0060b30

9cd9f5f6

ba591112

0109ab3a

ade79437

34

fe604df5

98e12507

73b33bf5

ea992a22

59249dd3

9cd9f5f6

ba591112

0109ab3a

35

a9a7738c

fe604df5

98e12507

73b33bf5

085f3833

59249dd3

9cd9f5f6

ba591112

36

65a0cfe4

a9a7738c

fe604df5

98e12507

f4b002d6

085f3833

59249dd3

9cd9f5f6

37

41a65cb1

65a0cfe4

a9a7738c

fe604df5

0772a26b

f4b002d6

085f3833

59249dd3

38

34df1604

41a65cb1

65a0cfe4

a9a7738c

a507a53d

0772a26b

f4b002d6

085f3833

39

6dc57a8a

34df1604

41a65cb1

65a0cfe4

f0781bc8

a507a53d

0772a26b

f4b002d6

40

79ea687a

6dc57a8a

34df1604

41a65cb1

1efbc0a0

f0781bc8

a507a53d

0772a26b

41

d6670766

79ea687a

6dc57a8a

34df1604

26352d63

1efbc0a0

f0781bc8

a507a53d

42

df46652f

d6670766

79ea687a

6dc57a8a

838b2711

26352d63

1efbc0a0

f0781bc8

43

17aa0dfe

df46652f

d6670766

79ea687a

decd4715

838b2711

26352d63

1efbc0a0

44

9d4baf93

17aa0dfe

df46652f

d6670766

fda24c2e

decd4715

838b2711

26352d63

45

26628815

9d4baf93

17aa0dfe

df46652f

a80f11f0

fda24c2e

decd4715

838b2711

46

72ab4b91

26628815

9d4baf93

17aa0dfe

b7755da1

a80f11f0

fda24c2e

decd4715

47

a14c14b0

72ab4b91

26628815

9d4baf93

d57b94a9

b7755da1

a80f11f0

fda24c2e

48

4172328d

a14c14b0

72ab4b91

26628815

fecf0bc6

d57b94a9

b7755da1

a80f11f0

49

05757ceb

4172328d

a14c14b0

72ab4b91

bd714038

fecf0bc6

d57b94a9

b7755da1

50

f11bfaa8

05757ceb

4172328d

a14c14b0

6e5c390c

bd714038

fecf0bc6

d57b94a9

51

7a0508a1

f11bfaa8

05757ceb

4172328d

52f1ccf7

6e5c390c

bd714038

fecf0bc6

52

886e7a22

7a0508a1

f11bfaa8

05757ceb

49231c1e

52f1ccf7

6e5c390c

bd714038

53

101fd28f

886e7a22

7a0508a1

f11bfaa8

529e7d00

49231c1e

52f1ccf7

6e5c390c

54

f5702fdb

101fd28f

886e7a22

7a0508a1

9f4787c3

529e7d00

49231c1e

52f1ccf7

55

3ec45cdb

f5702fdb

101fd28f

886e7a22

e50e1b4f

9f4787c3

529e7d00

49231c1e

56

38cc9913

3ec45cdb

f5702fdb

101fd28f

54cb266b

e50e1b4f

9f4787c3

529e7d00

57

fcd1887b

38cc9913

3ec45cdb

f5702fdb

9b5e906c

54cb266b

e50e1b4f

9f4787c3

58

c062d46f

fcd1887b

38cc9913

3ec45cdb

7e44008e

9b5e906c

54cb266b

e50e1b4f

59

ffb70472

c062d46f

fcd1887b

38cc9913

6d83bfc6

7e44008e

9b5e906c

54cb266b

60

b6ae8fff

ffb70472

c062d46f

fcd1887b

b21bad3d

6d83bfc6

7e44008e

9b5e906c

61

b85e2ce9

b6ae8fff

ffb70472

c062d46f

961f4894

b21bad3d

6d83bfc6

7e44008e

62

04d24d6c

b85e2ce9

b6ae8fff

ffb70472

948d25b6

961f4894

b21bad3d

6d83bfc6

63

d39a2165

04d24d6c

b85e2ce9

b6ae8fff

fb121210

948d25b6

961f4894

b21bad3d

64

506e3058

d39a2165

04d24d6c

b85e2ce9

5ef50f24

fb121210

948d25b6

961f4894

雜湊值h0~h7

h0:0xba7816bf

h1:0x8f01cfea

h2:0x414140de

h3:0x5dae2223

h4:0xb00361a3

h5:0x96177a9c

h6:0xb410ff61

h7:0xf20015ad

參考文獻:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章