通常我們遇到過的X509證書都是基於RSA-SHA1算法的,目前國家在大力推行國密算法,未來銀行發行的IC卡也都是基於PBOC3.0支持國密算法的,因此我們來學習一下如何驗證SM2國密證書的合法性。至於SM2與SM3的算法實現不在本文討論范圍之內,可以用openssl、BouncyCastle.Crypto.dll等第三方庫來實現。
SM2國密證書與RSA證書一樣,一般內容都是以BASE64格式編碼的,以網上下載的一個自簽名證書為例:
MIIB5jCCAZECAQAwVDELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAmZnMQ0wCwYDVQQHEwRzZG
ZnMQwwCgYDVQQKEwM0NXkxDTALBgNVBAsTBGFlcnQxDDAKBgNVBAMTA2RmZzCCATQwge0G
CCqBHIFFAYItMIHgAgEBMCwGByqGSM49AQECIQCFQtaeTARPGOi5JDW/b/feRXKDkVxFUX1yLtuL
CPHfwzBEBCB4eWi0+jLD/SQXhC5zu/7/LzyEi2gx1+DsZSKLOTfkmAQgY+TG07I7DISc+EJBSEv+
SPYdWaWxa6BubhLR2ifFJJoEQQRCHevWG2LqtnRkNOvDzDFeMiILO63VC9xMTmwUf+3UPQaAUS
vLtCwH1HNJ0hU7cMTl1/38v6NuoahYQbnkbgmiAiEAhULWnkwETxjouSQ1v2/33Sl3IGMEhWKNWu
dO58MuebcCAQEDQgAEwze7gBfVcry8A7QigOQxFPvv3/HZpOCIZq+46+z+BUeuXTxYDl00i+eh23
0HmYP5pKWYZiZ9lR3bvcxFd17YKjAMBggqgRyBRQGDdQUAA0EAhneSdWonUMXL0Sk4vpzPtqZ
vUddbYo/Bb7o3a+Tek4+v/kp8q7hvA+2BubXpTSAE2AjE0qytc4THB++vmI75Lg==
經過BASE64解碼后是TLV格式,再解析得到如下表格:
TAG |
名稱 |
長度 |
值 |
|||||||
30 |
未知標簽 |
1E6 |
||||||||
30 |
未知標簽 |
191 |
||||||||
02 |
未知標簽 |
01 |
00 |
|||||||
30 |
未知標簽 |
54 |
||||||||
31 |
未知標簽 |
0B |
||||||||
30 |
未知標簽 |
09 |
||||||||
06 |
未知標簽 |
03 |
55 04 06 |
|||||||
13 |
未知標簽 |
02 |
43 4E |
|||||||
31 |
未知標簽 |
0B |
||||||||
30 |
未知標簽 |
09 |
||||||||
06 |
未知標簽 |
03 |
55 04 08 |
|||||||
13 |
未知標簽 |
02 |
66 67 |
|||||||
31 |
未知標簽 |
0D |
||||||||
30 |
未知標簽 |
0B |
||||||||
06 |
未知標簽 |
03 |
55 04 07 |
|||||||
13 |
未知標簽 |
04 |
73 64 66 67 |
|||||||
31 |
未知標簽 |
0C |
||||||||
30 |
未知標簽 |
0A |
||||||||
06 |
未知標簽 |
03 |
55 04 0A |
|||||||
13 |
未知標簽 |
03 |
34 35 79 |
|||||||
31 |
未知標簽 |
0D |
||||||||
30 |
未知標簽 |
0B |
||||||||
06 |
未知標簽 |
03 |
55 04 0B |
|||||||
13 |
未知標簽 |
04 |
61 65 72 74 |
|||||||
31 |
未知標簽 |
0C |
||||||||
30 |
未知標簽 |
0A |
||||||||
06 |
未知標簽 |
03 |
55 04 03 |
|||||||
13 |
未知標簽 |
03 |
64 66 67 |
|||||||
30 |
未知標簽 |
134 |
||||||||
30 |
未知標簽 |
ED |
||||||||
06 |
未知標簽 |
08 |
2A 81 1C 81 45 01 82 2D |
|||||||
30 |
未知標簽 |
E0 |
||||||||
02 |
未知標簽 |
01 |
01 |
|||||||
30 |
未知標簽 |
2C |
||||||||
06 |
未知標簽 |
07 |
2A 86 48 CE 3D 01 01 |
|||||||
02 |
未知標簽 |
21 |
00 85 42 D6 9E 4C 04 4F 18 E8 B9 24 35 BF 6F F7 DE 45 72 83 91 5C 45 51 7D 72 2E DB 8B 08 F1 DF C3 |
|||||||
30 |
未知標簽 |
44 |
||||||||
04 |
未知標簽 |
20 |
78 79 68 B4 FA 32 C3 FD 24 17 84 2E 73 BB FE FF 2F 3C 84 8B 68 31 D7 E0 EC 65 22 8B 39 37 E4 98 |
|||||||
04 |
未知標簽 |
20 |
63 E4 C6 D3 B2 3B 0C 84 9C F8 42 41 48 4B FE 48 F6 1D 59 A5 B1 6B A0 6E 6E 12 D1 DA 27 C5 24 9A |
|||||||
04 |
未知標簽 |
41 |
04 42 1D EB D6 1B 62 EA B6 74 64 34 EB C3 CC 31 5E 32 22 0B 3B AD D5 0B DC 4C 4E 6C 14 7F ED D4 3D 06 80 51 2B CB B4 2C 07 D4 73 49 D2 15 3B 70 C4 E5 D7 FD FC BF A3 6E A1 A8 58 41 B9 E4 6E 09 A2 |
|||||||
02 |
未知標簽 |
21 |
00 85 42 D6 9E 4C 04 4F 18 E8 B9 24 35 BF 6F F7 DD 29 77 20 63 04 85 62 8D 5A E7 4E E7 C3 2E 79 B7 |
|||||||
02 |
未知標簽 |
01 |
01 |
|||||||
03 |
未知標簽 |
42 |
00 04 C3 37 BB 80 17 D5 72 BC BC 03 B4 22 80 E4 31 14 FB EF DF F1 D9 A4 E0 88 66 AF B8 EB EC FE 05 47 AE 5D 3C 58 0E 5D 34 8B E7 A1 DB 7D 07 99 83 F9 A4 A5 98 66 26 7D 95 1D DB BD CC 45 77 5E D8 2A 04表示SM2密鑰 后面32字節表示公鑰X 后面32字節表示公鑰Y |
|||||||
30 |
未知標簽 |
0C |
||||||||
06 |
未知標簽 |
08 |
2A 81 1C 81 45 01 83 75 |
|||||||
05 |
未知標簽 |
00 |
||||||||
03 |
未知標簽 |
41 |
00 86 77 92 75 6A 27 50 C5 CB D1 29 38 BE 9C CF B6 A6 6F 51 D7 5B 62 8F C1 6F BA 37 6B E4 DE 93 8F AF FE 4A 7C AB B8 6F 03 ED 81 B9 B5 E9 4D 20 04 D8 08 C4 D2 AC AD 73 84 C7 07 EF AF 98 8E F9 2E 簽名后的數據 |
從上面的表格中可以得到SM2公鑰與簽名后數據:
公鑰X:C3 37 BB 80 17 D5 72 BC BC 03 B4 22 80 E4 31 14 FB EF DF F1 D9 A4 E0 88 66 AF B8 EB EC FE 05 47
公鑰Y:AE 5D 3C 58 0E 5D 34 8B E7 A1 DB 7D 07 99 83 F9 A4 A5 98 66 26 7D 95 1D DB BD CC 45 77 5E D8 2A
簽名后的數據:86 77 92 75 6A 27 50 C5 CB D1 29 38 BE 9C CF B6 A6 6F 51 D7 5B 62 8F C1 6F BA 37 6B E4 DE 93 8F AF FE 4A 7C AB B8 6F 03 ED 81 B9 B5 E9 4D 20 04 D8 08 C4 D2 AC AD 73 84 C7 07 EF AF 98 8E F9 2E
接下來取證書數據的第二層TAG的第一個TAG 30(即表格中斜體部分數據),對數據進行SM3計算后得到
HASH值:C8 72 D5 09 1D 2A 11 67 28 65 F5 C4 55 8E C2 3F A9 2F 53 BC E5 90 96 8D AC 91 20 9B 63 BD AD 34
用SM2公鑰驗簽即可成功。
接下來用國密局的自簽名SM2證書來示范,數據處理有所不同
MIICaDCCAgygAwIBAgIJAK8ocl2Y0zFDMAwGCCqBHM9VAYN1BQAwfTELMAkGA1UEBgwCY24xCz
AJBgNVBAgMAmJqMQswCQYDVQQHDAJiajEPMA0GA1UECgwGdG9wc2VjMQ8wDQYDVQQLDAZ0b
3BzZWMxETAPBgNVBAMMCFRvcHNlY0NBMR8wHQYJKoZIhvcNAQkBDBBiakB0b3BzZWMuY29tLm
NuMB4XDTEyMDYyNDA3NTQzOVoXDTMyMDYyMDA3NTQzOVowfTELMAkGA1UEBgwCY24xCzAJB
gNVBAgMAmJqMQswCQYDVQQHDAJiajEPMA0GA1UECgwGdG9wc2VjMQ8wDQYDVQQLDAZ0b3Bz
ZWMxETAPBgNVBAMMCFRvcHNlY0NBMR8wHQYJKoZIhvcNAQkBDBBiakB0b3BzZWMuY29tLmNuM
FkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE1pwvHuw7+2uVswwoCFx3sSXXepw5Ul2BkHaPN9ayB
bWJ3NMWu+fYmp3CGRfxd5nmmFMfXm4+EL0xNwslnD+Bw6NzMHEwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUjl2QNHhYuqrYcNi9+6aoXntWO2QwHwYDVR0jBBgwFoAUjl2QNHhYuqrYcNi9+
6aoXntWO2QwCwYDVR0PBAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIAVzAMBggqgRzPVQGDdQU
AA0gAMEUCIQCGqTACsUVb7KXmi8E5pqJtyWpKj1Mm0vPokvH6ondQKwIgFH5vrHQjncD1e9avYQB
SF9fxplgZ/tdU9nxDgh2HnRU=
經過BASE64解碼后再解析TLV格式,得到如下表格
TAG |
名稱 |
長度 |
值 |
||||||||
30 |
未知標簽 |
268 |
|||||||||
30 |
未知標簽 |
20C |
|||||||||
A0 |
未知標簽 |
03 |
|||||||||
02 |
未知標簽 |
01 |
02 |
||||||||
02 |
未知標簽 |
09 |
00 AF 28 72 5D 98 D3 31 43 |
||||||||
30 |
未知標簽 |
0C |
|||||||||
06 |
未知標簽 |
08 |
2A 81 1C CF 55 01 83 75 |
||||||||
05 |
未知標簽 |
00 |
|||||||||
30 |
未知標簽 |
7D |
|||||||||
31 |
未知標簽 |
0B |
|||||||||
30 |
未知標簽 |
09 |
|||||||||
06 |
未知標簽 |
03 |
55 04 06 |
||||||||
0C |
未知標簽 |
02 |
63 6E |
||||||||
31 |
未知標簽 |
0B |
|||||||||
30 |
未知標簽 |
09 |
|||||||||
06 |
未知標簽 |
03 |
55 04 08 |
||||||||
0C |
未知標簽 |
02 |
62 6A |
||||||||
31 |
未知標簽 |
0B |
|||||||||
30 |
未知標簽 |
09 |
|||||||||
06 |
未知標簽 |
03 |
55 04 07 |
||||||||
0C |
未知標簽 |
02 |
62 6A |
||||||||
31 |
未知標簽 |
0F |
|||||||||
30 |
未知標簽 |
0D |
|||||||||
06 |
未知標簽 |
03 |
55 04 0A |
||||||||
0C |
未知標簽 |
06 |
74 6F 70 73 65 63 |
||||||||
31 |
未知標簽 |
0F |
|||||||||
30 |
未知標簽 |
0D |
|||||||||
06 |
未知標簽 |
03 |
55 04 0B |
||||||||
0C |
未知標簽 |
06 |
74 6F 70 73 65 63 |
||||||||
31 |
未知標簽 |
11 |
|||||||||
30 |
未知標簽 |
0F |
|||||||||
06 |
未知標簽 |
03 |
55 04 03 |
||||||||
0C |
未知標簽 |
08 |
54 6F 70 73 65 63 43 41 |
||||||||
31 |
未知標簽 |
1F |
|||||||||
30 |
未知標簽 |
1D |
|||||||||
06 |
未知標簽 |
09 |
2A 86 48 86 F7 0D 01 09 01 |
||||||||
0C |
未知標簽 |
10 |
62 6A 40 74 6F 70 73 65 63 2E 63 6F 6D 2E 63 6E |
||||||||
30 |
未知標簽 |
1E |
|||||||||
17 |
未知標簽 |
0D |
31 32 30 36 32 34 30 37 35 34 33 39 5A |
||||||||
17 |
未知標簽 |
0D |
33 32 30 36 32 30 30 37 35 34 33 39 5A |
||||||||
30 |
未知標簽 |
7D |
|||||||||
31 |
未知標簽 |
0B |
|||||||||
30 |
未知標簽 |
09 |
|||||||||
06 |
未知標簽 |
03 |
55 04 06 |
||||||||
0C |
未知標簽 |
02 |
63 6E |
||||||||
31 |
未知標簽 |
0B |
|||||||||
30 |
未知標簽 |
09 |
|||||||||
06 |
未知標簽 |
03 |
55 04 08 |
||||||||
0C |
未知標簽 |
02 |
62 6A |
||||||||
31 |
未知標簽 |
0B |
|||||||||
30 |
未知標簽 |
09 |
|||||||||
06 |
未知標簽 |
03 |
55 04 07 |
||||||||
0C |
未知標簽 |
02 |
62 6A |
||||||||
31 |
未知標簽 |
0F |
|||||||||
30 |
未知標簽 |
0D |
|||||||||
06 |
未知標簽 |
03 |
55 04 0A |
||||||||
0C |
未知標簽 |
06 |
74 6F 70 73 65 63 |
||||||||
31 |
未知標簽 |
0F |
|||||||||
30 |
未知標簽 |
0D |
|||||||||
06 |
未知標簽 |
03 |
55 04 0B |
||||||||
0C |
未知標簽 |
06 |
74 6F 70 73 65 63 |
||||||||
31 |
未知標簽 |
11 |
|||||||||
30 |
未知標簽 |
0F |
|||||||||
06 |
未知標簽 |
03 |
55 04 03 |
||||||||
0C |
未知標簽 |
08 |
54 6F 70 73 65 63 43 41 |
||||||||
31 |
未知標簽 |
1F |
|||||||||
30 |
未知標簽 |
1D |
|||||||||
06 |
未知標簽 |
09 |
2A 86 48 86 F7 0D 01 09 01 |
||||||||
0C |
未知標簽 |
10 |
62 6A 40 74 6F 70 73 65 63 2E 63 6F 6D 2E 63 6E |
||||||||
30 |
未知標簽 |
59 |
|||||||||
30 |
未知標簽 |
13 |
|||||||||
06 |
未知標簽 |
07 |
2A 86 48 CE 3D 02 01 |
||||||||
06 |
未知標簽 |
08 |
2A 81 1C CF 55 01 82 2D |
||||||||
03 |
未知標簽 |
42 |
00 04 D6 9C 2F 1E EC 3B FB 6B 95 B3 0C 28 08 5C 77 B1 25 D7 7A 9C 39 52 5D 81 90 76 8F 37 D6 B2 05 B5 89 DC D3 16 BB E7 D8 9A 9D C2 19 17 F1 77 99 E6 98 53 1F 5E 6E 3E 10 BD 31 37 0B 25 9C 3F 81 C3 04表示SM2密鑰 后面32字節表示公鑰X 后面32字節表示公鑰Y |
||||||||
A3 |
未知標簽 |
73 |
|||||||||
30 |
未知標簽 |
71 |
|||||||||
30 |
未知標簽 |
0F |
|||||||||
06 |
未知標簽 |
03 |
55 1D 13 |
||||||||
01 |
未知標簽 |
01 |
FF |
||||||||
04 |
未知標簽 |
05 |
|||||||||
30 |
未知標簽 |
03 |
|||||||||
01 |
未知標簽 |
01 |
FF |
||||||||
30 |
未知標簽 |
1D |
|||||||||
06 |
未知標簽 |
03 |
55 1D 0E |
||||||||
04 |
未知標簽 |
16 |
|||||||||
04 |
未知標簽 |
14 |
8E 5D 90 34 78 58 BA AA D8 70 D8 BD FB A6 A8 5E 7B 56 3B 64 |
||||||||
30 |
未知標簽 |
1F |
|||||||||
06 |
未知標簽 |
03 |
55 1D 23 |
||||||||
04 |
未知標簽 |
18 |
|||||||||
30 |
未知標簽 |
16 |
|||||||||
80 |
響應報文模板格式 |
14 |
8E 5D 90 34 78 58 BA AA D8 70 D8 BD FB A6 A8 5E 7B 56 3B 64 |
||||||||
30 |
未知標簽 |
0B |
|||||||||
06 |
未知標簽 |
03 |
55 1D 0F |
||||||||
04 |
未知標簽 |
04 |
|||||||||
03 |
未知標簽 |
02 |
01 06 |
||||||||
30 |
未知標簽 |
11 |
|||||||||
06 |
未知標簽 |
09 |
60 86 48 01 86 F8 42 01 01 |
||||||||
04 |
未知標簽 |
04 |
|||||||||
03 |
未知標簽 |
02 |
00 57 |
||||||||
30 |
未知標簽 |
0C |
|||||||||
06 |
未知標簽 |
08 |
2A 81 1C CF 55 01 83 75 |
||||||||
05 |
未知標簽 |
00 |
|||||||||
03 |
未知標簽 |
48 |
|||||||||
30 |
未知標簽 |
45 |
|||||||||
02 |
未知標簽 |
21 |
00 86 A9 30 02 B1 45 5B EC A5 E6 8B C1 39 A6 A2 6D C9 6A 4A 8F 53 26 D2 F3 E8 92 F1 FA A2 77 50 2B 簽名后的數據R |
||||||||
02 |
未知標簽 |
20 |
14 7E 6F AC 74 23 9D C0 F5 7B D6 AF 61 00 52 17 D7 F1 A6 58 19 FE D7 54 F6 7C 43 82 1D 87 9D 15 簽名后的數據S |
公鑰X:D6 9C 2F 1E EC 3B FB 6B 95 B3 0C 28 08 5C 77 B1 25 D7 7A 9C 39 52 5D 81 90 76 8F 37 D6 B2 05 B5
公鑰Y:89 DC D3 16 BB E7 D8 9A 9D C2 19 17 F1 77 99 E6 98 53 1F 5E 6E 3E 10 BD 31 37 0B 25 9C 3F 81 C3
簽名后的數據:86 A9 30 02 B1 45 5B EC A5 E6 8B C1 39 A6 A2 6D C9 6A 4A 8F 53 26 D2 F3 E8 92 F1 FA A2 77 50 2B 14 7E 6F AC 74 23 9D C0 F5 7B D6 AF 61 00 52 17 D7 F1 A6 58 19 FE D7 54 F6 7C 43 82 1D 87 9D 15
取證書數據的第二層TAG的第一個TAG 30(即表格中斜體部分數據),得到數據M
注意:國密局的SM2證書驗簽時,需要對上面的數據進行數據填充(填充方式詳見PBOC3.0規范第17部分)。
我猜測是這樣的規則:如果簽名后的數據不是TLV格式的,則直接進行SM3計算,否則就需要進行數據填充。
下面一步步對數據進行操作:
第一步,組建數據ZA並計算HASH值
00 80(用戶ID的bit位長度)
31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38(用戶ID)
FF FF FF FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FC (橢圓曲線公鑰密碼算法推薦曲線參數a)
28 E9 FA 9E 9D 9F 5E 34 4D 5A 9E 4B CF 65 09 A7 F3 97 89 F5 15 AB 8F 92 DD BC BD 41 4D 94 0E 93 (橢圓曲線公鑰密碼算法推薦曲線參數b)
32 C4 AE 2C 1F 19 81 19 5F 99 04 46 6A 39 C9 94 8F E3 0B BF F2 66 0B E1 71 5A 45
89 33 4C 74 C7 (橢圓曲線公鑰密碼算法推薦曲線參數Gx)
BC 37 36 A2 F4 F6 77 9C 59 BD CE E3 6B 69 21 53 D0 A9 87 7C C6 2A 47 40 02 DF 32 E5 21 39 F0 A0(橢圓曲線公鑰密碼算法推薦曲線參數Gy)
D6 9C 2F 1E EC 3B FB 6B 95 B3 0C 28 08 5C 77 B1 25 D7 7A 9C 39 52 5D 81 90 76 8F 37 D6 B2 05 B5(公鑰X)
89 DC D3 16 BB E7 D8 9A 9D C2 19 17 F1 77 99 E6 98 53 1F 5E 6E 3E 10 BD 31 37 0B 25 9C 3F 81 C3(公鑰Y)
對上面數據進行SM3計算得到
4D 38 D2 95 8C A7 FD 2C FA E3 AF 04 48 69 59 CF 92 C8 EF 48 E8 B8 3A 05 C1 12 E7 39 D5 F1 81 D0
第二步,上面的SM3結果加上數據M,再進行SM3計算得到
HASH值:C3 B0 2E 50 0A 8B 60 B7 7D ED CF 6F 4C 11 BE F8 D5 6E 5C DE 70 8C 72 06 56 54 FD 7B 21 67 91 5A
用SM2公鑰驗簽即可成功。