具体实施方式
下面结合附图1、2进一步详细说明本发明的椭圆曲线密码系统及方法。
椭圆曲线的定义:
一条椭圆曲线是在射影平面上满足方程:
Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4X2+a6Z3----------------[3-1]的所有点的集合,且曲线上的每个点都是非奇异或者光滑的。
其中,Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4X2+a6Z3是维尔斯特拉斯方程(Weierstrass,Karl Theodor Wilhelm Weierstrass,1815-1897),是一个齐次方程。
所谓“非奇异”或“光滑”的,在数学中是指曲线上任意一点的偏导数Fx(x,y,z),Fy(x,y,z),Fz(x,y,z)不能同时为0。
设椭圆曲线上有一个无穷远点O∞(0∶1∶0),因为这个点满足方程[3-1],
x=X/Z,y=Y/Z代入方程[3-1]得到:
Y2+a1xy+a3y=x3+a2x2+a4x+a6-------------------------[3-2]
其中,(x,y)为普通平面直角坐标系上的坐标。
也就是说满足方程[3-2]的光滑曲线加上一个无穷远点O∞,组成了椭圆曲线。
椭圆曲线是连续的,并不适合用于加密,因此,一般地,要把适合加密的椭圆曲线定义在有限域上。
有限域是一种只由有限个元素组成的域。
给出一个有限域Fp,这个域只有有限个元素,即Fp中只有p(p为素数)个元素0,1,2……p-2,p-1。
定义Fp的加法(a+b)法则是a+b≡c(mod p);即,(a+b)÷p的余数和c÷p的余数相同;
Fp的乘法(a×b)法则是a×b≡c(mod p);
Fp的除法(a÷b)法则是a/b≡c(mod p);即a×b-1≡c(mod p);(b-1也是一个0到p-1之间的整数,但满足b×b-1≡1(mod p))。
Fp的单位元是1,零元是0。
但是,并不是所有的有限域上的椭圆曲线都适合加密,其中对于定义在大素数域上的椭圆曲线是适合于加密的椭圆曲线,大素数域上的椭圆曲线可通过同构映射将一般的曲线方程变换为特别简单的形式:y2=x3+ax+b,其中曲线参数a,b∈Fp并且满足4a3+27b2≠0(mod p)。
因此,满足下列方程的所有点(x,y),再加上无穷远点O∞,构成一条定义在大素数域Fp上的椭圆曲线。
Y2=x3+ax+b(mod p)
其中x,y属于0到p-1间的大素数,并将这条椭圆曲线记为Ep(a,b)。
公开密钥算法总是要基于一个数学上的难题。比如RSA密码系统依据的是:给定两个大素数p、q很容易相乘得到n,而对n进行因式分解却相对困难。
考虑如下等式:
K=kG[其中K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数,不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相当困难了。
这就是椭圆曲线密码系统基于的数学难题。把点G称为基点(base point),k(k<n,n为基点G的阶)称为私有密钥(private key),K称为公开密钥(publickey)。
本发明是采用了Montgomery算数来实现大素数域中的各种运算,从而实现椭圆曲线密码的系统和方法。
如图2所示Montgomery算数由Peter Montgomery提出,其核心运算是Montgomery乘法,由于Montgomery乘法既不需要计算及其耗时的除法也不需要利用商估值技术,因此它简化了模归约运算。
从数学的角度来看,Montgomery域与素数域GF(p)是同构的,GF(p)中的每一个元素在Montgomery域都有一个唯一与之对应的元素。元素a∈GF(p)在Montgomery域中表示为a′=a·R mod p,其中R称为Montgomery常数(R必须大于p)。Montgomery常数R与大素数域的特征必须互素,即gcd(R,p)=1。通常选取R是2的幂次:R=2m,其中m反映了硬件的规模,较佳为R=2192。
利用Montgomery算数完成素数域运算需要将操作数由素数域转化到Montgomery域,转化可利用Montgomery乘法完成:a′=MonMul(a,R2)=a·R2/R mod p=a·R mod p。
在系统中通过硬件实现Montgomery乘法算法,则这种转化在硬件实现时不再需要其它的运算,因此也不需要附加的硬件资源,转化时Montgomery常数R=2m mod p已经被预计算,即计算R2需要一些花费,但对于每个模p仅需计算一次。
由Montgomery域转化到素数域也可利用Montgomery乘法完成:a=MonMul(a′,1)=a′·1/R mod p=a·R·1/R mod p=a mod p;b与a的运算方式是一样的,即对b有下式成立b=MonMul(b′,1)=b′·1/R mod p=b·R·1/R mod p=b mod p。当在Montgomery域中执行大量算数运算时,这种转化的花费可以忽略,因为只需在所有运算开始和结束时进行一次。本发明中的椭圆曲线密码系统运算开始时所有的操作数被转化到Montgomery域中接着在Montgomery域完成所有椭圆曲线上的点运算,最后运算结果被转化到大素数域。
这样,本发明利用大整数的Montgomery表示可以有效地实现素数域中的模运算,而且在Montgomery域中无需显式执行耗时的模归约运算,实现椭圆曲线密码系统的所需的所有算数运算能够在Montgomery域中进行:模加/模减、模乘、求逆运算、模平方运算以及模归约运算。
模加运算:a+b mod p=MonAdd(a’,b’)=(a+b)R mod p=a’+b’mod p
模乘运算:a·bmod p=MonMul(a’,b’)=(a·b)R mod p=a’·b’/R mod p
求逆运算:a-1 mod p=MonInv(a’)=a-1R mod p=a’-1R2 mod p
模减运算:a-b mod p=MonSub(a’,b’)=(a-b)R mod p=a’-b’mod p
模平方运算:a2mod p=MonSq(a’2)=(a2)R mod p=a’2/R mod p
模归约运算:r=cR-1 mod p
其中,MonMul:模乘运算;MonAdd:模加运算;MonInv:求逆运算;MonSub:模减运算;MonSq:模平方运算
下面结合图1详细说明本发明实施例的椭圆曲线密码系统:
如图1所示,本实施例的椭圆曲线密码系统包括:
有限域算法模块,用于利用Montgomery算数实现大素数域中的加法运算、乘法运算、平方运算以及求逆运算。
这里的大素数域就是指的一般的素数域Fp,p是大于2的素数。
所述的有限域算法模块包括模加运算模块、模减运算模块、模乘运算模块、模平方运算模块、模归约运算模块、求逆运算模块。
所述的模乘运算模块为CIOS-Montgomery乘法算法模块(CoarselyIntegrated Operand Scanning),该算法模块占用的资源最少,速度最快。
CIOS-Montgomery乘法算法的原理是:该算法集成了乘法与归约步骤。具体地说,此算法并没有直接计算a与b的乘积然后对该乘积进行归约,而是对乘法和归约在外层循环中交替进行,这样做是由于在第i次外层循环中归约步骤所用到的值m仅依赖于s[i]的值,而在乘法的第i次循环中s[i]的值已经计算完毕。
所述的模平方运算模块为SRCIL-Montgomery平方算法模块(SquaringReduction with Inner Loop),该算法速度最快。SRCIL-Montgomery平方算法原理是:该算法去除了一般Montgomery平方算法中的冗余部分并最大化算法软件并行的能力,其基本思想是使用了一个单独的循环计算ai×ai、去掉了进位的延迟并且通过改变循环的结构去掉冗余的部分。
所述的求逆运算模块为指数求逆算法模块,用费马小定理实现有限域中的求逆运算,即b=ap-2(mod p),其能够利用硬件电路板上的Montgomery乘法器资源,该算法模块在有Montgomery乘法器的硬件电路板上的执行时间约为二元扩展欧几里得算法执行时间的70%。
本实施例中的椭圆曲线密码系统,还包括:
点加与倍点算法模块,用于在利用Montgomery算数实现有限域算法的基础上实现椭圆曲线上的点加运算与倍点运算,其采用优化点加与倍点算法实现群运算,调用有限域算法模块,输入参数为Montgomery域中元素,因而运算结果依然在Montgomery域中。
标量乘算法模块,用于实现所述椭圆曲线密码系统的核心运算:标量乘运算,其输入参数为素数域中元素,运算前转化为Montgomery域中,运算结果转化回素数域中。所述标量乘模块中的运算采用NAF随机标量乘算法。
NAF随机点标量乘算法原理是:NAF随机点标量乘算法首先对标量进行NAF编码,即标量k的NAF表示为
,其中ki∈{0,±1}并且相邻的ki中至少有一个为0。通过这种编码方式可以有效地计算标量乘,NAF标量乘算法期望的运行时间约为(m/3)A+mD,其中m=[log2p],A表示点加运算,D表示倍点运算。
DH密钥协商算法模块,用于调用标量乘算法模块,完成密钥协商。其输入参数为素数域中元素,运算前转化为Montgomery域中,运算结果转化回素数域中。
EC-Diffie-Hellman密钥协商是从一个主体的私钥和另一个主体的公钥导出一个共享的秘密值,此处两个主体具有相同的EC域参数。如果双方能够正确的执行完该协议,则他们将得到相同的结果。该算法可被一些方案调用以产生一个共享的秘密钥,其中,所输入的密钥是有效的。
数字签名与验证模块,用于调用标量乘算法模块,完成对消息的数字签名与验证过程。其输入参数为素数域中元素,运算前转化为Montgomery域中,运算结果转化回素数域中。
椭圆曲线数字签名与验证算法(Elliptic Curve Digital Signature Algorithm,ECDSA)是类似于DSA(Digital Signature Algorithm)的一种基于椭圆曲线的数字签名与验证算法,其不象一般的离散对数问题和整数分解问题,椭圆曲线离散对数问题没有亚指数算法,正由于这点,使得采用椭圆曲线离散对数的算法的每比特强度在实质上更强了。
ECDSA的主要参数包括:定义在有限域GF(p)上的椭圆曲线E,E上的GF(p)-有理点的个数#E(GF(p))可被一个大素数n整除,一个基点G∈E(GF(p)),可记为:D=(p,a,b,G,n,h),(d,Q),Hash函数H。
将D=(p,a,b,G,n,h),Hash函数H,Q公开,d保密。
在本实施例的椭圆曲线密码系统中,首先需要实现底层有限域中的各种基本的运算包括:加法运算、乘法运算、平方运算以及求逆运算;其次在有限域算法库的基础上实现椭圆曲线上的点加运算与倍点运算;最后实现椭圆曲线密码系统的核心运算:标量乘运算;通过调用标量乘算法模块,完成密钥协商;通过调用标量乘算法模块,完成对消息的数字签名与验证过程。
下面结合本发明的椭圆曲线密码系统,进一步详细描述本发明的椭圆曲线密码系统的实现方法,包括下列步骤:
(一)利用Montgomery算数实现大素数域中的加法运算、乘法运算、平方运算以及求逆运算。
这里的大素数域就是指的一般的素数域Fp,p是大于2的素数。
◆模加运算:
modadd算法:
输入:整数a,b∈[0,p-1],a=(at-1,at-2,…,a1,a0),b=(bt-1,bt-2,…,b1,b0)。
输出:c=a+b mod p。
1.c0←Add(a0,b0),//低32比特相加
2.For i from 1 to t-1 do:ci←Add(ai,bi)+carry(ai-1,bi-1).//a与b进行带进位的32比特加法
3.If c≥p,then c←c-p.//如果carry(at-1,bt-1)≠0,则最后的运算结果有进位执行减p运算
4.Return(c).//返回运算结果
其中,Add(ai,bi):=(ai+bi)mod232,carry(ai,bi):=(ai+bi)/232
◆模减运算:
modsub算法:
减运算和加运算是非常类似的,不同的是它要用到借位。
输入:整数a,b∈[0,p-1],a=(at-1,at-2,…,a1,a0),b=(bt-1,bt-2,…,b1,b0)。
输出:c=a-b mod p。
1.borrow←0.//初始化将借位borrow赋予0
2.For i from 0 to t-1 do://a与b进行带进位的32比特加法
2.1. ci←(ai-bi-borrow)mod232 //32比特减法运算结果
2.2. Ifai-bi-borrow≥0,then borrow←0;otherwise borrow←1.//32比特减法结果为正则借位borrow为0,否则借位borrow为1
3.If borrow>0,then c←c+p.//如果运算最后还有借位则执行加p运算
4.Return(c).//返回运算结果
由于在modadd中用到了a-b(a≥b),这只是modsub的一个特殊情况,只须将上面算法中的第3步去掉即可。
◆模乘运算:
Montgomery乘法有多种实现方式,本实施例采用了最为有效的CIOS-Montgomery乘法算法(Coarsely Integrated Operand Scanning),该算法占用的资源最少,速度最快。
输入:整数a,b∈[0,p-1],a=(at-1,at-2,…,a1,a0),b=(bt-1,bt-2,…,b1,b0)。
输出:c=abR-1 mod p
1.For i from 0 to t-1 do:s[i]←0.//初始化存储运算结果的数组
s6←0,s7←0 //初始化临时变量
2.For i from 0 to t-1 do:
2.1. C←0.//初始化临时变量
2.2. Forj from 0 to t-1 do://a与b进行32比特乘法
计算(C,S)=s[j]+ajbi+C,//32比特乘法的中间结果
令t[j]←S.//存储32比特进位
2.3.(C,S)←s6+C,s6←S,s7←C.//存储最高位的运算结果
2.4.C←0,m=s[0]*p’[0]mod 232,(C,S)=s[0]+m*p[0].//对最低32比特进行归约
2.5.Forj form 1 to t-1 do://逐段归约
计算(C,S)=s[j]+m*p[j]+C,//32比特中间结果归约
令s[j-1]←S.//存储32比特进位
2.6.(C,S)←s6+C,s[t-1]←S,s6←s7+C //存储归约结果
3. If s6!=0 //有进位
3.1 C=1;//初始化临时变量
3.2 For i from 0 to t-1 do://逐段进行进位纠正
计算(C,S)=s[i]+~p[i]+C,//进位纠正
令s[i]←S.//存储32比特进位
4.Return((St-1,…,s1,s0)) //返回运算结果
这里C,S都是32比特的字,(C,S)是C,S的连接,它是64比特;
p’[0]=-p[0]-1 mod 232,其中p[0]是192比特素数p的最低32比特(最低的字)。
◆模平方运算:
Montgomery平方也有多种实现方式,本实施例采用了最为有效的SRCIL-Montgomery平方算法(Squaring Reduction with Inner Loop),该算法速度最快。
输入:整数a,b∈[0,p-1],a=(at-1,at-2,…,a1,a0)。
输出:c=a2R-1 mod p
1.For i from 0 to t-1 do:(s[2i+1],s[2i])←ai×ai;//计算第i段相乘结果
2.For i from 0 to t-1 do://对第1步运算结果进行归约
2.1 m=s[i]×p′[0]mod 232;//计算每段归约值
2.2 Forj from 0 to i do://逐段归约
(C,s[i+j])=s[i+j]+m×p[j]+C;//32比特中间结果归约
2.3 C1=0;C2=0;//初始化临时变量
2.4 Forj from i+1 to t-1 do://计算ai与aj的乘积并进行归约
2.4.1 slong=2×C1+C+s[i+j] //存储中间结果
2.4.2 (C1,S)=ai×aj;//计算ai与aj的乘积
2.4.3 (C,s[i+j]=slong+2×S;//与低段运算结果的进位相加
2.4.4 (C2,s[i+j]=m×p[j]+s[i+j]+C2.//32比特中间段归约
2.5 (prevcar,s[i+t])=C+2×C1+C2+s[i+t]+prevcar;//存储最高32比特
3.s[2t]=s[2t]+prevcar;//存储最高位的进位
4.For i from 0 to t-1 do:s[i]←s[i+t] //将运算结果移至低t个单元
5.If s[2t]!=0//若进位不等于0
1.1 C=1;//初始化临时变量
1.2 For i from 0 to t-1 do://逐段进行进位纠正
计算(C,S)=s[i]+~p[i]+C;//进位纠正
令s[i]←S.//存储32比特进位
6.Return((st-1,…,s1,s0)) //返回运算结果
其中,C,C1,C2,S都是32比特的字,(C,S)是C,S的连接,它是64比特;p’[0]=-p[0]-1 mod 232,其中p[0]是192比特素数p的最低32比特(最低的字)。
◆Montgomery模归约算法:
输入:c=(c2t-1,…,c1,c0)
输出:r=cR-1 mod p.
1.For i from 0 to t-1 do://归约
1.1 C=0;//初始化临时变量
1.2 m=ci*p’[0];//计算每段归约值
1.3 Forj from 0 to t-1 do://逐段归约
计算(C,S)=ci+j+m*p[j]+C;//32比特中间结果归约
1.4 (prevcar,s[i+t])=C+s[i+t]+prevcar;//存储最高32比特
2.For i from 0 to t-1 do:c[i]←c[i+t] //将运算结果移至低t个单元
3.If prevcar!=0 //若进位不等于0
3.1 C=1;//初始化临时变量
3.2 For i from 0 to t-1 do://逐段进行进位纠正
计算(C,S)=c[i]+~p[i]+C;//进位纠正
令r[i]←S //存储32比特进位
4.Return((rt-1,…,r1,r0)) //返回运算结果
◆Montgomery求逆算法:
考虑到利用硬件电路板上的Montgomery乘法器资源,因此本实施例考虑用费马小定理实现有限域中的求逆运算,即b=ap-2(mod p)。该算法在有Montgomery乘法器的硬件电路板上的执行时间约为二元扩展欧几里得(Euclid)算法执行时间的70%。
输入:整数a∈[0,p-1],a=(at-1,at-2,…,a1,a0)
输出:b=a-1 mod p.
1.
a=a·R mod p;//将a变换到Montgomery域
2.
x=1·R mod p;//将1变换到Montgomery域
3.For i from j-1 down to 0 do://计算模指数
3.1
x=MontMult(
x,
x);//模平方运算
3.2 If ei=1 then
x=MontMult(
x,
a);
//如果p-2的当前比特是1则执行模乘运算
4.Return b=MontMult(
x,1).//返回运算结果至素数域
◆除法:
有限域中的除法运算是乘法和求逆的组合,本领域普通技术人员能够根据本实施例中关于乘法与求逆的描述,实现本发明的除法运算,因此,在本实施例中不再详细描述。
(二)在利用Montgomery算数实现有限域算法的基础上实现椭圆曲线上的点加运算与倍点运算,本实施例采用优化的点加与倍点算法实现群运算,调用有限域算法模块,输入参数为Montgomery域中元素,因而运算结果依然在Montgomery域中。
对于群运算,本实施例对IEEEP1363标准中的点加以及倍点算法进行了优化,采用了与IEEEP1363标准(IEEEP1363标准的参考文献:IEEE std1363-2000:Standard specifications for public-key cryptography,2000,standards.ieee.org/catalog/oils/busarch.html)中不同的运算顺序,从而使得算法所需要的临时变量最少,优化算法如下:
◆点加(elliptic_add)
GF(p)上椭圆曲线y2=x3+ax+b的点加公式的Modified-Jacobian坐标形式是:
且
这里
H=U2-U1,T=S2-S1,X3=-H3-2U1H2+T2,Y3=-S1H3+T(U1H2-X3),Z3=Z1Z2H,
其算法如下:
输入:p,a,b,Qin=(X,Y,Z),P=(X2,Y2).
输出:Qout=(X,Y,Z,aZ4)=Qin+P.
1.If(P==O) //判断是否点P是无穷远点
aZ4=a*Z4 if necessary //需要时计算aZ4的值
return Qout //返回点加结果
2.If(Z==0) //判断是否点Qin是无穷远点
Qout=P //点加结果为P
return Qout //返回点加结果
3.aZ4=Z2 //计算Z2
4.T1=X2*aZ4 //计算U2=X2Z2
5.T1=T1-X //计算H=U2-U1
6.aZ4=Z*aZ4 //计算Z3
7.aZ4=Y2*aZ4 //计算Y2=Y2Z3
8.aZ4=aZ4-Y //计算T=S2-S1
9.Z=Z*T1 //计算Z3=ZH
10.If(T1==0) //如果U2=U1
If(aZ4==0) //如果P=Qin
Qout=P //初始化Qout
Double(Qout) //此时计算结果为2P
return Qout //返回点加结果
else //此时P=-Qin
Z=0 //此时计算结果为无穷远点
aZ4=0 //此时计算结果为无穷远点
return Qout //返回点加结果
11.
//计算H2
12.T1=T1*T2 //计算H3
13.Y=T1*Y //计算S1H3
14.T2=X*T2 //计算U1H2
15.X=(aZ4)2 //计算T2
16.X=X-T1 //计算T2-H3
17.X=X-T2 //计算T2-U1H2-H3
18.X=X-T2 //计算X3=T2-2U1H2-H3
19.T2=T2-X //计算U1H2-X3
20.T2=aZ4*T2 //计算T(U1H2-X3)
21.Y=T2-Y //计算Y3=T(U1H2-X3)-S1H3
22.aZ4=Z2 //计算Z2
23.aZ4=(aZ4)2 //计算Z4
24.If(a==p-3) //如果a=p-3
aZ4=0-3aZ4 //计算-3Z4
else
aZ4=a*aZ4 //计算aZ4
这个算法需要9次域乘法、5次域平方和2个临时变量。
◆倍点(elliptic_doubl)
GF(p)上椭圆曲线y2=x3+ax+b的倍点公式的Modified-Jacobian坐标形式是:
这里:
T=M2-2S,X3=T,Y3=M(S-T)-U,Z3=2Y1Z1,
其算法如下:
输入:p,a=-3,b,Qin=(X,Y,Z,aZ4).
输出:Qout=(X,Y,Z,aZ4)=2 Qin.
1.If(Z==0)return Qout //如果Qin是无穷远点输出结果
2.T1=2Y //计算2Y
3.Z=T1*Z //计算Z3=2YZ
4.Y=Y2 //计算Y2
5.T1=2X //计算2X
6.T1=2T1 //计算4X
7.T1=T1*Y //计算S=4XY2
8.T2=X2 //计算X2
9. X=2T2 //计算2X2
10.T2=X+T2 //计算3X2
11.T2=T2+aZ4 //计算M=3X2+aZ4
12.
//计算M2
13.X=X-T1 //计算M2-S
14.X=X-T1 //计算X3=T=M2-2S
15.T1=T1-X //计算S-T
16.T2=T2*T1 //计算M(S-T)
17.Y=2Y //计算2Y2
18.Y=Y2 //计算4Y4
19.Y=2Y //计算U=8Y4
20.T1=2Y //计算2U
21.aZ4=T1*aZ4 //计算2U(aZ4)
22.Y=T2-Y //计算Y3=M(S-T)-U
本实施例选取的a=p-3,上面算法仅需4次域乘法以及4次域平方。
(三)实现所述椭圆曲线密码系统的核心运算:标量乘运算,其输入参数为素数域中元素,运算前转化为Montgomery域中,运算结果转化回素数域中。所述标量乘模块中的运算采用NAF随机标量乘算法。
对于标量乘算法,考虑到硬件实现标量乘算法时是采用有限状态机对标量的状态进行编码的,因此为了减少有限状态机控制逻辑的复杂性以及存储空间的大小本实施例对标量进行了NAF编码并采用了下面的随机点标量乘算法,该算法无需进行预计算。
◆随机点标量乘
随机点标量乘算法对标量进行NAF(non-adjacent form)编码,下面将这一算法描述如下:
输入:整数
其中bi∈{0,1}且bl=bl+1=0,椭圆曲线上的点P
输出:椭圆曲线上的点Q,Q=kP
/*对标量进行NAF(non-adjacent form)编码:
其中ki∈{0,±1}*/
1.α←0 //初始化临时变量
2.For i from 0 to l do://NAF(non-adiacent form)编码
ki←bi+α-2β,//计算NAF编码并存储在ki中
α←β,
/*由标量的NAF表示计算标量乘*/
3.For i from l down to 0 do://计算标量乘
3.1.Q←2Q //倍点运算
3.2.If ki≠0 then://ki不为零时需要执行点加运算
If ki==1,then Q←Q+P;//ki=1时执行Q+P
Else Q←Q-P //ki=-1时执行Q+(-P)
Return(Q) //返回标量乘运算结果
(四)用于调用标量乘算法模块,完成对消息的数字签名与验证过程。其输入参数为素数域中元素,运算前转化为Montgomery域中,运算结果转化回素数域中。
DH密钥协商算法:
EC-Diffie-Hellman密钥协商是从一个主体的私钥和另一个主体的公钥导出一个共享的秘密值,此处两个主体具有相同的EC域参数。如果双方能够正确的执行完该协议,则他们将得到相同的结果。该算法可被一些方案调用以产生一个共享的秘密钥,其中,所输入的密钥是有效的。
输入:
——EC基本参数q,a,b,n和G以及相应的密钥s和W′(对于s和W′,基本参数应该一样)
——主体自己的私钥s
——另一主体的公钥W′
其中:私钥s,EC基本参数q,a,b,r和G,以及公钥W′是有效的;所有的密钥都和同一基本参数相关。
输出:导出的共享秘密值z∈GF(q);或者“error”
操作.共享的秘密值z必须按照以下步骤进行:
1.计算椭圆曲线点P=s W′.
2.如果P=O输出“error”并停止。
3.令z=xP,既点P的x坐标。
4.输出z作为共享的秘密钥。
(五)调用标量乘算法模块,完成对消息的数字签名与验证过程。其输入参数为素数域中元素,运算前转化为Montgomery域中,运算结果转化回素数域中。
椭圆曲线数字签名与验证算法(ECDSA):
ECDSA(Elliptic Curve Digital Signature Algorithm)是类似于DSA(DigitalSignature Algorithm)的一种基于椭圆曲线的数字签字与验证算法。不象一般的离散对数问题和整数分解问题,椭圆曲线离散对数问题没有亚指数算法,正由于这点,使得采用椭圆曲线离散对数的算法的每比特强度在实质上更强了。
ECDSA的主要参数包括:定义在有限域GF(p)上的椭圆曲线E,E上的GF(p)-有理点的个数#E(GF(p))可被一个大素数n整除,一个基点G∈E(GF(p))。我们可记为:D=(p,a,b,G,n,h),(d,Q),Hash函数H。
将D=(p,a,b,G,n,h),Hash函数H,Q公开,d保密。
◆签名生成:
签名者A利用上面的参数及公私钥对如下对一消息m进行签名:
1.随机或伪随机地选择一个整数
2.计算kG=(x1,y1),r=x1 mod n,如果r=0,则返回到1;
3.计算k-1 mod n;
4.计算e=H(m);
5.计算s=k-1(e+dr)mod n,如果s=0,则返回到1。
其中,(r,s)是A对消息m的签名。
◆签名验证:
验证者B如下验证(r,s)是A对消息m的签名:
1.验证r,s是[1,n-1]中的整数;
2.计算e=H(m);
3.计算w=s-1 mod n;
4.计算u1=ew mod n,u2=rw mod n;
5.计算X=uiG+u2Q=(x1,y1),如果X=O,则拒绝这个签名,否则,计算v=x1 mod n,当且仅当v=r时接受这个签名。
本发明提供了一种适合硬件实现的椭圆曲线密码系统及实现方法,其采用了Montgomery算数来实现大素数域中的各种运算,实现椭圆曲线密码系统的所需所有算数运算能够在Montgomery域中进行:模加/模减、模乘以及求逆运算,无需显示执行耗时的模归约运算,使其同时适合软件与硬件实现。
本实施例是为了使本领域普通技术人员理解而对本发明所进行的详细描述,但本领域普通技术人员可以想到,在不脱离本发明的权利要求所涵盖的范围内还可以做出其它的变化和修改,其均在本发明的保护范围内。