原創不易,轉載請註明出處。
目錄
1.算法簡介
SHA英文全稱Secure Hash Algorithm,即安全散列算法。散列算法又稱雜湊算法或哈希算法,能將一定長度的消息計算出固定長度的字符串(又稱消息摘要)。SHA包含5個算法,分別是SHA-1、SHA-224、SHA-256、SHA-384和SHA-512,後四者並稱爲SHA-2。
SHA-1最大計算明文長度爲2^64bit,屬於分組算法,分組長度爲512bit,產生的信息摘要長度爲160bit。
SHA-1算法屬於雜湊算法,原則上不能通過密文推出明文。但SHA-1的安全性如今被密碼學家嚴重質疑。我國國家密碼管理局於2017年4月3日發佈《關於使用SHA-1密碼算法的風險提示》的通知,目前雜湊算法使用國密SM3雜湊算法,代替SHA系列算法。
本文將通過實例,詳細介紹SHA-1加密算法的加密流程。
2.符號
下列符號適用於本文本。
abcde:5個32bit字,迭代過程中使用
ABCDE:5個32bit字,迭代初始值
m:消息
m':填充後的消息
mod:模運算
Mt:每組消息的第t個32比特字
Wt:第t個子明文,32比特字
∧:32bit與運算
∨:32bit或運算
⊕:異或運算
<<<k:循環左移k比特運算
←:左向賦值運算符
3.加密算法流程
3.1 概述
對長度爲l (l<2^64bit )比特的消息 m,SHA-1雜湊算法經過填充和迭代壓縮,生成雜湊值,雜湊值長度爲160比特。
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 。
對每一個分組按下列方式迭代:
1)首先按照如下僞代碼得到80個子明文:
FOR t=0 TO t=15
Wt←Mt
ENDFOR
FOR t=16 TO t=79
Wt←(Wt ⊕Wt ⊕Wt ⊕Wt)<<<1
ENDFOR
Mt(0≤t≤15)是將分組512bit分成16個32bit字,Wt (0≤t≤79)是生成的80個子明文。
2)接下來進行80次迭代,分爲4組,每組20次。在80次迭代過程中,需要用到常數K和邏輯函數ft(b,c,d)。迭代次數不同,所取的常數K和邏輯函數ft(b,c,d)也不相同,如表3-1所示。
第t次迭代 |
常數K取值 |
邏輯函數ft(b,c,d) |
0≤t≤19 |
0x5A827999 |
ft(b,c,d)=(b∧c) ∨(~b∧d) |
20≤t≤39 |
0x6ED9EBA1 |
ft(b,c,d)=b⊕c⊕d |
40≤t≤59 |
0x8F1BBCDC |
ft(b,c,d)=(b∧c) ∨(b∧d) ∨(c∧d) |
60≤t≤79 |
0xCA62C1D6 |
ft(b,c,d)=b⊕c⊕d |
迭代初始值:A=0x67452301;B=0xEFCDAB89;C=0x98BADCFE;D=0x10325476;E=0xC3D2E1F0。
具體迭代步驟僞代碼如下:
a←A
b←B
c←C
d←D
e←E
FOR t=0 TO t=79
e←d
d←c
c←b<<<30
b←a
a←(a<<<5)+e+Wt+Kt+ft(b,c,d)
ENDFOR
A←A+a
B←B+b
C←C+c
D←D+d
E←E+e
注意前一組得到的ABCDE作爲下一分組的初始值,最終得到的ABCDE就是160bit雜湊值。
附錄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
80個子明文
W0~W3:0x61626380 0x00000000 0x00000000 0x00000000
W4~W7:0x00000000 0x00000000 0x00000000 0x00000000
W8~W11:0x00000000 0x00000000 0x00000000 0x00000000
W12~W15:0x00000000 0x00000000 0x00000000 0x00000018
W16~W19:0xc2c4c700 0x00000000 0x00000030 0x85898e01
W20~W23:0x00000000 0x00000060 0x0b131c03 0x00000030
W24~W27:0x85898ec1 0x16263806 0x00000000 0x00000180
W28~W31:0x2c4c700c 0x000000f0 0x93afb507 0x5898e048
W32~W35:0x8e9a9202 0x00000600 0xb131c0f0 0x16263bc6
W36~W39:0x4ebed41e 0x626380a1 0x16263806 0x000018c0
W40~W43:0xd2e138c4 0x00000f00 0x3afb5079 0x898e04e5
W44~W47:0xe2ba3c2b 0x000060c0 0x053a37cd 0x74458547
W48~W51:0xda9415ed 0x26380a16 0x626383a1 0x4ebf54de
W52~W55:0x3835b44b 0x0000f600 0x1e84c7a3 0x98e04d98
W56~W59:0x651d16a0 0x62658ca1 0x458544d6 0x44584cb7
W60~W63:0x7ba06619 0x6380aea2 0x0ae55269 0x627b49a1
W64~W67:0x7cd45c9d 0x000f0000 0xfb50753a 0xec6765e8
W68~W71:0xba3c2be2 0x0060c000 0x3a37cd05 0x458546f4
W72~W75:0xb8599dd6 0x380a1a26 0x01e02203 0xe7cc3456
W76~W79:0xe6e60b69 0x00f60a00 0x5795ef4f 0x822e0879
80輪迭代:
輪數 |
a |
b |
c |
d |
e |
0 |
0x67452301 |
0xefcdab89 |
0x98badcfe |
0x10325476 |
0xc3d2e1f0 |
1 |
0x0116fc33 |
0x67452301 |
0x7bf36ae2 |
0x98badcfe |
0x10325476 |
2 |
0x8990536d |
0x0116fc33 |
0x59d148c0 |
0x7bf36ae2 |
0x98badcfe |
3 |
0xa1390f08 |
0x8990536d |
0xc045bf0c |
0x59d148c0 |
0x7bf36ae2 |
4 |
0xcdd8e11b |
0xa1390f08 |
0x626414db |
0xc045bf0c |
0x59d148c0 |
5 |
0xcfd499de |
0xcdd8e11b |
0x284e43c2 |
0x626414db |
0xc045bf0c |
6 |
0x3fc7ca40 |
0xcfd499de |
0xf3763846 |
0x284e43c2 |
0x626414db |
7 |
0x993e30c1 |
0x3fc7ca40 |
0xb3f52677 |
0xf3763846 |
0x284e43c2 |
8 |
0x9e8c07d4 |
0x993e30c1 |
0x0ff1f290 |
0xb3f52677 |
0xf3763846 |
9 |
0x4b6ae328 |
0x9e8c07d4 |
0x664f8c30 |
0x0ff1f290 |
0xb3f52677 |
10 |
0x8351f929 |
0x4b6ae328 |
0x27a301f5 |
0x664f8c30 |
0x0ff1f290 |
11 |
0xfbda9e89 |
0x8351f929 |
0x12dab8ca |
0x27a301f5 |
0x664f8c30 |
12 |
0x63188fe4 |
0xfbda9e89 |
0x60d47e4a |
0x12dab8ca |
0x27a301f5 |
13 |
0x4607b664 |
0x63188fe4 |
0x7ef6a7a2 |
0x60d47e4a |
0x12dab8ca |
14 |
0x9128f695 |
0x4607b664 |
0x18c623f9 |
0x7ef6a7a2 |
0x60d47e4a |
15 |
0x196bee77 |
0x9128f695 |
0x1181ed99 |
0x18c623f9 |
0x7ef6a7a2 |
16 |
0x20bdd62f |
0x196bee77 |
0x644a3da5 |
0x1181ed99 |
0x18c623f9 |
17 |
0x4e925823 |
0x20bdd62f |
0xc65afb9d |
0x644a3da5 |
0x1181ed99 |
18 |
0x82aa6728 |
0x4e925823 |
0xc82f758b |
0xc65afb9d |
0x644a3da5 |
19 |
0xdc64901d |
0x82aa6728 |
0xd3a49608 |
0xc82f758b |
0xc65afb9d |
20 |
0xfd9e1d7d |
0xdc64901d |
0x20aa99ca |
0xd3a49608 |
0xc82f758b |
21 |
0x1a37b0ca |
0xfd9e1d7d |
0x77192407 |
0x20aa99ca |
0xd3a49608 |
22 |
0x33a23bfc |
0x1a37b0ca |
0x7f67875f |
0x77192407 |
0x20aa99ca |
23 |
0x21283486 |
0x33a23bfc |
0x868dec32 |
0x7f67875f |
0x77192407 |
24 |
0xd541f12d |
0x21283486 |
0x0ce88eff |
0x868dec32 |
0x7f67875f |
25 |
0xc7567dc6 |
0xd541f12d |
0x884a0d21 |
0x0ce88eff |
0x868dec32 |
26 |
0x48413ba4 |
0xc7567dc6 |
0x75507c4b |
0x884a0d21 |
0x0ce88eff |
27 |
0xbe35fbd5 |
0x48413ba4 |
0xb1d59f71 |
0x75507c4b |
0x884a0d21 |
28 |
0x4aa84d97 |
0xbe35fbd5 |
0x12104ee9 |
0xb1d59f71 |
0x75507c4b |
29 |
0x8370b52e |
0x4aa84d97 |
0x6f8d7ef5 |
0x12104ee9 |
0xb1d59f71 |
30 |
0xc5fbaf5d |
0x8370b52e |
0xd2aa1365 |
0x6f8d7ef5 |
0x12104ee9 |
31 |
0x1267b407 |
0xc5fbaf5d |
0xa0dc2d4b |
0xd2aa1365 |
0x6f8d7ef5 |
32 |
0x3b845d33 |
0x1267b407 |
0x717eebd7 |
0xa0dc2d4b |
0xd2aa1365 |
33 |
0x046faa0a |
0x3b845d33 |
0xc499ed01 |
0x717eebd7 |
0xa0dc2d4b |
34 |
0x2c0ebc11 |
0x046faa0a |
0xcee1174c |
0xc499ed01 |
0x717eebd7 |
35 |
0x21796ad4 |
0x2c0ebc11 |
0x811bea82 |
0xcee1174c |
0xc499ed01 |
36 |
0xdcbbb0cb |
0x21796ad4 |
0x4b03af04 |
0x811bea82 |
0xcee1174c |
37 |
0x0f511fd8 |
0xdcbbb0cb |
0x085e5ab5 |
0x4b03af04 |
0x811bea82 |
38 |
0xdc63973f |
0x0f511fd8 |
0xf72eec32 |
0x085e5ab5 |
0x4b03af04 |
39 |
0x4c986405 |
0xdc63973f |
0x03d447f6 |
0xf72eec32 |
0x085e5ab5 |
40 |
0x32de1cba |
0x4c986405 |
0xf718e5cf |
0x03d447f6 |
0xf72eec32 |
41 |
0xfc87dedf |
0x32de1cba |
0x53261901 |
0xf718e5cf |
0x03d447f6 |
42 |
0x970a0d5c |
0xfc87dedf |
0x8cb7872e |
0x53261901 |
0xf718e5cf |
43 |
0x7f193dc5 |
0x970a0d5c |
0xff21f7b7 |
0x8cb7872e |
0x53261901 |
44 |
0xee1b1aaf |
0x7f193dc5 |
0x25c28357 |
0xff21f7b7 |
0x8cb7872e |
45 |
0x40f28e09 |
0xee1b1aaf |
0x5fc64f71 |
0x25c28357 |
0xff21f7b7 |
46 |
0x1c51e1f2 |
0x40f28e09 |
0xfb86c6ab |
0x5fc64f71 |
0x25c28357 |
47 |
0xa01b846c |
0x1c51e1f2 |
0x503ca382 |
0xfb86c6ab |
0x5fc64f71 |
48 |
0xbead02ca |
0xa01b846c |
0x8714787c |
0x503ca382 |
0xfb86c6ab |
49 |
0xbaf39337 |
0xbead02ca |
0x2806e11b |
0x8714787c |
0x503ca382 |
50 |
0x120731c5 |
0xbaf39337 |
0xafab40b2 |
0x2806e11b |
0x8714787c |
51 |
0x641db2ce |
0x120731c5 |
0xeebce4cd |
0xafab40b2 |
0x2806e11b |
52 |
0x3847ad66 |
0x641db2ce |
0x4481cc71 |
0xeebce4cd |
0xafab40b2 |
53 |
0xe490436d |
0x3847ad66 |
0x99076cb3 |
0x4481cc71 |
0xeebce4cd |
54 |
0x27e9f1d8 |
0xe490436d |
0x8e11eb59 |
0x99076cb3 |
0x4481cc71 |
55 |
0x7b71f76d |
0x27e9f1d8 |
0x792410db |
0x8e11eb59 |
0x99076cb3 |
56 |
0x5e6456af |
0x7b71f76d |
0x09fa7c76 |
0x792410db |
0x8e11eb59 |
57 |
0xc846093f |
0x5e6456af |
0x5edc7ddb |
0x09fa7c76 |
0x792410db |
58 |
0xd262ff50 |
0xc846093f |
0xd79915ab |
0x5edc7ddb |
0x09fa7c76 |
59 |
0x09d785fd |
0xd262ff50 |
0xf211824f |
0xd79915ab |
0x5edc7ddb |
60 |
0x3f52de5a |
0x09d785fd |
0x3498bfd4 |
0xf211824f |
0xd79915ab |
61 |
0xd756c147 |
0x3f52de5a |
0x4275e17f |
0x3498bfd4 |
0xf211824f |
62 |
0x548c9cb2 |
0xd756c147 |
0x8fd4b796 |
0x4275e17f |
0x3498bfd4 |
63 |
0xb66c020b |
0x548c9cb2 |
0xf5d5b051 |
0x8fd4b796 |
0x4275e17f |
64 |
0x6b61c9e1 |
0xb66c020b |
0x9523272c |
0xf5d5b051 |
0x8fd4b796 |
65 |
0x19dfa7ac |
0x6b61c9e1 |
0xed9b0082 |
0x9523272c |
0xf5d5b051 |
66 |
0x101655f9 |
0x19dfa7ac |
0x5ad87278 |
0xed9b0082 |
0x9523272c |
67 |
0x0c3df2b4 |
0x101655f9 |
0x0677e9eb |
0x5ad87278 |
0xed9b0082 |
68 |
0x78dd4d2b |
0x0c3df2b4 |
0x4405957e |
0x0677e9eb |
0x5ad87278 |
69 |
0x497093c0 |
0x78dd4d2b |
0x030f7cad |
0x4405957e |
0x0677e9eb |
70 |
0x3f2588c2 |
0x497093c0 |
0xde37534a |
0x030f7cad |
0xde37534a |
71 |
0x5bcbb693 |
0x3f2588c2 |
0x125c24f0 |
0xde37534a |
0x030f7cad |
72 |
0x7fbd575a |
0x5bcbb693 |
0x8fc96230 |
0x125c24f0 |
0xde37534a |
73 |
0x1efd8e98 |
0x7fbd575a |
0xd6f2eda4 |
0x8fc96230 |
0x125c24f0 |
74 |
0x1b01acbd |
0x1efd8e98 |
0x9fef55d6 |
0xd6f2eda4 |
0x8fc96230 |
75 |
0x14221496 |
0x1b01acbd |
0x07bf63a6 |
0x9fef55d6 |
0xd6f2eda4 |
76 |
0x90b6115f |
0x14221496 |
0x46c06b2f |
0x07bf63a6 |
0x9fef55d6 |
77 |
0xbd576b26 |
0x90b6115f |
0x85088525 |
0x46c06b2f |
0x07bf63a6 |
78 |
0xd18493a8 |
0xbd576b26 |
0xe42d8457 |
0x85088525 |
0x46c06b2f |
79 |
0x75bdfbc2 |
0xd18493a8 |
0xaf55dac9 |
0xe42d8457 |
0x85088525 |
80 |
0x42541b35 |
0x5738d5e1 |
0x21834873 |
0x681e6df6 |
0xd8fdf6ad |
雜湊值ABCDE
A:0xa9993e36
B:0x4706816a
C:0xba3e2571
D:0x7850c26c
E:0x9cd0d89d
參考文獻:
[1]http://www.cnblogs.com/scu-cjx/p/6878853.html
[2]https://baike.baidu.com/item/SHA%E5%AE%B6%E6%97%8F/9849595?fr=aladdin&fromtitle=SHA&fromid=9533316