信息安全技术
SM2密码算法使用规范
GB/T 35276-2017
引言
SM2椭圆曲线公钥密码算法(以下简称SM2)是电GB/T32918给出的一组非对称算法,其中包括SM2-1椭圆曲线数字签名算法、SM2-2椭圆曲线密钥协商协议、SM2-3椭圆曲线加密算法。
本标准的目标是保证SM2使用的正确性,为SM2密码算法的使用制定统一的数据格式和使用方法。
本标准中涉及的SM3算法是指GB/T32905给出的一种密码杂凑算法。
本标准仅从算法应用的角度给出SM2密码算法的使用说明,不涉及SM2密码算法的具体编制细节。
本标准规定了SM2密码算法的使用方法,以及密钥、加密与签名等的数据格式。
本标准适用于SM2密码算法的使用,以及支持SM2密码算法的设备和系统的研发和检测。
二、下列文件对于本文件的应用是必不可少的。凡是注目期的引用文件,仅注目期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。
下列术语和定义适用于本文件。
算法标识 algorithmidentifier
用于标明算法机制的数字化信息。
SM2密码算法 SM2cryptographicalgorithm
由GB/T32918(所有部分)定义的一种算法。
SM3密码算法 SM3cryptographic algorithm
由GB/T32905-2016定义的一种算法。
下列缩略语适用于本文件。
SM2私钥是大于1且小于n-1的整数(n为SM2算法的阶,其值见GB/T32918.5-2017的第2章),简记为k,长度为256位。
SM2公钥是SM2曲线上的一个点,由横坐标和纵坐标两个分量来表示,记为(x,y),简记为Q,每个分量的长度为256位。
位串长度若不是8的整数倍,需先在它的左边补0,以保证它的长度为8的倍数,然后构造8位字节串,转换过程如下:
8位字节串到位串转换过程如下:
mlen
的8位字节串M。blen = (8 * mlen)
的位串B。一个整数转换为8位字节串,基本方法是将其先使用二进制表达,然后把结果位串再转换为8位字节串。以下是转换流程:
mlen
。基本限制为:mlen
的8位字节串M。可以简单地把8位字节串看成以256为基表示的整数,转换过程如下:
mlen
的8位字节串M。输出X 。
SM2算法私钥数据格式的ASN.1定义为:
SM2PrivateKey :: = INTEGER
SM2算法公钥数据格式的ASN.1定义为:
SM2PublicKey :: = BIT STRING
SM2PublicKey为BITSTRING类型,内容为04 || X || Y
,其中,X
和Y
分别标识公钥的x分量和y分量,其长度各为256位。
SM2算法加密后的数据格式的ASN.1定义为:
SM2Cipher :: = SEQUENCE {
XCoordinate INTEGER, -- x分量
YCoordinate INTEGER, -- y分量
HASH OCTET STRING SIZE(32), -- 杂凑值
CipherText OCTET STRING -- 密文
}
其中,HASH为使用SM3算法对明文数据运算得到的杂凑值,其长度固定为256位。CipherText是与明文对应的密文。
SM2算法签名数据格式的ASN.1定义为:
SM2Signature :: = SEQUENCE {
R INTEGER, -- 签名值的第一部分
S INTEGER -- 签名值的第二部分
}
在SM2密钥对传递时,需要对SM2密钥对进行加密保护。具体的保护方法为:
SM2密钥对的保护数据格式的ASN.1定义为:
SM2EnvelopedKey :: = SEQUENCE {
symAlgID Algorithmldentifie , --对称密码算法标识
symEncryptedKey SM2Cipher, --对称密钥密文
Sm2PublicKey SM2PublicKey, --SM2公钥
Sm2EncryptedPrivateKey BIT STRING --SM2私钥密文
}
预处理1是指使用签名方的用户身份标识和签名方公钥,通过运算得到Z值的过程。Z值用于预处理2,也用于SM2密钥协商协议。
ID
字节串:用户身份标识Q
SM2PublicKey:用户的公钥Z
字节串:预处理1的输出计算公式为:
其中:
ENTL
为由2个字节表示的ID的比特长度;x00 x80ID
为用户身份标识;十进制 1234567812345678 二进制 x31 x32 x33 x34 x35 x36 x37 x38 x31 x32 x33 x34 x35 x36 x37 x38a
、b
为系统曲线参数;SM2使用素数域256位圆曲线
椭圆曲线方程: y 2 =x3+ax+b
曲线参数:
p=fffffffeffffffffffffffffffffffffffffffff00000000ffffffffffffffff
a=fffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc
b=28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e93
n=fffffffeffffffffffffffffffffffff7203df6b21c6052b53bbf40939d54123
xG=32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7
yG=bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0
详细的计算过程见GB/T32918.2-2016的5.5和GB/T32905-2016的第5章。
预处理2是指使用Z值和待签名消息,通过SM3运算得到杂凑值H的过程。杂凑值H用于SM2数字签名。
Z
字节串:预处理2的输入M
字节串:待签名消息H
字节串:杂凑值计算公式为:
详细的计算过程见GB/T32918.2-2016的6.1和GB/T32905-2016的第5章。
SM2密钥生成是指生成SM2算法的密钥对的过程,该密钥对包括私钥和与之对应的公钥。
k
SM2PrivateKey:SM2私钥Q
SM2PublicKey:SM2公钥详细的计算过程见GB/T32918.1-2016的6.1。
SM2加密是指使用指定公开密钥对明文进行特定的加密计算,生成相应密文的过程。该密文只能由该指定公开密钥对应的私钥解密。
Q
SM2PublicKey:SM2公钥m
字节串:待加密的明文数据c
SM2Cipher:密文其中:
c
的格式由本规范7.2中定义;c
的XCoordinate
、YCoordinate
为随机产生的公钥的x分量和y分量。c
中的HASH
的计算公式为:x, y
—— Q
的x分量和y分量;c
中CipherText
为加密密文,其长度等于明文的长度。详细的计算过程见GB/T32918.4-2016的6.1。
SM2解密是指使用指定私钥对密文进行解密计算,还原对应明文的过程。
d
SM2PrivateKey:SM2私钥C
SM2Cipher:密文m
字节串:与密文对应的明文m
为SM2Cipher经过解密运算得到的明文,该明文的长度与输入参数c
中CipherText
的长度相同。
详细的计算过程见GB/T32918.4-2016的7.1。
SM2签名是指使用预处理2的结果和签名者私钥,通过签名计算得到签名结果的过程。
d
SM2PrivateKey:签名者私钥H
字节串:预处理2的结果sign
SM2Signature:签名值详细的计算过程见GB/T32918.2-2016的6.1。
SM2签名验证是指使用预处理2的结果、签名值和签名者的公钥,通过验签计算确定签名是否通过验证的过程。
H
字节串:预处理2的结果sign
SM2Signature:签名值Q
PublicKey:签名者的公钥详细的计算过程见GB/T32918.2-2016的7.1。
密钥协商是在两个用户之间建立一个共享秘密密钥的协商过程,通过这种方式能够确定一个共享秘密密钥的值。
设密钥协商双方为A、B,双方的密钥对分别为(dA,QA)和(dB,QB),双方需要获得的密钥数据的比特长度为klen。密钥协商协议分为两个阶段。
klen
INTEGER:需要输出的密钥数据的比特长度K
OCTET STRING:位长为klen的密钥数据输入参数:
klen
INTEGER:需要输出的密钥数据的比特长度输出参数:
K
OCTET STRING:位长为klen的密钥数据。
步骤:
a) 用 IDA 和 QA 作为输入参数,调用预处理1得到 ZA ;
b) 用 IDB 和 QB 作为输入参数,调用预处理1得到 ZB ;
c) 以 klen
、 ZA 、 ZB 、 dA 、 rA 、 RA 、 QB、 RB 为输入参数,进行运算得到 K
。
详细的计算过程见GB/T32918.3-2016的6.1。
无特殊约定的情况下,用户身份标识ID的长度为16字节,其默认值从左至右依次为:0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38
椭圆曲线方程: y 2 =x3+ax+b
曲线参数:
素数p=fffffffe ffffffff ffffffff ffffffff ffffffff 00000000 ffffffff ffffffff
系数a=fffffffe ffffffff ffffffff ffffffff ffffffff 00000000 ffffffff fffffffc
系数b=28e9fa9e 9d9f5e34 4d5a9e4b cf6509a7 f39789f5 15ab8f92 ddbcbd41 4d940e93
阶n=fffffffeffffffffffffffffffffffff7203df6b21c6052b53bbf40939d54123
坐标xG=32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7
坐标yG=bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0