SM3加密过程

以abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd为例子

字符串 “abcd*16” 的ASCII码为:
a = 0x61 = 01100001
b = 0x62 = 01100010
c = 0x63 = 01100011
d = 0x64 = 01100100

所以,”abcd x 16” 的二进制表示为:
01100001 01100010 01100011 01100100 (x16)
32 x 16 = 512位

消息填充

  1. 添加比特1
    当前为: 01100001 01100010 01100011 01100100 (x16) 1
    当前位数: 513 位


  2. 补 “0” 直到长度满足 (长度 % 512) = 448
    513%512 = 1
    当前为: 01100001 01100010 01100011 01100100 … 1 0…0000(448-1 = 447个0)
    当前位数: 513 + 447 = 960位


  3. 添加64位的长度信息
    abcd*16 共 512位,用64位标识512即0000000000000200 H
    00000000 00000000 00000000 00000000 00000000 00000000 00000010 00000000
    当前为: 01100001 01100010 01100011 01100100 1 0…000(447个0) 0…010 0000000(64位长度表示)
    当前位数: 960 + 64 = 1024位


  4. 填充后消息大于512位,进行分组
    512位为一组,共B0、B1两组
    当前B0为: 01100001 01100010 01100011 01100100 (x16)
    当前B0位数为: 512位
    当前B1为: 1 0…0(447个0) 0…010 0000000(64位长度表示)
    当前B1位数为: 512位

消息扩展

B0、B1d都要扩展为(W0, W1, …, W67 和 W‘0, W’1, …, W‘63)
一个W占32位,共132个W

先看B0

B0的前16个W(W0-15)就是填充完的消息

j Wj 十六进制 说明
0 W0 61626364 “abcd”
1 W1 61626364 “abcd”
2 W2 61626364 “abcd”
3 W3 61626364 “abcd”
4 W4 61626364 “abcd”
5 W5 61626364 “abcd”
6 W6 61626364 “abcd”
7 W7 61626364 “abcd”
8 W8 61626364 “abcd”
9 W9 61626364 “abcd”
10 W10 61626364 “abcd”
11 W11 61626364 “abcd”
12 W12 61626364 “abcd”
13 W13 61626364 “abcd”
14 W14 61626364 “abcd”
15 W15 61626364 “abcd”

B0的扩展生成 W16 到 W67

1
2
3
FOR j=16 TO 67 
Wj ←P1(Wj−16 ⊕Wj−9 ⊕(Wj−3 ≪15))⊕(Wj−13 ≪ 7)⊕Wj−6
ENDFOR

其中P1具体实现为

1
P1(X) = X ⊕ (X ≪ 15) ⊕ (X ≪ 23)

B0的扩展生成 W’0 到 W’63

1
2
3
FOR j=0 TO 63
W′j = Wj ⊕Wj+4 //Wi与Wi+4互相异或
ENDFOR

此时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
W0W1...W67
61626364 61626364 61626364 61626364 61626364 61626364 61626364 61626364
61626364 61626364 61626364 61626364 61626364 61626364 61626364 61626364
a121a024 a121a024 a121a024 6061e0e5 6061e0e5 6061e0e5 a002e345 a002e345
a002e345 49c969ed 49c969ed 49c969ed 85ae5679 a44ff619 a44ff619 694b6244
e8c8e0c4 e8c8e0c4 240e103e 346e603e 346e603e 9a517ab5 8a01aa25 8a01aa25
0607191c 25f8a37a d528936a 89fbd8ae 00606206 10501256 7cff7ef9 3c78b9f9
cc2b8a69 9f03f169 df45be20 9ec5bee1 0a212906 49ff72c0 46717241 67e09a19
6efaa333 2ebae676 3475c386 201dcff6 2f18fccf 2c5f2b5c a80b9f38 bc139f34
c47f18a7 a25ce71d 42743705 51baf619

W′0W′1...W′63
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 c043c340 c043c340 c043c340 01038381
c14040c1 c14040c1 01234361 c06303a0 c06303a0 29a88908 e9cb8aa8 e9cb8aa8
25acb53c ed869ff4 ed869ff4 20820ba9 6d66b6bd 4c8716dd 8041e627 5d25027a
dca680fa 72999a71 ae0fba1b be6fca1b 32697922 bfa9d9cf 5f29394f 03fa728b
06677b1a 35a8b12c a9d7ed93 b5836157 cc4be86f 8f53e33f a3bac0d9 a2bd0718
c60aa36f d6fc83a9 9934cc61 f92524f8 64db8a35 674594b6 7204b1c7 47fd55ef
41e25ffc 02e5cd2a 9c7e5cbe 9c0e50c2 eb67e468 8e03cc41 ea7fa83d eda9692d

由同样的方法可以得到B1的消息扩展

B1的前16个W(W0-15)就是填充完的消息

j Wj 十六进制 说明
0 W0 80000000 首位的1 + 31个0
1 W1 00000000 32个0
2 W2 00000000 32个0
3 W3 00000000 32个0
4 W4 00000000 32个0
5 W5 00000000 32个0
6 W6 00000000 32个0
7 W7 00000000 32个0
8 W8 00000000 32个0
9 W9 00000000 32个0
10 W10 00000000 32个0
11 W11 00000000 32个0
12 W12 00000000 32个0
13 W13 00000000 32个0
14 W14 00000000 长度值的前32位(全0)
15 W15 00000200 长度值的后32位(512 = 0x200)

B1的W16 到 W67和W’0 到 W’63用和B0一样的算法

得到的结果为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
W0-W67
80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000200
80404000 00000000 01008080 10005000 00000000 002002a0 ac545c04 00000000
09582a39 a0003000 00000000 00200280 a4515804 20200040 51609838 30005701
a0002000 008200aa 6ad525d0 0a0e0216 b0f52042 fa7073b0 20000000 008200a8
7a542590 22a20044 d5d6ebd2 82005771 8a202240 b42826aa eaf84e59 4898eaf9
8207283d ee6775fa a3e0e0a0 8828488a 23b45a5d 628a22c4 8d6d0615 38300a7e
e96260e5 2b60c020 502ed531 9e878cb9 218c38f8 dcae3cb7 2a3e0e0a e9e0c461
8c3e3831 44aaa228 dc60a38b 518300f7
W'1-W'63
80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000200 80404000 00000000 01008080 10005200
80404000 002002a0 ad54dc84 10005000 09582a39 a02032a0 ac545c04 00200280
ad09723d 80203040 51609838 30205581 04517804 20a200ea 3bb5bde8 3a0e5517
10f50042 faf2731a 4ad525d0 0a8c02be caa105d2 d8d273f4 f5d6ebd2 828257d9
f07407d0 968a26ee 3f2ea58b ca98bd88 08270a7d 5a4f5350 4918aef9 c0b0a273
a1b37260 8ced573e 2e8de6b5 b01842f4 cad63ab8 49eae2e4 dd43d324 a6b786c7
c8ee581d f7cefc97 7a10db3b 776748d8 adb200c9 98049e9f f65ead81 b863c496

压缩函数

V0 =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
计算压缩函数Vi+1 = CF(V(i), B(i)) (0 ≤ i ≤ n−1,这里就B0、B1)
令A,B,C,D,E,F,G,H = V0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FOR j=0 TO 63
SS1 ← ((A ≪ 12) + E + (Tj ≪ j)) ≪ 7
SS2 ← SS1 ⊕ (A ≪ 12)
T T1 ← F Fj (A, B, C) + D + SS2 + W′j
T T2 ← GGj (E, F, G) + H + SS1 + Wj
D ← C
C ← B ≪ 9
B ← A
A ← T T1
H ← G
G ← F ≪ 19
F ← E
E ← P0(T T2)
ENDFOR
V(i+1) ← ABCDEFGH ⊕ V(i)

其中

1
2
3
Tj =
79cc4519 (0 ≤ j ≤ 15)
7a879d8a (16 ≤ j ≤ 63)
1
P0(X) = X ⊕ (X ≪ 9) ⊕ (X ≪ 17)
1
2
3
4
5
6
7
F Fj (X, Y, Z)= 
X ⊕ Y ⊕ Z (0 ≤ j ≤ 15)
(X ∧ Y ) ∨ (X ∧ Z) ∨ (Y ∧ Z ) (16 ≤ j ≤ 63)

GGj (X, Y, Z) =
X ⊕ Y ⊕ Z (0 ≤ j ≤ 15)
(X ∧ Y ) ∨ ( ¬X∧ Z) (16 ≤ j ≤ 63)

先为B0来一轮压缩

得到V1 = CF(ABCDEFGH)

再次让(ABCDEFGH) = V1

得到V2 = ABCDEFGH