信息安全技术SM2密码算法使用规范(GB-T 35276-2017).pdf
ICS35.40L 80GB/T XXXX-XXXX信息安全技术 SM2 密码算法使用规范SM2 cryptography algorithm usage specification(报批稿)本稿完成日期:2016 年 12 月XXXX-XX-XX 发布XXXX-XX-XX 实施中中 华华 人人 民民 共共 和和 国国 国国 家家 标标 准准201删除杨辰:GB/T XXXX-XXXXI目次前言.II引言.III1 范围.12 规范性引用文件.13 术语和定义.14 符号和缩略语.15 SM2 的密钥对.15.1 SM2 私钥.15.2 SM2 公钥.16 数据转换.26.1 位串到 8 位字节串的转换.26.2 8 位字节串到位串的转换.26.3 整数到 8 位字节串的转换.26.4 8 位字节串到整数的转换.27 数据格式.37.1 密钥数据格式.37.2 加密数据格式.37.3 签名数据格式.37.4 密钥对保护数据格式.38 预处理.48.1 预处理 1.48.2 预处理 2.49 计算过程.49.1 生成密钥.49.2 加密.49.3 解密.59.4 数字签名.59.5 签名验证.59.6 密钥协商.510 用户身份标识 ID 的默认值.6GB/T XXXX-XXXXII前言本标准依据 GB/T1.1-2009 给出的规则起草。请注意本标准的某些内容可能涉及专利,本标准的发布机构不承担识别这些专利的责任。本标准由国家密码管理局提出。本标准由全国信息安全标准计算委员会(SAC/TC260)提出并归口。本标准起草单位:北京海泰方圆科技股份有限公司、卫士通信息产业股份有限公司、无锡江南信息安全工程技术中心、兴唐通信科技股份有限公司、山东得安信息技术有限公司、上海格尔软件股份有限公司。本标准主要起草人:刘平、蒋红宇、柳增寿、李元正、徐强、谭武征、孔凡玉、王妮娜。GB/T XXXX-XXXXIII引言SM2 椭圆曲线密码算法(以下简称 SM2)是由 GB/T 3291832918 给出的一组非对称算法,其中包括 SM2-1 椭圆曲线数字签名算法、SM2-2 椭圆曲线密钥协商协议,SM2-3 椭圆曲线加密算法。本标准的目标是保证 SM2 使用的正确性,为 SM2 密码算法的使用制定统一的数据格式和使用方法。本标准中涉及的 SM3 算法是指 GB/T 3290532905 给出的一种密码杂凑算法。本标准仅从算法应用的角度给出 SM2 密码算法的使用说明,不涉及 SM2 密码算法的具体编制细节。AAAA删除杨辰:BBBB删除杨辰:GB/T XXXX-XXXX1SM2 密码算法使用规范1范围本标准定义了 SM2 密码算法的使用方法,以及密钥、加密与签名等的数据格式。本标准适用于 SM2 密码算法的使用,以及支持 SM2 密码算法的设备和系统的研发和检测。2规范性引用文件下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。3291832905GB/T 32905-2016信息安全技术 SM3 密码杂凑算法GB/T 32918-2016信息安全技术 SM2 椭圆曲线公钥密码算法3术语和定义下列术语和定义适用于本文件。3.1算法标识 algorithm identifier用于标明算法机制的数字化信息。3.2SM2 密码算法 SM2 algorithm3.3由 GB/T 32918-2016 信息安全技术 SM2 椭圆曲线公钥密码算法定义的一种算法。SM3 算法 SM3 algorithm4由 GB/T 32905-2016信息安全技术 SM3 密码杂凑算法定义的一种算法。符号和缩略语下列缩略语适用于本文件。ECB电码本模式(Electronics Code Book)ECC椭圆曲线密码算法(Elliptic Curve Cryptography)5SM2 的密钥对5.1SM2 私钥SM2 私钥是大于 1 且小于 n-1 的整数(n 为 SM2 算法的阶,其值参见 GB/T 3291832918),简记为 k,长度为 256 位。5.2SM2 公钥SM2 公钥是 SM2 曲线上的一个点,由横坐标和纵坐标两个分量来表示,记为(x,y),简记为 Q,每个分量的长度为 256 位。GB/TAAAA删除杨辰:SM2 椭圆曲线公钥密码算法GB/TBBBB删除杨辰:SM3 密码杂凑算法删除杨辰:一种椭圆曲线密码算法,由 GB/T AAAA 全文进行规范。删除杨辰:字体:(默认)宋体设置格式杨辰:一种杂凑算法,由 GB/T BBBB 全文进行规范。删除杨辰:AAAA删除杨辰:GB/T XXXX-XXXX26数据转换6.1位串到 8 位字节串的转换位串长度若不是 8 的整数倍,需先在它的左边补 0,以保证它的长度为 8 的倍数,然后构造 8位字节串,转换过程如下:输入:一个长度为 blen 的位串 B。输出:一个长度为 mlen 的字节串 M,其中 mlen 的取值为(blen+7)/8 的整数部分。动作:将位串110 blenBBBB转换到 8 位字节串110 mlenMMMM采用如下方法:从10mleni,设置:)1(81)1(87)1(88imlenblenimlenblenimlenbleniBBBM 对于0M,最左边 8-blen%8 位设置为 0,右边设置为1)(8810 blenlenBBB。输出 M。6.28 位字节串到位串的转换8 位字节串到位串转换过程如下:输入:一个长度为 mlen 的 8 位字节串 M。输出:一个长度为 blen=(8*mlen)的位串 B。动作:将 8 位字节串110 mlenMMMM转换到位串110 blenBBBB采用如下方法:从10mleni,设置:iiiiMBBB 78188输出 B。6.3整数到 8 位字节串的转换一个整数转换为 8 位字节串,基本方法是将其先使用二进制表达,然后把结果位串再转换为 8位字节串。以下是转换流程:输入:一个非负整数 x,期望的 8 位字节串长度 mlen。基本限制为:xmlen)(82输出:一个长度为 mlen 的 8 位字节串 M。动作:将基于25628的 x 值081)2(82)1(81222xxxxxmlenmlenmlenmlen 转换为一个8 位字节串110 mlenMMMM采用如下方法:从10mleni,设置:imlenixM1输出 M。6.48 位字节串到整数的转换可以简单地把 8 位字节串看成以 256 为基表示的整数,转换过程如下:输入:一个长度 mlen 的 8 位字节串 M。输出:一个整数 x。GB/T XXXX-XXXX3动作:将一个 8 位字节串110 mlenMMMM转换为整数 x 方法如下:将iM看作0255中的一个整数10)1(82mleniiimlenMx输出 x。7数据格式7.1密钥数据格式SM2 算法私钥数据格式的 ASN.1 定义为:SM2PrivateKey:=INTEGERSM2 算法公钥数据格式的 ASN.1 定义为:SM2PublicKey:=BIT STRINGSM2PublicKey 为 BIT STRING 类型,内容为 04XY,其中,X 和 Y 分别标识公钥的 x 分量和 y分量,其长度各为 256 位。7.2加密数据格式SM2 算法加密后的数据格式的 ASN.1 定义为:SM2Cipher:=SEQENCEXCoordinateINTEGER,-x 分量YCoordinateINTEGER,-y 分量HASHOCTET STRING SIZE(32),-杂凑值CipherTextOCTET STRING-密文其中,HASH 为使用 SM3 算法对明文数据运算得到的杂凑值,其长度固定为 256 位。CipherText是与明文对应的密文。7.3签名数据格式SM2 算法签名数据格式的 ASN.1 定义为:SM2Signature:=SEQUENCERINTEGER,-签名值的第一部分SINTEGER-签名值的第二部分7.4密钥对保护数据格式在 SM2 密钥对传递时,需要对 SM2 密钥对进行加密保护。具体的保护方法为:a)产生一个对称密钥;b)按对称密码算法标识指定的算法对 SM2 私钥进行加密,得到私钥的密文。若对称算法为分组算法,则其运算模式为 ECB;c)使用外部 SM2 公钥加密对称密钥得到对称密钥密文;d)将私钥密文、对称密钥密文封装到密钥对保护数据中。SM2 密钥对的保护数据格式的 ASN.1 定义为:GB/T XXXX-XXXX4SM2EnvelopedKey:=SEQUENCEsymAlgIDAlgorithmIdentifier,-对称密码算法标识symEncryptedKeySM2Cipher,-对称密钥密文Sm2PublicKeySM2PublicKey,-SM2 公钥Sm2EncryptedPrivateKeyBIT STRING-SM2 私钥密文8预处理8.1预处理 1预处理 1 是指使用签名方的用户身份标识和签名方公钥,通过运算得到 Z 值的过程。Z 值用于预处理 2,也用于 SM2 密钥协商协议。输入:ID字节串用户身份标识QSM2PublicKey用户的公钥输出:Z字节串预处理 1 的输出计算公式为:Z=SM3(ENTLIDabxGyGxAyA)其中:ENTL为由 2 个字节表示的 ID 的比特长度;ID为用户身份标识;a、b为系统曲线参数;xG、yG为基点;xA、yA为用户的公钥。详细的计算过程参见 GB/T 3291832918 和 GB/T 32905。8.2预处理 2预处理 2 是指使用 Z 值和待签名消息,通过 SM3 运算得到杂凑值 H 的过程。杂凑值 H 用于 SM2数字签名。输入:Z字节串预处理 2 的输入M字节串待签名消息输出:H字节串杂凑值计算公式为:H=SM3(ZM)详细的计算过程参见 GB/T 32918 和 GB/T 32905。9计算过程9.1生成密钥SM2 密钥生成是指生成 SM2 算法的密钥对的过程,该密钥对包括私钥和与之对应的公钥。输入:无输出:kSM2PrivateKeySM2 私钥QSM2PublicKeySM2 公钥详细的计算过程参见 GB/T 32918。9.2加密AAAA删除杨辰:BBBB删除杨辰:AAAA删除杨辰:BBBB删除杨辰:AAAA删除杨辰:GB/T XXXX-XXXX5SM2 加密是指使用指定公开密钥对明文进行特定的加密计算,生成相应密文的过程。该密文只能由该指定公开密钥对应的私钥解密。输入:QSM2PublicKeySM2 公钥m字节串待加密的明文数据输出:cSM2Cipher密文其中:输出参数 c 的格式由本规范 7.2 中定义;输出参数 c 的 XCoordinate、YCoordinate 为随机产生的公钥的 x 分量和 y 分量;输出参数 c 中的 HASH 的计算公式为:HASH=SM3(xmy)其中,x,y 为 Q 的 x 分量和 y 分量;输出参数 c 中 CipherText 为加密密文,其长度等于明文的长度。详细的计算过程参见 GB/T 32918 和 GB/T 32905。9.3解密SM2 解密是指使用指定私钥对密文进行解密计算,还原对应明文的过程。输入:dSM2PrivateKeySM2 私钥cSM2Cipher密文输出:m字节串与密文对应的明文m 为 SM2Cipher 经过解密运算得到的明文,该明文的长度与输入参数 c 中 CipherText 的长度相同。详细的计算过程参见 GB/T 32918。9.4数字签名SM2 签名是指使用预处理 2 的结果和签名者私钥,通过签名计算得到签名结果的过程。输入:dSM2PrivateKey签名者私钥H字节串预处理 2 的结果输出:signSM2Signature签名值详细的计算过程参见 GB/T 32918。9.5签名验证SM2 签名验证是指使用预处理 2 的结果、签名值和签名者的公钥,通过验签计算确定签名是否通过验证的过程。输入:H字节串预处理 2 的结果signSM2Signature签名值QPublicKey签名者的公钥输出:为“真”表示“验证通过”,为“假”表示“验证不通过”。详细的计算过程参见 GB/T 32918。9.6密钥协商密钥协商是在两个用户之间建立一个共享秘密密钥的协商过程,通过这种方式能够确定一个共享秘密密钥的值。设密钥协商双方为 A、B,双方的密钥对分别为(dA,QA)和(dB,QB),双方需要获得的密钥数据的比特长度为 klen。密钥协商协议分为两个阶段。第一阶段:产生临时密钥对用户 A:AAAA删除杨辰:BBBB删除杨辰:AAAA删除杨辰:AAAA删除杨辰:AAAA删除杨辰:GB/T XXXX-XXXX6调用生成密钥算法产生临时密钥对(rA,RA),将 RA和用户 A 的用户身份标识 IDA发送给用户B。用户 B:调用生成密钥算法产生临时密钥对(rB,RB),将 RB和用户 B 的用户身份标识 IDB发送给用户A。第二阶段:计算共享秘密密钥用户 A:输入参数:QASM2PublicKey用户 A 的公钥QBSM2PublicKey用户 B 的公钥RASM2PublicKey用户 A 的临时公钥IDAOCTET STRING用户 A 的用户身份标识RBSM2PublicKey用户 B 的临时公钥IDBOCTET STRING用户 B 的用户身份标识dASM2PrivateKey用户 A 的私钥rASM2PrivateKey用户 A 的临时私钥klenINTEGER需要输出的密钥数据的比特长度输出参数:KOCTET STRING位长为 klen 的密钥数据步骤:a)用 IDA和 QA作为输入参数,调用预处理 1 得到 ZA;b)用 IDB和 QB作为输入参数,调用预处理 1 得到 ZB;c)以 klen、ZA、ZB、dA、rA、RA、QB、RB为输入参数,进行运算得到 K。用户 B:输入参数:QBSM2PublicKey用户 B 的公钥QASM2PublicKey用户 A 的公钥RBSM2PublicKey用户 B 的临时公钥IDBOCTET STRING用户 B 的用户身份标识RASM2PublicKey用户 A 的临时公钥IDAOCTET STRING用户 A 的用户身份标识dBSM2PrivateKey用户 B 的私钥rBSM2PrivateKey用户 B 的临时私钥klenINTEGER需要输出的密钥数据的比特长度输出参数:KOCTET STRING位长为 klen 的密钥数据步骤:a)用 IDA和 QA作为输入参数,调用预处理 1 得到 ZA;b)用 IDB和 QB作为输入参数,调用预处理 1 得到 ZB;c)以 klen、ZA、ZB、dB、rB、RB、QA、RA为输入参数,进行运算得到 K。详细的计算过程参见 GB/T 32918 和 GB/T 32905。10用户身份标识 ID 的默认值无特殊约定的情况下,用户身份标识 ID 的长度为 16 字节,其默认值从左至右依次为:0 x31,0 x32,0 x33,0 x34,0 x35,0 x36,0 x37,0 x38,0 x31,0 x32,0 x33,0 x34,0 x35,0 x36,0 x37,0 x38。AAAA删除杨辰:BBBB删除杨辰:GB/T XXXX-XXXX7_