SM2國密證書合法性驗證

  一般咱們遇到過的X509證書都是基於RSA-SHA1算法的,目前國家在大力推行國密算法,將來銀行發行的IC卡也都是基於PBOC3.0支持國密算法的,所以咱們來學習一下如何驗證SM2國密證書的合法性。至於SM2與SM3的算法實現不在本文討論範圍以內,能夠用openssl、BouncyCastle.Crypto.dll等第三方庫來實現。算法

  SM2國密證書與RSA證書同樣,通常內容都是以BASE64格式編碼的,以網上下載的一個自簽名證書爲例:學習

MIIB5jCCAZECAQAwVDELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAmZnMQ0wCwYDVQQHEwRzZG編碼

ZnMQwwCgYDVQQKEwM0NXkxDTALBgNVBAsTBGFlcnQxDDAKBgNVBAMTA2RmZzCCATQwge0Gspa

CCqBHIFFAYItMIHgAgEBMCwGByqGSM49AQECIQCFQtaeTARPGOi5JDW/b/feRXKDkVxFUX1yLtuLssl

CPHfwzBEBCB4eWi0+jLD/SQXhC5zu/7/LzyEi2gx1+DsZSKLOTfkmAQgY+TG07I7DISc+EJBSEv+ci

SPYdWaWxa6BubhLR2ifFJJoEQQRCHevWG2LqtnRkNOvDzDFeMiILO63VC9xMTmwUf+3UPQaAUSopenssl

vLtCwH1HNJ0hU7cMTl1/38v6NuoahYQbnkbgmiAiEAhULWnkwETxjouSQ1v2/33Sl3IGMEhWKNWuqt

dO58MuebcCAQEDQgAEwze7gBfVcry8A7QigOQxFPvv3/HZpOCIZq+46+z+BUeuXTxYDl00i+eh23it

0HmYP5pKWYZiZ9lR3bvcxFd17YKjAMBggqgRyBRQGDdQUAA0EAhneSdWonUMXL0Sk4vpzPtqZtable

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公鑰驗籤便可成功。

相關文章
相關標籤/搜索