| 标准编号 | GB/T 32918.1-2016 (GB/T32918.1-2016) | | 中文名称 | 信息安全技术 SM2椭圆曲线公钥密码算法 第1部分:总则 | | 英文名称 | Information security technology - Public key cryptographic algorithm SM2 based on elliptic curves - Part 1: General | | 行业 | 国家标准 (推荐) | | 中标分类 | L80 | | 字数估计 | 46,430 | | 发布日期 | 2016-08-29 | | 实施日期 | 2017-03-01 | | 标准依据 | National Standard Announcement 2016 No.14 | | 发布机构 | 中华人民共和国国家质量监督检验检疫总局、中国国家标准化管理委员会 | | 范围 | GB/T 32918的本部分规定了SM2椭圆曲线公钥密码算法涉及的必要数学基础知识与相关密码技术,以帮助实现其他各部分所规定的密码机制。本部分适用于基域为素域和二元扩域的椭圆曲线公钥密码算法的设计、开发、使用。 |
GB/T 32918.1-2016
Information security technology--Public key cryptographic algorithm SM2 based on elliptic curves--Part 1: General
ICS 35.040
L80
中华人民共和国国家标准
信息安全技术
SM2椭圆曲线公钥密码算法
第1部分:总则
2016-08-29发布
2017-03-01实施
中华人民共和国国家质量监督检验检疫总局
中国国家标准化管理委员会发布
目次
前言 Ⅰ
引言 Ⅱ
1 范围 1
2 符号和缩略语 1
3 域和椭圆曲线 2
3.1 有限域 2
3.2 有限域上的椭圆曲线 3
4 数据类型及其转换 5
4.1 数据类型 5
4.2 数据类型转换 5
5 椭圆曲线系统参数及其验证 8
5.1 一般要求 8
5.2 Fp 上椭圆曲线系统参数及其验证 8
5.3 F2m上椭圆曲线系统参数及其验证 9
6 密钥对的生成与公钥的验证 9
6.1 密钥对的生成 9
6.2 公钥的验证 10
附录A(资料性附录) 关于椭圆曲线的背景知识 11
A.1 素域Fp 11
A.2 二元扩域F2m 13
A.3 椭圆曲线多倍点运算 23
A.4 求解椭圆曲线离散对数问题的方法 26
A.5 椭圆曲线上点的压缩 27
附录B(资料性附录) 数论算法 29
B.1 有限域和模运算 29
B.2 有限域上的多项式 33
B.3 椭圆曲线算法 35
附录C(资料性附录) 曲线示例 37
C.1 一般要求 37
C.2 Fp 上椭圆曲线 37
C.3 F2m上椭圆曲线 37
附录D(资料性附录) 椭圆曲线方程参数的拟随机生成及验证 39
D.1 椭圆曲线方程参数的拟随机生成 39
D.2 椭圆曲线方程参数的验证 40
参考文献 41
前言
GB/T 32918《信息安全技术 SM2椭圆曲线公钥密码算法》分为以下5个部分:
---第1部分:总则;
---第2部分:数字签名算法;
---第3部分:密钥交换协议;
---第4部分:公钥加密算法;
---第5部分:参数定义。
本部分为GB/T 32918的第1部分。
本部分按照GB/T 1.1-2009给出的规则起草。
本部分由国家密码管理局提出。
本部分由全国信息安全标准化技术委员会(SAC/TC260)归口。
本部分起草单位:北京华大信安科技有限公司、中国人民解放军信息工程大学、中国科学院数据与
通信保护研究教育中心。
本部分主要起草人:陈建华、祝跃飞、叶顶峰、胡磊、裴定一、彭国华、张亚娟、张振峰。
引 言
N.Koblitz和V.Miler在1985年各自独立地提出将椭圆曲线应用于公钥密码系统。椭圆曲线公
钥密码所基于的曲线性质如下:
---有限域上椭圆曲线在点加运算下构成有限交换群,且其阶与基域规模相近;
---类似于有限域乘法群中的乘幂运算,椭圆曲线多倍点运算构成一个单向函数。
在多倍点运算中,已知多倍点与基点,求解倍数的问题称为椭圆曲线离散对数问题。对于一般椭圆
曲线的离散对数问题,目前只存在指数级计算复杂度的求解方法。与大数分解问题及有限域上离散对
数问题相比,椭圆曲线离散对数问题的求解难度要大得多。因此,在相同安全程度要求下,椭圆曲线密
码较其他公钥密码所需的密钥规模要小得多。
SM2是国家密码管理局组织制定并提出的椭圆曲线密码算法标准。GB/T 32918的主要目标如下:
---GB/T 32918.1定义和描述了SM2椭圆曲线密码算法的相关概念及数学基础知识,并概述了
该部分同其他部分的关系。
---GB/T 32918.2描述了一种基于椭圆曲线的签名算法,即SM2签名算法。
---GB/T 32918.3描述了一种基于椭圆曲线的密钥交换协议,即SM2密钥交换协议。
---GB/T 32918.4描述了一种基于椭圆曲线的公钥加密算法,即SM2加密算法,该算法需使用
GB/T 32905-2016定义的SM3密码杂凑算法。
---GB/T 32918.5给出了SM2算法使用的椭圆曲线参数,以及使用椭圆曲线参数进行SM2运算
的示例结果。
本部分为GB/T 32918的第1部分,描述了必要的数学基础知识与一般技术,以帮助实现其他各部
分所规定的密码机制。
信息安全技术
SM2椭圆曲线公钥密码算法
第1部分:总则
1 范围
GB/T 32918的本部分规定了SM2椭圆曲线公钥密码算法涉及的必要数学基础知识与相关密码
技术,以帮助实现其他各部分所规定的密码机制。
本部分适用于基域为素域和二元扩域的椭圆曲线公钥密码算法的设计、开发、使用。
2 符号和缩略语
下列符号和缩略语适用于本文件。
B MOV阈。正数B,使得求取FqB上的离散对数至少与求取Fq 上的椭圆曲线离
散对数一样困难。
deg(f) 多项式f(x)的次数。
E 有限域上由a和b定义的一条椭圆曲线。
E(Fq) Fq 上椭圆曲线E 的所有有理点(包括无穷远点O)组成的集合。
ECDLP 椭圆曲线离散对数问题。
Fp 包含p个元素的素域。
Fq 包含q个元素的有限域。
Fq* 由Fq中所有非零元构成的乘法群。
F2m 包含2m 个元素的二元扩域。
G 椭圆曲线的一个基点,其阶为素数。
gcd(x,y) x和y的最大公因子。
h 余因子,h=#E(Fq)/n,其中n是基点G 的阶。
LeftRotate() 循环左移运算。
lmax 余因子h的最大素因子的上界。
m 二元扩域F2m关于F2的扩张次数。
modf(x) 模多项式f(x)的运算。若f(x)是二元域上的多项式,则所有系数执行模2
运算。
modn 模n运算。例如,23mod7=2。
n 基点G 的阶[n是#E(Fq)的素因子]。
O 椭圆曲线上的一个特殊点,称为无穷远点或零点,是椭圆曲线加法群的单位元。
P P=(xP,yP)是椭圆曲线上除O 之外的一个点,其坐标xP,yP满足椭圆曲线
方程。
P1+P2 椭圆曲线E 上两个点P1与P2的和。
p 大于3的素数。
q 有限域Fq中元素的数目。
a,b Fq 中的元素,它们定义Fq 上的一条椭圆曲线E。
rmin 基点G 的阶n的下界。
Tr() 迹函数。
xP 点P 的x坐标。
x-1modn 使得x·y≡1(modn)成立的唯一整数y,1≤y≤n-1,gcd(x,n)=1。
x‖y x与y的拼接,其中x和y是比特串或字节串。
x≡y(modn) x与y模n同余。亦即,x modn=ymodn。
yP 点P 的y坐标。
y~P yP的点压缩表示。
Zp 整数模p的剩余类环。
< G > 基点G 生成的循环群。
[k]P 椭圆曲线上点P 的k倍点,即:[k]P=P+P++P
,其中k是正整数。
[x,y] 大于或等于x且小于或等于y的整数的集合。
x 顶函数,大于或等于x的最小整数。例如,7 =7,8.3 =9。
x 底函数,小于或等于x的最大整数。例如,7 =7,8.3 =8。
#E(Fq) E(Fq)上点的数目,称为椭圆曲线E(Fq)的阶。
⊕ 长度相等的两个比特串按比特的异或运算。
3 域和椭圆曲线
3.1 有限域
3.1.1 概述
本条给出有限域Fq的描述及其元素的表示,q是一个奇素数或者是2的方幂。当q是奇素数p
时,要求p >2191;当q是2的方幂2m时,要求m >192且为素数。
3.1.2 素域Fp
当q是奇素数p时,素域Fp中的元素用整数0,1,2,,p-1表示。素域特性如下:
a) 加法单位元是整数0;
b) 乘法单位元是整数1;
c) 域元素的加法是整数的模p加法,即若a,b∈Fp,则a+b=(a+b)modp;
d) 域元素的乘法是整数的模p乘法,即若a,b∈Fp,则a·b=(a·b)modp。
3.1.3 二元扩域F2m
当q是2的方幂2m时,二元扩域F2m可以看成F2上的m 维向量空间,其元素可用长度为m 的比特
串表示。
F2m中的元素有多种表示方法,其中最常用的两种方法是多项式基(PB)表示(参见A.2.1.1)和正规
基(NB)表示(参见A.2.1.3)。基的选择原则是使得F2m中的运算效率尽可能高。本部分并不规定基的
选择。下面以多项式基表示为例说明二元扩域F2m。
设F2上m 次不可约多项式f(x)=xm+fm-1xm-1++f2x2+f1x+f0(其中fi∈F2,i=0,1,
,m-1)是二元扩域F2m 的约化多项式。F2m 由F2上所有次数低于m 的多项式构成。多项式集合
{xm-1,xm-2,,x,1}是F2m 在F2上的一组基,称为多项式基。F2m 中的任意一个元素a(x)=
am-1xm-1+am-2xm-2++a1x+a0在F2上的系数恰好构成了长度为m 的比特串,用a=(am-1,
am-2,,a1,a0)表示。多项式域特性如下:
a) 零元0用全0比特串表示;
b) 乘法单位元1用比特串00001表示;
c) 两个域元素的加法为比特串的按比特异或运算;
d) 域元素a和b的乘法定义如下:设a和b对应的F2上多项式为a(x)和b(x),则a·b定义为
多项式(a(x)b(x))modf(x)对应的比特串。
3.2 有限域上的椭圆曲线
有限域Fq上的椭圆曲线是由点组成的集合。在仿射坐标系下,椭圆曲线上点P(非无穷远点)的坐
标表示为P=(xP,yP),其中xP,yP为满足一定方程的域元素,分别称为点P 的x坐标和y坐标。在
本部分中,称Fq为基域。
关于椭圆曲线更多的背景知识,参见附录A中A.1和A.2。
在本部分中,如果不做特别说明,椭圆曲线上的点均采用仿射坐标表示。
3.2.1 Fp 上的椭圆曲线
定义在Fp(p是大于3的素数)上的椭圆曲线方程为:
y2=x3+ax+b,a,b∈Fp,且(4a3+27b2)modp≠0。(1)
椭圆曲线E(Fp)定义为,参见C.2:
E(Fp)={(x,y)|x,y∈Fp,且满足方程(1)}∪{O},其中O 是无穷远点。
椭圆曲线E(Fp)上的点的数目用#E(Fp)表示,称为椭圆曲线E(Fp)的阶。
3.2.2 F2m上的椭圆曲线
定义在F2m上的椭圆曲线方程为:
y2+xy=x3+ax2+b,a,b∈F2m,且b≠0。 (2)
椭圆曲线E(F2m)定义为,参见C.3:
E(F2m)={(x,y)|x,y∈F2m,且满足方程(2)}∪{O},其中O 是无穷远点。
椭圆曲线E(F2m)上的点的数目用#E(F2m)表示,称为椭圆曲线E(F2m)的阶。
3.2.3 椭圆曲线群
3.2.3.1 Fp 上的椭圆曲线群
椭圆曲线E(Fp)上的点按照下面的加法运算规则,构成一个交换群:
a) O+O=O;
b) ∀P=(x,y)∈E(Fp)\{O},P+O=O+P=P;
c) ∀P=(x,y)∈E(Fp)\{O},P 的逆元素-P=(x,-y),P+(-P)=O;
d) 两个非互逆的不同点相加的规则:
设P1=(x1,y1)∈E(Fp)\{O},P2=(x2,y2)∈E(Fp)\{O},且x1≠x2,
设P3=(x3,y3)=P1+P2,则
x3=λ2-x1-x2,
y3=λ(x1-x3)-y1,{
式中:
λ=
y2-y1
x2-x1
e) 倍点规则:
设P1=(x1,y1)∈E(Fp)\{O},且y1≠0,P3=(x3,y3)=P1+P1,
x3=λ2-2x1,
y3=λ(x1-x3)-y1,{
式中:
λ=
3x21+a
2y1
3.2.3.2 F2m上的椭圆曲线群
椭圆曲线E(F2m)上的点按照下面的加法运算规则,构成一个交换群:
a) O+O=O;
b) ∀P=(x,y)∈E(F2m)\{O},P+O=O+P=P;
c) ∀P=(x,y)∈E(F2m)\{O},P 的逆元素-P=(x,x+y),P+(-P)=O;
d) 两个非互逆的不同点相加的规则:
设P1=(x1,y1)∈E(F2m)\{O},P2=(x2,y2)∈E(F2m)\{O},且x1≠x2,
设P3=(x3,y3)=P1+P2,则
x3=λ2+λ+x1+x2+a,
y3=λ(x1+x3)+x3+y1,{
式中:
λ=
y1+y2
x1+x2
e) 倍点规则:
设P1=(x1,y1)∈E(F2m)\{O},且x1≠0,P3=(x3,y3)=P1+P1,则
x3=λ2+λ+a,
y3=x21+(λ+1)x3,{
式中:
λ=x1+
y1
x1
3.2.4 椭圆曲线多倍点运算
椭圆曲线上同一个点的多次加称为该点的多倍点运算。设k是一个正整数,P 是椭圆曲线上的
点,称点P 的k次加为点P 的k倍点运算,记为Q=[k]P=P+P++P
。因为[k]P=[k-1]P+
P,所以k倍点可以递归求得。
多倍点运算的输出有可能是无穷远点O。
多倍点运算也可以通过一些技巧更有效地实现,参见附录A中A.3。
3.2.5 椭圆曲线离散对数问题(ECDLP)
已知椭圆曲线E(Fq)、阶为n的点G∈E(Fq)及Q∈< G >,椭圆曲线离散对数问题是指确定整数
l∈[0,n-1],使得Q=[l]G 成立。
椭圆曲线离散对数问题关系到椭圆曲线密码系统的安全,因此应选择安全的椭圆曲线。关于如何
选择安全椭圆曲线,参见附录A中A.4。
3.2.6 弱椭圆曲线
若某椭圆曲线存在优于n1/2级(n是基点的阶)计算复杂度的攻击方法,则称此曲线为弱椭圆曲线。
在本部分中禁止使用弱椭圆曲线。
Fq上的超奇异曲线[有限域Fq的特征整除q+1-#E(Fq)]和Fp上的异常(Anomalous)曲线
[#E(Fp)=p]都是弱椭圆曲线。
4 数据类型及其转换
4.1 数据类型
在本部分中,数据类型包括比特串、字节串、域元素、椭圆曲线上的点和整数。
比特串:有序的0和1的序列。
字节串:有序的字节序列,其中8比特为1个字节。
域元素:有限域Fq中的元素。
椭圆曲线上的点:椭圆曲线上的点P∈E(Fq),或者是一对域元素(xP,yP),其中域元素xP和yP
满足椭圆曲线方程,或者是无穷远点O。
点的字节串表示有多种形式,用一个字节PC 加以标识。无穷远点O 的字节串表示是单一的零字
节PC=00。非无穷远点P=(xP,yP)有如下三种字节串表示形式:
a) 压缩表示形式,PC=02或03;
b) 未压缩表示形式,PC=04;
c) 混合表示形式,PC=06或07。
注:混合表示形式既包含压缩表示形式又包含未压缩表示形式。在实现中,它允许转换到压缩表示形式或者未压
缩表示形式。
对于椭圆曲线上点的压缩表示形式和混合表示形式,本部分中定为可选形式。椭圆曲线上点的压
缩表示形式参见附录A中A.5。
4.2 数据类型转换
4.2.1 数据类型转换关系
图1提供了各种数据类型之间的转换关系,线上的标志是相应数据转换方法所在的条。
图1 数据类型和转换约定
4.2.2 整数到字节串的转换
输入:非负整数x,以及字节串的目标长度k(其中k满足28k >x)。
输出:长度为k的字节串M。
a) 设Mk-1,Mk-2,,M0是M 的从最左边到最右边的字节;
b) M 的字节满足:
4.2.3 字节串到整数的转换
输入:长度为k的字节串M。
输出:整数x。
a) 设Mk-1,Mk-2,,M0是M 的从最左边到最右边的字节;
b) 将M 转换为整数x:
4.2.4 比特串到字节串的转换
输入:长度为m 的比特串s。
输出:长度为k的字节串M,其中k= m/8 。
a) 设sm-1,sm-2,,s0是s从最左边到最右边的比特;
b) 设Mk-1,Mk-2,,M0是M 从最左边到最右边的字节,则
Mi=s8i+7s8i+6s8i+1s8i,其中0≤i< k,当8i+j≥m,0< j≤7时,s8i+j=0。
4.2.5 字节串到比特串的转换
输入:长度为k的字节串M。
输出:长度为m 的比特串s,其中m=8k。
a) 设Mk-1,Mk-2,,M0是M 从最左边到最右边的字节;
b) 设sm-1,sm-2,,s0是s从最左边到最右边的比特,则si是Mj右起第i-8j+1比特,其中j=
i/8 。
4.2.6 域元素到字节串的转换
输入:Fq中的元素α。
输出:长度l= t/8 的字节串S,其中t= log2q 。
a) 若q为奇素数,则α必为区间[0,q-1]中的整数,按4.2.2的方法把α转换成长度为l的字节
串S;
b) 若q=2m,则α必为长度为m 的比特串,按4.2.4的方法把α转换成长度为l的字节串S。
4.2.7 字节串到域元素的转换
输入:基域Fq的类型,长度为l= t/8 的字节串S,其中t= log2q 。
输出:Fq中的元素α。
a) 若q是奇素数,则按4.2.3的方法将S转换为整数α,若α∉[0,q-1],则报错;
b) 若q=2m,则按4.2.5的方法将S转换为长度为m 的比特串α。
4.2.8 域元素到整数的转换
输入:域Fq中的元素α。
输出:整数x。
a) 若q为奇素数,则x=α(不需要转换);
b) 若q=2m,则α必为长度为m 的比特串,设sm-1,sm-2,,s0是α的从最左边到最右边的比特,
将α转化为整数x:
4.2.9 点到字节串的转换
输入:椭圆曲线上的点P=(xP,yP),且P≠O。
输出:字节串S。若选用未压缩表示形式或混合表示形式,则输出字节串长度为2l+1;若选用压
缩表示形式,则输出字节串长度为l+1(l= (log2q)/8)。
a) 按4.2.6中的方法把域元素xP转换成长度为l的字节串X1;
b) 若选用压缩表示形式,则:
1) 计算比特y~P(参见附录A中A.5);
2) 若y~P=0,则令PC=02;若y~P=1,则令PC=03;
3) 字节串S=PC‖X1;
c) 若选用未压缩表示形式,则:
1) 按4.2.6的方法把域元素yP转换成长度为l的字节串Y1;
2) 令PC=04;
3) 字节串S=PC‖X1‖Y1;
d) 若选用混合表示形式,则:
1) 按4.2.6的方法把域元素yP转换成长度为l的字节串Y1;
2) 计算比特y~P(参见附录A中A.5);
3) 若y~P=0,则令PC=06;若y~P=1,则令PC=07;
4) 字节串S=PC‖X1‖Y1。
4.2.10 字节串到点的转换
输入:定义Fq上椭圆曲线的域元素a、b,字节串S。若选用未压缩表示形式或混合表示形式,则字
节串S长度为2l+1;若选用压缩表示形式,则字节串PO 长度为l+1(l= (log2q)/8)。
输出:椭圆曲线上的点P=(xP,yP),且P≠O。
a) 若选用压缩表示形式,则S=PC‖X1;若选用未压缩表示形式或混合表示形式,则S=
PC‖X1‖Y1,其中PC 是单一字节,X1和Y1都是长度为l的字节串;
b) 按4.2.7的方法把字节串X1转换成域元素xP;
c) 若选用压缩表示形式,则:
1) 检验PC=02或者是PC=03,若不是这种情形,则报错;
2) 若PC=02,则令y~P=0;若PC=03,则令y~P=1;
3) 将(xP,y~P)转换为椭圆曲线上的一个点(xP,yP)(参见附录A中A.5);
d) 若选用未压缩表示形式,则:
1) 检验PC=04,若不是这种情形,则报错;
2) 按4.2.7的方法把字节串Y1转换成域元素yP;
e) 若选用混合表示形式,则:
1) 检验PC=06或者PC=07,若不是这种情形,则报错;
2) 执行步骤如下:
---按4.......
|