国密算法sm2

《SM2密码算法使用规范》规定了数字证书SM2算法的公/私钥及加密签名格式。

1.SM2公钥格式用ASN.1描述如下:

SM2PublicKey::=BIT STRING

SM2公钥是SM2曲线上的一个点,由横、纵坐标两个分量来表示,记为(x,y),简记为Q,每个分量长度为256位。SM2PublicKey内容格式为:04‖X‖Y。其中,X和Y分别表示公钥的x分量和y分量,其长度各为256位。

2.SM2私钥格式用ASN描述如下:

SM2PrivateKey::=INTEGER

SM2私钥是一个大于或等于1且小于n-1的整数(n为SM2算法的阶),简记为k,长度为256位。

3.SM2加密数据格式用ASN1描述如下:

SM2Cipher::=SEQUENCE {

XCoordinate INTEGER,–x分量

YCoordinate INTEGER,–y分量

HASH  OCTET STRING SIZE(32),–摘要值

CigherText  OCTET STRING    –密文

假设使用SM2公钥Q(SM2PublicKey类型)对明文m(字符串类型)进行加密计算。则XCoordinate和YCoordinate为随机产生的公钥的x分量和y分量。HASH为使用SM3算法对明文数据运算得到的摘要值,其长度为256位,HASH=SM3(x‖m‖y),其中x和y为Q的x分量和y分量。CipherText是与明文等长的密文。

假设使用SM2私钥d(SM2Privatekey类型)对密文c(SM2Cipher类型)进行解密计算,则解密后将获得明文m,其长度等于密文(c→Cipher Text)的长度。

4.SM2签名数据格式用ASN描述如下:

SM2Signature::=SEQUENCE {

R  INTEGER,  –签名值的第一部分

S  INTEGER,  –签名值的第二部分

其中,R和S的长度各为256位。

假设使用签名方私钥d(SM2PrivateKey类型)对待签名数据M(字符串类型)进行签名计算。具体计算步骤如下:

①预处理1:使用签名方的用户身份标识ID(字符串类型)和签名方公钥Q(SM2PublicKey类型),通过运算得到Z值(字符串类型)。

Z=SM3(ENTL‖ID‖a‖b‖XG‖yG‖xA‖yA)

其中,ENTL为2字节表示的ID的比特长度。ID为用户身份标识,无特殊约定情况下,长度为16字节,默认值从左至右依次为:

0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38。a和b为系统曲线参数。xG和yG为基点,xA和yA为签名方公钥。

②预处理2:使用预处理1结果Z值(字符串类型)和待签名数据M(字符串类型),通过SM3运算得到摘要值H(字符串类型)。

H=SM3(Z‖M)

③签名:使用预处理2结果H(字符串类型)和签名方私钥d(SM2PrivateKey类型),通过签名计算得到签名结果sign(SM2Signature类型)。

签名验证时,使用预处理2结果H(字符串类型)、签名结果sign(SM2Signature类型)和签名方公钥Q(SM2PublicKey类型),通过验签计算确定签名结果是否通过验证。

在SM2密钥对传递时,需加密保护它。

5.SM2密钥对的保护数据格式用ASN.1描述如下:

SM2EnvelopedKey::=SEQUENCE {

symAlgID     Algorithmldentifier,  –对称密钥算法标识

symEncryptedKey  SM2Ciphe          –对称密钥密文

Sm2PublicKey      SM2PublicKey,    –SM2公钥

Sm2EncryptedPrivateKey BIT STRING  –SM2私钥密文

其中,具体的保护方法为:

①产生一个对称密钥。

②按对称密钥算法标识指定的算法加密SM2私钥,得到私钥密文。若对称算法为分组算法,则其运算模式为ECB。

③使用外部SM2公钥加密对称密钥得到对称密钥密文。

④把私钥密文、对称密钥密文封装到密钥对保护数据中。

标签: ,