SM2 - Fp

1 符号和缩略语
a,bFq中的元素,它们定义Fq上的一条椭圆曲线E
E:有限域上由ab定义的一条椭圆曲线。
E(Fq)Fq上椭圆曲线E的所以有理点(包括无穷远点O)组成的集合。
Fp:包含p个元素的素域。
Fq:包含q个元素的有限域。
Fq:由Fq中所有非零元构成的乘法群。
G:椭圆曲线的一个基点,其阶为素数。
gcd(x,y)xy的最大公因子。
h:余因子,h=E(Fq)n,其中n是基点G的阶。
mod n:模n运算。
n:基点G的阶(nE(Fq)的素因子)。
O:椭圆曲线上的一个特殊点,称为无穷远点或零点,是椭圆曲线加法群的单位元。
PP=(xP,yP)是椭圆曲线上除O之外的一个点,其坐标xPyP满足椭圆曲线方程。
P1+P2:椭圆曲线E上两个点P1P2的和。
p:大于3的素数
q:有限域Fq中元素的数目。
xP:点Px坐标。
x1 mod n:使得xy1(mod n)成立的唯一整数y1yn1gcd(x,n)=1
xyxy的拼接,其中xy是比特串或字节串。
xy(mod n)xyn同余。亦即,x mod n=y mod n
yP:点Py坐标。
Zp:整数模p的剩余类环。
G:基点G生成的循环群。
[k]P:椭圆曲线上点Pk倍点,即:[k]P=P+P++Pk,其中k是正整数。
[x,y]:大于或等于x且小于或等于y的整数的集合。
x:顶函数,大于或等于x的最小整数。例如,7=78.3=9
x:底函数,小于或等于y的最大整数。例如,7=78.3=8
E(Fq)E(Fq)上点的数目,称为椭圆曲线E(Fq)的阶。


2 素域Fp
q是奇素数p时,素域Fp中的元素用整数0,1,2,,p1表示。

  1. 加法单位元是整数0
  2. 乘法单位元是整数1
  3. 域元素的加法是整数的模p加法,即若a,bFp,则a+b=(a+b) mod p
  4. 域元素的乘法是整数的模p乘法,即若a,bFp,则ab=(ab) mod p

2.1 有限域上的椭圆曲线
有限域Fq上的椭圆曲线是由点组成的集合。在仿射坐标系下,椭圆曲线上点P(非无穷远点)的坐标表示为P=(xP,yP),其中xPyP为满足一定方程的域元素,分别称为点Px坐标和y坐标。此处,称Fq为基域。

2.1.1 Fp上的椭圆曲线
定义在Fpp是大于3的素数)上的椭圆曲线方程为:
y2=x3+ax+ba,bFp,且(4a2+27b2) mod p0
椭圆曲线E(Fp)定义为:
E(Fp)={(x,y)y2=x3+ax+b,x,yFp}{O},其中O是无穷远点。
椭圆曲线E(Fp)上的点的数目用E(Fp)表示,称为椭圆曲线E(Fp)的阶。

2.1.2 Fp上的椭圆曲线群
椭圆曲线E(Fp)上的点按照下面的加法运算规则,构成一个交换群:

  1. O+O=O
  2. P=(x,y)E(Fp){O}P+O=O+P=P
  3. P=(x,y)E(Fp){O}P的逆元素P=(x,y)P+(P)=O
  4. 两个非互逆的不同点相加的规则:
    P1=(x1,y1)E(Fp){O}P2=(x2,y2)E(Fp){O},且x1x2,设P3=(x3,y3)=P1+P2,则
    {x3=λ2x1x2y3=λ(x1x3)y1
    其中
    λ=y2y1x2x1
  5. 倍点规则:
    P1=(x1,y1)E(Fp){O},且y10P3=(x3,y3)=P1+P1
    {x3=λ22x1y3=λ(x1x3)y1
    其中
    λ=3x12+a2y1

2.2 素域Fp的定义
p是一个素数,Fp{0,1,2,,p1}p个元素构成,称Fp为素域。加法单位元是整数0,乘法单位元是整数1Fp的元素满足如下运算法则:
  ——加法:设a,bFp,则a+b=r,其中r=(a+b) mod pr[0,p1]
  ——乘法:设a,bFp,则ab=s,其中s=(ab) mod pr[0,p1]
Fp是由Fp中所有非零元构成的乘法群,由于Fp是循环群,所以在Fp中至少存在一个元素g,使得Fp中任一非零元都可以由g的一个方幂表示,称gFp的生成元(或本原元),即Fp={gi0ip2}。设a=giFp,其中0ip2,则a的乘法逆元为:a1=gp1i

2.3 Fp上椭圆曲线的定义
2.3.1 概述
Fp上椭圆曲线常用的表示形式有两种:仿射坐标表示和射影坐标表示。

2.3.2 仿射坐标表示
p是大于3的素数时,Fp上椭圆曲线方程在仿射坐标系下可以简化为y2=x3+ax+b,其中a,bFp,且使得(4a2+27b2) mod p0。椭圆曲线上的点集记为E(Fp)={(x,y)y2=x3+ax+b,x,yFp}{O},其中O是椭圆曲线的无穷远点。
E(Fp)上的点按照下面的加法运算规则,构成一个阿贝尔群:

  1. O+O=O
  2. P=(x,y)E(Fp){O}P+O=O+P=P
  3. P=(x,y)E(Fp){O}P的逆元素P=(x,y)P+(P)=O
  4. P1=(x1,y1)E(Fp){O}P2=(x2,y2)E(Fp){O}P3=(x3,y3)=P1+P2O,则
    {x3=λ2x1x2y3=λ(x1x3)y1
    其中
    λ={y2y1x2x1x1x23x12+a2y1x1=x2P2P1

2.3.3 射影坐标表示
2.3.3.1 标准射影坐标系
p是大于3的素数时,Fp上椭圆曲线方程在标准射影坐标系下可以简化为y2z=x3+axz2+bz3,其中a,bFp,且(4a2+27b2) mod p0。椭圆曲线上的点集记为E(Fp)={(x,y,z)y2z=x3+axz2+bz3,x,y,zFp}。对于(x1,y1,z1)(x2,y2,z2),若存在某个uFpu0,使得:x1=ux2y1=uy2z1=uz2,则称这两个三元组等价,表示同一个点。
z0,记X=xzY=yz,则可从标准射影坐标表示转化为仿射坐标表示:Y2=X3+aX+b
z=0(0,1,0)对应的仿射坐标系下的点即无穷远点O
标准射影坐标系下,E(Fp)上点的加法运算定义如下:

  1. O+O=O
  2. P=(x,y,z)E(Fp){O}P+O=O+P=P
  3. P=(x,y,z)E(Fp){O}P的逆元素P=(ux,uy,uz)uFpP+(P)=O
  4. 设点P1=(x1,y1,z1)E(Fp){O}P2=(x2,y2,z2)E(Fp){O}P3=P1+P2=(x3,y3,z3)O
    P1P2,则:
    λ1=x1z2λ2=x2z1λ3=λ1λ2λ4=y1z2λ5=y2z1λ6=λ4λ5λ7=λ1+λ2λ8=z1z2λ9=λ32λ10=λ3λ9λ11=λ8λ62λ7λ9x3=λ3λ11y3=λ6(λ9λ1λ11)λ4λ10z3=λ10λ8
    P1=P2,则:
    λ1=3x12+az12λ2=2y1z1λ3=y12λ4=λ3x1z1λ5=λ22λ6=λ128λ1x3=λ2λ6y3=λ1(4λ4λ6)2λ5λ3z3=λ2λ5

2.3.3.2 Jacobian加重映射坐标系
Fp上椭圆曲线方程在Jacobian加重射影坐标系下可以简化为y2=x3+axz4+bz6,其中a,bFp,且(4a2+27b2) mod p0。椭圆曲线上的点集记为E(Fp)={(x,y,z)y2=x3+axz4+bz6,x,y,zFp}。对于(x1,y1,z1)(x2,y2,z2),若存在某个uFpu0,使得:x1=u2x2y1=u2y2z1=u2z2,则称这两个三元组等价,表示同一个点。
z0,记X=xz2Y=yz3,则可从Jacobian加重射影坐标表示转化为仿射坐标表示:Y2=X3+aX+b
z=0(1,1,0)对应的仿射坐标系下的点即无穷远点O
Jacobian加重射影坐标系下,E(Fp)上点的加法运算定义如下:

  1. O+O=O
  2. P=(x,y,z)E(Fp){O}P+O=O+P=P
  3. P=(x,y,z)E(Fp){O}P的逆元素P=(u2x,u3y,uz)uFpP+(P)=O
  4. 设点P1=(x1,y1,z1)E(Fp){O}P2=(x2,y2,z2)E(Fp){O}P3=P1+P2=(x3,y3,z3)O
    P1P2,则:
    λ1=x1z22λ2=x2z12λ3=λ1λ2λ4=y1z23λ5=y2z13λ6=λ4λ5λ7=λ1+λ2λ8=λ4+λ5x3=λ62λ7λ32y3=λ6(λ1λ32x3)λ4λ33z3=z1z2λ3
    P1=P2,则:
    λ1=3x12+az14λ2=4x1y12λ3=8y14x3=λ122λ2y3=λ1(λ2x3)λ3z3=2y1z1

2.4 Fp上椭圆曲线的阶
Fpp是大于3的素数)上一条椭圆曲线的阶是指点集E(Fp)中元素的个数,记为E(Fp)。由Hasse定理知:p+12p12E(Fp)p+1+2p12
若一条曲线的阶E(Fp)=p+1,则称此曲线为超奇异的,否则为非超奇异的。


3 椭圆曲线多倍点运算
3.1 概述
P是椭圆曲线E上阶为N的点,k为正整数,Pk倍点为Q,即

Q=[k]P=P+P++Pk

3.2 椭圆曲线多倍点运算的实现
椭圆曲线多倍点运算的实现有多种方法,这里给出三种方法,以下都假设1k<N
算法一:二进制展开法
输入:点Pl比特的整数k=j=0l1kj2jkj{0,1}
输出:Q=[k]P

  1. Q=O;
  2. jl1下降到0执行:
    2.1. Q=[2]Q
    2.2. 若kj=1,则Q=Q+P
  3. 输出Q

算法二:加减法
输入:点Pl比特的整数k=j=0l1kj2jkj{0,1}
输出:Q=[k]P

  1. 3k的二进制表示是hrhr1h1h0,其中最高位hr1
  2. k的二进制表示是krkr1k1k0,显然r=ll+1
  3. Q=P
  4. ir1下降到1执行:
    4.1. Q=[2]Q
    4.2. 若hi=1,且ki=0,则Q=Q+P
    4.3. 若hi=0,且ki=1,则Q=QP
  5. 输出Q

算法三:滑动窗法
输入:点Pl比特的整数k=j=0l1kj2jkj{0,1}
输出:Q=[k]P
设窗口长度r>1
预计算

  1. P1=PP2=[2]P
  2. i12r11计算P2i+1=P2i1+P2
  3. j=l1Q=O

主循环

  1. j0执行:
    4.1. 若kj=0,则Q=[2]Qj=j1
    4.2. 否则
     4.2.1. 令t是使jt+1rkt=1的最小整数;
     4.2.2. hj=i=0jtkt+i2i
     4.2.3. Q=[2jt+1]Q+Phj
     4.2.4. 置j=t1
  2. 输出Q

4 Fp上椭圆曲线系统参数及其验证
椭圆曲线系统参数是可以公开的,系统的安全性不依赖于对这些参数的保密。
4.1 Fp上椭圆曲线系统参数
Fp上椭圆曲线系统参数包括:

  1. 域的规模q=pp为大于3的素数;
  2. (选项)一个长度至少为192的比特串SEED
  3. Fp中的两个元素ab,它们定义椭圆曲线E的方程:y2=x3+ax+b
  4. 基点G=(xG,yG)E(Fp)GO
  5. 基点G的阶n(要求:n>2191n>4p12);
  6. (选项)余因子h=E(Fp)n

4.2 Fp上椭圆曲线系统参数的验证
椭圆曲线系统参数的生成者应验证下面的条件。椭圆曲线系统参数的用户可以选择验证这些条件。
输入:Fp上椭圆曲线系统参数的集合。
输出:若椭圆曲线系统参数是有效的,则输出“有效”;否则输出“无效”。

  1. 验证q=p是奇素数(参见4.3节);
  2. 验证abxGyG是区间[0,p1]中的整数;
  3. 若按照4.4节描述的方法拟随机产生椭圆曲线,验证SEED是长度至少为192的比特串,且abSEED派生得到;
  4. 验证(4a2+27b2) mod p0
  5. 验证yG2xG3+axG+b(mod p)
  6. 验证n是素数,n>2191n>4p12(参见4.3节);
  7. 验证[n]G=O
  8. (选项)计算h=(p12+1)2n,并验证h=h
  9. 验证抗MOV攻击条件和抗异常曲线攻击条件成立(参见4.6.1和4.6.2节);
  10. 若以上任何一个验证失败,则输出“无效”;否则,输出“有效”。

4.3 概率素性检查
u是一个大的正整数,下面的改了算法(Miller-Rabin检测)将确定u使素数还是合数。
输入:一个大的奇数u和一个大的正整数T
输出:“概率素数”或“合数”。

  1. 计算v和奇数w,使得u1=2vw
  2. j1T执行:
    2.1. 在区间[2,u1]中选取随机数a
    2.2. 置b=aw mod u
    2.3. 若b=1u1,转到步骤2.6;
    2.4. 对i1v1执行:
     2.4.1. 置b=b2 mod u
     2.4.2. 若b=u1,转到步骤2.6;
     2.4.3. 若b=1,输出“合数”并终止;
     2.4.4. 下一个i
    2.5. 输出“合数”,并终止;
    2.6. 下一个j
  3. 输出“概率素数”。

若算法输出“合数”,则u是一个合数。若算法输出“概率素数”,在u是合数的概率小于22T。这样,通过选取足够大的T,误差可以忽略。

4.4 Fp上椭圆曲线系统参数的拟随机生成
方式1:
输入:素域的规模p
输出:比特串SEEDFp中的元素ab

  1. 任意选择长度至少为192的比特串SEED
  2. 计算H=H256(SEED),并记H=(h255,h254,,h0)
  3. R=i=0255hi2i
  4. r=R mod p
  5. 任意选择Fp的元素ab,使rb2a3(mod p)
  6. (4a2+27b2) mod p0,则转步骤1;
  7. 所选择的Fp上的椭圆曲线为E:y2=x3+ax+b
  8. 输出(SEED,a,b)

方式2:
输入:素域的规模p
输出:比特串SEEDFp中的元素ab

  1. 任意选择长度至少为192的比特串SEED
  2. 计算H=H256(SEED),并记H=(h255,h254,,h0)
  3. R=i=0255hi2i
  4. r=R mod p
  5. b=r
  6. Fp中的元素a为某固定值;
  7. (4a2+27b2) mod p0,则转步骤1;
  8. 所选择的Fp上的椭圆曲线为E:y2=x3+ax+b
  9. 输出(SEED,a,b)

4.5 Fp上椭圆曲线系统参数拟随机生成的验证
方式1
输入:比特串SEEDFp中的元素ab
输出:输入参数“有效”或“无效”。

  1. 计算H=H256(SEED),并记H=(h255,h254,,h0)
  2. R=i=0255hi2i
  3. r=R mod p
  4. rb2a3(mod p),则输出“有效”;否则输出“无效”。

方式2
输入:比特串SEEDFp中的元素ab
输出:输入参数“有效”或“无效”。

  1. 计算H=H256(SEED),并记H=(h255,h254,,h0)
  2. R=i=0255hi2i
  3. r=R mod p
  4. r=b,则输出“有效”;否则输出“无效”。

4.6 安全椭圆曲线满足的条件
4.6.1 抗MOV攻击条件
A. Menezes、T. Okamoto、S. Vanstone、G. Frey和H. Rück的约化攻击将有限域Fq上的椭圆曲线离散对数问题约化为FqBB>1)上的离散对数问题。这个攻击方法只有在B较小时是实用的,大多数椭圆曲线不符合这种情况。抗MOV攻击条件确保一条椭圆曲线不易受此约化方法攻击。多数Fq上的椭圆曲线确实满足抗MOV攻击条件。
在验证抗MOV攻击条件之前,必须选择一个MOV阈,它是使得求取FqB上的离散对数问题至少与求取Fq上的椭圆曲线离散对数问题同样难的一个正整数B。对于q>2191的标准,要求{B≥27}。选择B27也限制了对非超奇异椭圆曲线的选取。
下述算法用于验证椭圆曲线系统参数是否满足抗MOV攻击条件。
输入:MOV阈B,素数幂q和素数nnE(Fq) 的素因子,其中E(Fq)Fq上的椭圆曲线)。
输出:若Fq上包含n阶基点的椭圆曲线满足抗MOV攻击条件,则输出“正确”;否则输出“错误”。

  1. t=1
  2. i1B执行:
    2.1. 置t=(tq) mod n
    2.2. 若t=1,则输出“错误”并结束;
  3. 输出“正确”。

4.6.2 抗异常曲线攻击条件
E(Fp)为定义在素域Fp上的椭圆曲线,若E(Fp)=p,则称椭圆曲线E(Fp)为异常曲线。N. Smart、T. Satoh和K. Araki证明可在多项式时间内求解异常曲线的离散对数。抗异常曲线攻击条件为E(Fp)p,满足此条件确保椭圆曲线不受异常曲线攻击。Fp上的绝大多数椭圆曲线确实满足抗异常曲线攻击条件。
下述是否用于验证椭圆曲线系统参数是否满足抗异常曲线攻击条件。
输入:Fp上的椭圆曲线E(Fp),阶N=E(Fp)
输出:若E(Fp)满足抗异常曲线攻击条件,则输出消息“正确”;否则输出消息“错误”。

  1. N=p,则输出“错误”;否则输出“正确”。

5 密钥对的生成与公钥的验证
5.1 密钥对的生成
输入:一个有效的Fqq=pp为大于3的素数)上椭圆曲线系统参数的集合。
输出:与椭圆曲线系统参数相关的一个密钥对(d,P)

  1. 用随机数发生器产生整数d[2,n2]
  2. G为基点,计算点P=(xP,yP)=[d]G;
  3. 密钥对是(d,P),其中d为私钥,P为公钥。

5.2 Fp上椭圆曲线公钥的验证
输入:一个有效的Fpp为大于3的素数)上椭圆曲线系统参数集合及一个相关的公钥P
输出:对于给定的椭圆曲线系统参数,若公钥P是有效的,则输出“有效”;否则输出“无效”。

  1. 验证P不是无穷远点O
  2. 验证公钥P的坐标xPyP是域Fp中的元素(即验证xPyP是区间[0,p1]中的整数);
  3. 验证yP2xP3+axP+b(mod p)
  4. 验证[n]P=O
  5. 若通过了所有验证,则输出“有效”;否则输出“无效”。

6 曲线示例:Fp上椭圆曲线
椭圆曲线方程为:y2=x3+ax+b
示例1:Fp-192曲线

素数p BDB6F4FE 3E8B1D9E 0DA8C0D4 6F4C318C EFE4AFE3 B6B8551F
系数a BB8E5E8F BC115E13 9FE6A814 FE48AAA6 F0ADA1AA 5DF91985
系数b 1854BEBD C31B21B7 AEFC80AB 0ECD10D5 B1B3308E 6DBF11C1
基点G=(x,y),其阶记为n
坐标x 4AD5F704 8DE709AD 51236DE6 5E4D4B48 2C836DC6 E4106640
坐标y 02BB3A02 D4AAADAC AE24817A 4CA3A1B0 14B52704 32DB27D2
n BDB6F4FE 3E8B1D9E 0DA8C0D4 0FC96219 5DFAE76F 56564677

示例2:Fp-256曲线

素数p 8542D69E 4C044F18 BF6FF7DE 6F4C318C 45728391 5C45517D 722EDB8B 08F1DFC3
系数a 787968B4 FA32C3FD 2417842E 73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498
系数b 63E4C6D3 B23B0C84 9CF84241 484BFE48 F61D59A5 B16BA06E 6E12D1DA 27C5249A
基点G=(x,y),其阶记为n
坐标x 421DEBD6 1B62EAB6 746434EB C3CC315E 32220B3B ADD50BDC 4C4E6C14 7FEDD43D
坐标y 0680512B CBB42C07 D47349D2 153B70C4 E5D7FDFC BFA36EA1 A85841B9 E46E09A2
n 8542D69E 4C044F18 E8B92435 BF6FF7DD 29772063 0485628D 5AE74EE7 C32E79B7

7 SM2椭圆曲线公钥密码算法的参数定义
SM2使用素数域256位椭圆曲线。
椭圆曲线方程:y2=x3+ax+b
曲线参数:

p= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
a= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
b= 28E9FA9E D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
n= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
xG= 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
yG= BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0


参考
GM/T 0003.1—2012
GM/T 0003.5—2012

posted @   Miro'  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 想让你多爱自己一些的开源计时器
· 大模型 Token 究竟是啥:图解大模型Token
· 用99元买的服务器搭一套CI/CD系统
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
点击右上角即可分享
微信分享提示