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,需要补00,022100
b. C1X的第一字节小于0x80,不需要补00,0220
5)、55C2A653340726F4F3E1A886E9BA8B538D0EC780506921F8FEA573266D782F09:C1X
6)、022100,02表示类型,21表示长度,后面是00+C1Y(32)
a. C1Y的第一字节大于等于0x80,需要补00,022100
b. C1Y的第一字节小于0x80,不需要补00,0220
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(最短,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
-
编码格式3(最长,72个字节):30 48 + 02 21 00 + R + 02 21 00 + S
-
第二字节表示的是整个签名数据的长度
-
R第一个字节大于或等于128(0x80)时,需要补位00。同理,S第一个字节大于或等于128(0x80)时,需要补位00。
-
如果R或S的数据存在前导0时,在实际编码过码中,会删掉前导00的长度。
2、不编码
直接返回R+S