本文主要是介绍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,经填充得到比特串:
事实上,在编写程序时,应该先进行分组,对满足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~h6共224bit作为杂凑值。
附录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
这篇关于SHA-224摘要算法(带示例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!