| 标准编号 | GM/T 0009-2023 (GM/T0009-2023) | | 中文名称 | SM2密码算法使用规范 | | 英文名称 | SM2 cryptography algorithm application specification | | 行业 | Chinese Industry Standard (推荐) | | 中标分类 | L80 | | 字数估计 | 12,189 | | 发布日期 | 2023-12-04 | | 实施日期 | 2024-06-01 | | 发布机构 | 国家密码管理局 |
GM/T 0009-2023: SM2密码算法使用规范
ICS 35.030
CCSL80
中华人民共和国密码行业标准
代替GM/T 0009-2012
SM2密码算法使用规范
2023-12-04发布
2024-06-01实施
国家密码管理局 发 布
目次
前言 Ⅲ
1 范围 1
2 规范性引用文件 1
3 术语和定义 1
4 缩略语 1
5 SM2密钥对 1
6 数据转换 2
7 数据格式 3
8 预处理 4
9 计算过程 5
10 用户身份标识ID的默认值 7
前言
本文件按照GB/T 1.1-2020《标准化工作导则 第1部分:标准化文件的结构和起草规则》的规定
起草。
本文件代替GM/T 0009-2012《SM2密码算法使用规范》,与GM/T 0009-2012相比,除结构调
整和编辑性改动外,主要技术变化如下:
a) 更改了SM2私钥(见5.1,2012年版的5.1);
b) 更改了SM2公钥(见5.2,2012年版的5.2);
c) 更改了SM2公钥格式(见7.1,2012年版的7.1);
d) 更改了密钥对保护数据格式(见7.4,2012年版的7.4);
e) 更改了预处理1(见8.1,2012年版的8.1)。
请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别专利的责任。
本文件由密码行业标准化技术委员会提出并归口。
本文件起草单位:北京海泰方圆科技股份有限公司、北京信安世纪科技股份有限公司、北京小雷科
技有限公司、中电科网络安全科技股份有限公司、北京国脉信安科技有限公司、无锡江南信息安全工程
技术中心、兴唐通信科技有限公司、山东得安信息技术有限公司、格尔软件股份有限公司、山东大学。
本文件主要起草人:刘平、蒋红宇、柳增寿、曾宇波、袁峰、李元正、徐强、谭武征、孔凡玉、王妮娜、
汪宗斌、安晓江、罗俊、徐明翼、郑强、马洪富。
本文件及其所代替文件的历次版本发布情况为:
---2012年首次发布为GM/T 0009-2012;
---本次为第一次修订。
SM2密码算法使用规范
1 范围
本文件定义了SM2密码算法的使用方法,也定义了相关的数据格式。
本文件适用于SM2密码算法的使用,也适用于支持SM2密码算法的设备和系统的研发和检测。
2 规范性引用文件
下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日期的引用文
件,仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于
本文件。
GB/T 32905-2016 信息安全技术 SM3密码杂凑算法
GB/T 32918.1-2016 信息安全技术 SM2椭圆曲线公钥密码算法 第1部分:总则
GB/T 32918.2-2016 信息安全技术 SM2椭圆曲线公钥密码算法 第2部分:数字签名算法
GB/T 32918.3-2016 信息安全技术 SM2椭圆曲线公钥密码算法 第3部分:密钥交换协议
GB/T 32918.4-2016 信息安全技术 SM2椭圆曲线公钥密码算法 第4部分:共钥加密算法
GB/T 32918.5-2017 信息安全技术 SM2椭圆曲线公钥密码算法 第5部分:参数定义
GM/T 0006 密码应用标识规范
GM/Z4001 密码术语
3 术语和定义
GM/Z4001界定的术语和定义适用于本文件。
4 缩略语
下列缩略语适用于本文件。
ECB 电码本模式(ElectronicCodebook)
5 SM2密钥对
5.1 SM2私钥
SM2私钥是大于或等于1且小于n-1的整数(n 为SM2算法的阶,其值见 GB/T 32918.5-
2017),简记为d。
5.2 SM2公钥
SM2公钥是SM2曲线上的一个点,由横坐标和纵坐标两个分量来表示,记为(x,y),简记为Q。公
钥值由其对应的私钥 d与 G 进行点乘计算得到 (G 为 SM2 椭圆曲线的基点,G 的取值见
GB/T 32918.5-2017)。
6 数据转换
6.1 位串到8位字节串的转换
位串长度若不是8的整数倍,应先在它的左边补0,以保证它的长度为8的倍数,然后构造8位字
节串,转换过程如下:
输入:一个长度为blen的位串B。
输出:一个长度为mlen的字节串 M,其中mlen的取值为(blen+7)/8的整数部分。
动作:将位串B=B0B1Bblen-1转换到8位字节串 M=M0M1Mmlen-1采用如下方法:
从0≤i≤mlen-1,设置:Mi=Bblen-8-8(mlen-1-i)Bblen-7-8(mlen-1-i)Bblen-1-8(mlen-1-i)。
对于 M0,最左边8-blen%8位设置为0,右边设置为B0B1B7+blen-8mlen,其中%表示模运算。
输出 M。
6.2 8位字节串到位串的转换
8位字节串到位串转换过程如下:
输入:一个长度为mlen的8位字节串 M。
输出:一个长度为blen=(8*mlen)的位串B。
动作:将8位字节串 M=M0M1Mmlen-1转换到位串B=B0B1Bblen-1采用如下方法:
从0≤i≤mlen-1,设置:B8iB8i+1B8i+7=Mi。
输出B。
6.3 整数到8位字节串的转换
一个整数转换为8位字节串,基本方法是将其先使用二进制表达,然后把结果位串再转换为8位字
节串。以下是转换流程:
输入:一个非负整数x,期望的8位字节串长度mlen。基本限制为:28(mlen) >x。
输出:一个长度为mlen的8位字节串 M。
动作:将基于28=256的x值x=xmlen-128(mlen-1)+xmlen-228(mlen-2)++x128+x0 转换为一个8位
字节串 M=M0M1Mmlen-1采用如下方法:
从0≤i≤mlen-1,设置:Mi=xmlen-1-i。
输出 M。
6.4 8位字节串到整数的转换
可把8位字节串看成以256为基表示的整数,转换过程如下:
输入:一个长度mlen的8位字节串 M。
输出:一个整数x。
动作:将一个8位字节串 M=M0M1Mmlen-1转换为整数x方法如下:
将 Mi 看作[0~255]中的一个整数,则:x=∑
mlen-1
i=0
28(mlen-1-i)Mi。
输出x。
7 数据格式
7.1 密钥数据格式
SM2算法私钥数据格式的ASN.1定义为:
SM2PrivateKey::=INTEGER
SM2算法公钥数据格式的ASN.1定义为:
SM2PublicKey::=BITSTRING
位,分别为公钥的x分量和y分量。
04‖X‖Y为SM2算法公钥数据非压缩格式,02‖X和03‖X均为SM2算法公钥数据压缩格式。
当该公钥的y分量的最低位为0时,该公钥压缩格式为02‖X。当该公钥的y分量的最低位为1时,该
公钥压缩格式为03‖X。SM2公钥格式应符合GB/T 32918.1-2016中A.5的规定。
7.2 加密数据格式
SM2算法加密后的数据格式的ASN.1定义为:
SM2Cipher::=SEQUENCE{
xCoordinate INTEGER, --x分量
yCoordinate INTEGER, --y分量
hash OCTETSTRINGSIZE(32), --杂凑值
cipherText OCTETSTRING --密文
7.3 签名数据格式
SM2算法签名数据格式的ASN.1定义为:
SM2Signature::=SEQUENCE{
r INTEGER, --签名值的第1部分
s INTEGER --签名值的第2部分
7.4 密钥对保护数据格式
在SM2密钥对传递时,应对SM2密钥对进行加密保护。具体的保护方法如下。
a) 产生一个对称密钥。
b) 按对称密码算法标识指定的算法对SM2私钥明文进行加密,得到私钥的密文。私钥明文为高
字节在前的8位字节串,其长度固定为32字节,由私钥整数的二进制形式进行高比特补0至
256比特后转换得到。若对称算法为分组算法,则其运算模式为ECB。
c) 使用外部SM2公钥加密对称密钥得到对称密钥密文。
d) 将私钥密文、对称密钥密文封装到密钥对保护数据中。
SM2密钥对的保护数据格式的ASN.1定义为:
SM2EnvelopedKey::=SEQUENCE{
symAlgID AlgorithmIdentifier, --对称密码算法标识
symEncryptedKey SM2Cipher, --对称密钥密文
sm2PublicKey SM2PublicKey, --SM2公钥
其中对称密码算法标识为SGD_SM4_ECB,应符合GM/T 0006中的规定。
8 预处理
8.1 预处理1
预处理1是指使用签名方的用户身份标识和签名方公钥,通过运算得到Z值的过程。Z值用于预
处理2,也用于SM2密钥协商协议。
输入: ID 字节串 用户身份标识
Q SM2PublicKey 用户的公钥
输出: Z 字节串 预处理1的输出
计算公式为:
Z=SM3(L‖SID‖a‖b‖xG‖yG‖xA‖yA)
式中:
Z ---预处理1的输出;
L ---用户身份标识的长度(比特);
SID---用户身份标识;
a ---SM2椭圆曲线参数;
b ---SM2椭圆曲线参数;
xG ---基点的横坐标;
yG ---基点的纵坐标;
xA ---用户公钥的横坐标;
yA ---用户公钥的纵坐标。
L由其整数值的二进制形式进行高比特补0至16比特后转换得到。a、b、xG、yG、xA 和yA 分别由
其整数值的二进制形式进行高比特补0至256比特后转换得到。
详细的计算过程应符合GB/T 32918.2-2016中5.5和GB/T 32905-2016中第5章的规定。
8.2 预处理2
预处理2是指使用Z值和待签名消息,通过SM3运算得到杂凑值H的过程。杂凑值H用于SM2
数字签名。
输入: Z 字节串 预处理1的输出
M 字节串 待签名消息
输出: H 字节串 杂凑值
计算公式为:
H =SM3(Z‖M)
式中:
H---杂凑值;
Z ---预处理1的输出;
M ---带签名的消息。
详细的计算过程应符合GB/T 32905-2016中第5章的规定。
9 计算过程
9.1 生成密钥
SM2密钥生成是指生成SM2算法的密钥对的过程,该密钥对包括私钥和与之对应的公钥。其表
示方法见7.1。
输入: 无
输出: k SM2PrivateKey SM2私钥
Q SM2PublicKey SM2公钥
详细的计算过程应符合GB/T 32918.1-2016中第6章的规定。
9.2 加密
SM2加密是指使用指定公开密钥对明文进行特定的加密计算,生成相应密文的过程。该密文只能
由该指定公开密钥对应的私钥解密。
输入: Q SM2PublicKey SM2公钥
m 字节串 待加密的明文数据
输出: c SM2Cipher 密文
其中:
输出参数c的格式应符合7.2中定义;
输出参数c的xCoordinate、yCoordinate为随机产生的公钥的x分量和y分量;
输出参数c中的HASH的计算公式为:
HASH =SM3(Qx‖m‖Qy)
其中,Qx、Qy分别为Q的x分量和y分量的长度为32字节的8位字节串表示;
输出参数c中cipherText为加密密文,其长度等于明文的长度。
详细的计算过程应符合GB/T 32918.4-2016中第6章的规定。
9.3 解密
SM2解密是指使用指定私钥对密文进行解密计算,还原对应明文的过程。
输入: d SM2PrivateKey SM2私钥
c SM2Cipher 密文
输出: m 字节串 与密文对应的明文
m为SM2Cipher经过解密运算得到的明文,该明文的长度与输入参数c中CipherText的长度
相同。
详细的计算过程应符合GB/T 32918.4-2016中第7章的规定。
9.4 数字签名
SM2签名是指使用预处理2的结果和签名者私钥,通过签名计算得到签名结果的过程。
输入: d SM2PrivateKey 签名者私钥
H 字节串 预处理2的结果
输出: sign SM2Signature 签名值
详细的计算过程应符合 GB/T 32918.2-2016中第6章的规定。
9.5 签名验证
SM2签名验证是指使用预处理2的结果、签名值和签名者的公钥,通过验签计算确定签名是否通
过验证的过程。
输入: H 字节串 预处理2的结果
sign SM2Signature 签名值
Q PublicKey 签名者的公钥
输出: 为“真”表示“验证通过”,为“假”表示“验证不通过”。
详细的计算过程应符合GB/T 32918.2-2016中第7章的规定。
9.6 密钥协商
密钥协商是在两个用户之间建立一个共享秘密密钥的协商过程,通过这种方式能够确定一个共享
秘密密钥的值。
设密钥协商双方为A、B,其密钥对分别为(dA,QA)和(dB,QB),双方应获得的密钥数据的比特长
度为klen。密钥协商协议分为两个阶段。
第一阶段:产生临时密钥对
用户A:
调用生成密钥算法产生临时密钥对(rA,RA),将RA 和用户A的用户身份标识IDA 发送给用户B。
用户B:
调用生成密钥算法产生临时密钥对(rB,RB),将RB和用户B的用户身份标识IDB发送给用户A。
第二阶段:计算共享秘密密钥
用户A:
输入参数:
QA SM2PublicKey 用户A的公钥
QB SM2PublicKey 用户B的公钥
RA SM2PublicKey 用户A的临时公钥
IDA OCTETSTRING 用户A的用户身份标识
RB SM2PublicKey 用户B的临时公钥
IDB OCTETSTRING 用户B的用户身份标识
dA SM2PrivateKey 用户A的私钥
rA SM2PrivateKey 用户A的临时私钥
klen INTEGER 需要输出的密钥数据的比特长度(比特)
输出参数:
K OCTETSTRING 位长为klen的密钥数据
步骤:
a) 用IDA 和QA 作为输入参数,调用预处理1得到ZA;
b) 用IDB 和QB 作为输入参数,调用预处理1得到ZB;
c) 以klen、ZA、ZB、dA、rA、RA、QB、RB 为输入参数,进行......
|