SM2国密证书合法性验证

  通常我们遇到过的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公钥验签即可成功。

时间: 2024-08-05 15:46:19

SM2国密证书合法性验证的相关文章

IIS SSL取消证书合法性验证

cscript adsutil.vbs set w3svc/certcheckmode 1win 2003 IIS 6 以下执行以上代码,去除证书的合法性验证 cscript adsutil.vbs SET w3svc/9/CertCheckMode 1 cscript adsutil.vbs SET w3svc/n/CertCheckMode 1其中 n是站点的IDwin7/2008 执行以上代码执行成功后,重启IIS 如果没有执行以上代码,https访问时,证书就会报403错误 http:/

国密算法SM2证书制作

国密算法sm2非对称算法椭圆曲线 原文:http://www.jonllen.cn/jonllen/work/162.aspx 前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密算法DES(AES)和摘要MD5(SHA1)也相应改变,分别对应SM1.SM3算法,SM1算法基于硬件实现,SM2.SM3算法已公开. SM2签名验证算法 SM2签名同样也

java 解析国密SM2算法证书

首先说明用Java自带的解析x509证书类,是不能解析sm2算法的证书,运行会抛出异常. 用开源库bouncycastle可以解析.具体代码 private byte[] getCSPK(byte[] csCert) { InputStream inStream = new ByteArrayInputStream(csCert); ASN1Sequence seq = null; ASN1InputStream aIn; try { aIn = new ASN1InputStream(inSt

SM2证书的鉴定方法——续上文国密算法

上问说到了国家有自己的加密算法,那么本文就描述了如何鉴别SM2的证书算法是什么样的.. 国密局规定,SM2证书中签名算法OID为1.2.156.10197.1.501,公钥算法的OID为1.2.840.10045. 2.1.目前大部分的厂商都还不识别这两个算法,能识别的系统直接显示的是SM2算法. Windows鉴定 SM2证书在Windows系统上,可以通过查看证书属性中的签名算法和公钥算法来判断是否为SM2的证书.直接双击证书,安装到IE中,查看证书信息,XP系统2003 server以下的

谈谈PBOC3.0中使用的国密SM2算法

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用password算法.本身是基于ECC椭圆曲线算法的.所以要讲sm2, 先要弄懂ECC. 全然理解ECC算法须要一定的数学功底.由于涉及到射影平面坐标系,齐次方程求解, 曲线的运算规则等概念. 这里不做过多的数学分析(主要是我自己也没有全然整明确). 想要深入了解ECC的我推荐网

PBOC3.0中使用的国密SM2算法详解

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主知识产权的非对称商用密码算法.本身是基于ECC椭圆曲线算法的,所以要讲sm2, 先要弄懂ECC. 完全理解ECC算法需要一定的数学功底,因为涉及到射影平面坐标系,齐次方程求解, 曲线的运算规则等概念.这里不做过多的数学分析(主要是我自己也没有完全整明白).想要深入了解ECC的我推荐网名为ZMWorm

推荐一款能支持国密SM2的浏览器——密信浏览器

密信浏览器( MeSince Browser )是基于Chromium开源项目开发的国密安全浏览器,支持国密算法和国密SSL证书,同时也支持国际算法及全球信任SSL证书:密信浏览器使用界面清新,干净.简洁.无广告,提供简洁.快速的浏览体验,满足国密安全合规需求.目前,密信浏览器支持Windows 32位和64位系统,未来将逐步推出Linux.Mac及移动端版本. 密信浏览器的主要特性 1.兼容国密标准和国际标准密信浏览器遵循国家标准<GM/T 0024-2014: SSL ×××技术规范>,支

国密算法的ekey的使用--简述

一.龙脉GMTools的使用 1.产品介绍 mToken GM3000 国密身份认证锁是龙脉科技自主研发设计支持国密算法.完全遵照国家密码管理局颁布的<智能IC卡及智能密码钥匙密码应用接口规范>要求设计的USB Key,采用国产高性能智能卡芯片,内置SSF33.SM1.SM2.SM3.SM4等国产算法,支持高速数据国密算法加解密,提供CSP以及PKCS11和国密接口,完全符合国家密码管理局关于"密钥不落地"的技术规范要求,是电子政务.电子军务.CA厂商首选的USB Key产

国密算法的ekey基本使用的说明

概述 本次需要进行的实验研究是国密算法的ekey的使用.对于一个或者多个应用来说,每个应用可以包含一个或多个容器(Container),每个容器中可以存放两对分别用于加密和签名的密钥对,以及两个相应的证书或证书链.每一个容器只能为ECC或RSA一种类型,一个容器中不能混用ECC密钥和RSA密钥.根据个人的理解,ekey的作用就是生成容器,将需要加密的消息或文件利用相应的加密算法加密后,生成证书,将证书导入ekey的容器中.这样以便于在其他终端上用到该文件时,使用ekey,其容器中的对应的证书可以