原創不易,轉載請註明出處。
目錄
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
參考文獻: