国密SM2密钥、密文、签名说明笔记

1,397 阅读6分钟

SM2密钥

密钥分公钥和私钥,私钥32位,公钥由X和Y组成,X/Y各32位,所以公钥是64位。密钥可以压缩。

1. 正常的密钥是非压缩密钥,由04开头,密钥组成是:04+X+Y;共65位(04可忽略)。

(1) 04A4B8013BDFA0A8883325F170EF2CEF4CF3453A3BB107B74CC3B777178D79E7B82871AAAE88DD2EDAE2739C1D5C7D57FFF536BBA6DE4399AF1B803EEE16A21983

2. 压缩密钥:02或03开头,组成是:03/02+X+Y,02/03取决于Y。(GM/T 0009)

(1) 02 || X:新版本新增的压缩点形式,当公钥y分量的最低位为0时;

(2) 03 || X:新版本新增的压缩点形式,当公钥y分量的最低位为1时。

 

加密密文

密文由C1、C2、C3三部分组成。C1是X+Y,共64位,C3是hash值,32位;C2是密文,长度跟明文长度一样。

1. C1=是 [k]G—基点的k倍点(X1,Y1)按照规定转换的字符串 ,用于校验公私钥是否匹配64位;

2. C2=裸密文,长度=明文长度;

3. C3=杂凑值hash,32位;

 

密文格式

GM/T0003.4 规定的标准密文格式是C1 || C3 || C2。

1、非编码

(1) 压缩

① C1(03+X)+ C3 + C2 1+32+32+明文长度

② C1(02+X)+ C3 + C2 1+32+32+明文长度

(2) 非压缩

① 04 +C1 + C3 + C2 1+64+32+明文长度

2、 编码ASN.1.DER

此时的SEQUENCE标识符是0x30,所以SM2 ASN.1 DER密文一定以30开头。

DER长编码和短编码

长编码

长度大于127,多字节编码,第二字节最高位为1,bit7-bit1表示内容的长度占用多少字节,比如bit7-bit1 = 2,表示后续两个字节为长度。

短编码

长度小于等于127,第二字节最高位固定为0,bit7-bit1为实际长度

示例

3081AA022055C2A653340726F4F3E1A886E9BA8B538D0EC780506921F8FEA573266D782F09022100B4FD237EA3DBAFC06F946598C22447178429FF8DCF6239E8B1AB04F72FB2318E042056B7E5EDAE6C57028A7D62D27A14963B1042763E7AF3685E0DA904F23795840404418C24E8E516F4AAC60698CA118AB107179B8F6ED31052D300645E6B3E186A4A68BE6AB0CAE52057735941716DCF44CF7140DE19D272ACEA1134C9E3859FA117E0B1

1)、30开头标志位

2)、81是10000001,表示长编码,后边一个字节是内容长度

3)、AA是170,表示后续的内容长度是170

4)、0220,02表示类型,20表示长度,后面可能会有补位00,后面是C1X

a. C1X的第一字节大于等于0x80,需要补00022100

b. C1X的第一字节小于0x80,不需要补000220

5)、55C2A653340726F4F3E1A886E9BA8B538D0EC780506921F8FEA573266D782F09:C1X

6)、022100,02表示类型,21表示长度,后面是00+C1Y(32)

a. C1Y的第一字节大于等于0x80,需要补00022100
b. C1Y的第一字节小于0x80,不需要补000220

7)、B4FD237EA3DBAFC06F946598C22447178429FF8DCF6239E8B1AB04F72FB2318E:C1Y

8)、0420,04代表类型, 20代表Hash数据长度,后面内容是HASH

9)、56B7E5EDAE6C57028A7D62D27A14963B1042763E7AF3685E0DA904F237958404,hash

10)、 0441,04代表类型, 41代表密文数据长度(65个字节),后面为密文

11)、8C24E8E516F4AAC60698CA118AB107179B8F6ED31052D300645E6B3E186A4A68BE6AB0CAE52057735941716DCF44CF7140DE19D272ACEA1134C9E3859FA117E0B1,密文

 

签名格式

签名数据格式为R+S

1、ASN.1 DER,补码格式同加密密文

  1. 编码格式1(最短,70个字节): 30 46 + 02 20 + R + 02 20 + S

2. 编码格式2(中,71个字节): 30 47 + 02 21 00 + R + 02 20 + S  或者   30 47 + 02 20 + R + 02 21 00 + S

  1. 编码格式3(最长,72个字节):30 48 + 02 21 00 + R + 02 21 00 + S  

  2. 第二字节表示的是整个签名数据的长度

  3. R第一个字节大于或等于128(0x80)时,需要补位00。同理,S第一个字节大于或等于128(0x80)时,需要补位00。

  4. 如果R或S的数据存在前导0时,在实际编码过码中,会删掉前导00的长度。

 

2、不编码

直接返回R+S