椭圆曲线数字签名算法(ECDSA)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线对数字签名算法(DSA)的模拟。
ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准。
它在1998年既已为ISO所接受,并且包含它的其他一些标准亦在ISO的考虑之中。
与普通的离散对数问题(discrete logarithm problem DLP)和大数分解问题(integer factorization problem IFP)不同,椭圆曲线离散对数问题(elliptic curve discrete logarithm problem ECDLP)没有亚指数时间的解决方法。
因此椭圆曲线密码的单位比特强度要高于其他公钥体制。
本文将详细论述ANSIX9.62标准及其协议,安全,实现,互操作性方面的问题。
1、介绍
数字签名算法(DSA)在联邦信息处理标准FIPS中有详细论述,称为数字签名标准。
它的安全性基于素域上的离散对数问题。
椭圆曲线密码(ECC)由Neal Koblitz和Victor Miller 于1985年发明。
它可以看作是椭圆曲线对先前基于离散对数问题(DLP)的密码系统的模拟,只是群元素由素域中的元素数换为有限域上的椭圆曲线上的点。
椭圆曲线密码体制的安全性基于椭圆曲线离散对数问题(ECDLP)的难解性。
椭圆曲线离散对数问题远难于离散对数问题,椭圆曲线密码系统的单位比特强度要远高于传统的离散对数系统。
因此在使用较短的密钥的情况下,ECC可以达到于DL系统相同的安全级别。
这带来的好处就是计算参数更小,密钥更短,运算速度更快,签名也更加短小。
因此椭圆曲线密码尤其适用于处理能力、存储空间、带宽及功耗受限的场合。
ECDSA是椭圆曲线对DSA的模拟。
ECDSA首先由Scott和Vanstone在1992年为了响应NIST对数字签名标准(DSS)的要求而提出。
ECDSA于1998年作为ISO标准被采纳,在1999年作为ANSI标准被采纳,并于2000年成为IEEE和FIPS标准。
包含它的其他一些标准亦在ISO的考虑之中。
本文中我们将介绍ANSI X9.62标准。
也将介绍一些签名的基础知识以及协议、安全性、实现、互操作性方面的问题。
本文其他部分的安排如下:
第二节中我们将回顾数字签名方案和DSA,
第三节和第四节将分别介绍有限域和椭圆曲线,
第五节将讲述域参数的产生和参数有效性的验证,
第六节将讲述密钥对的产生和公钥有效性的验证,
第七节的内容是ECDSA的签名和验证过程。
第八章论证ECDSA的安全性,
第九节和第十节讲述的是ECDSA协议和实现方面的问题。
2、数字签名方案
2.1背景知识
数字签名的目的是提供一个手写签名的数字化副本。
签名是一个依赖于签名者私钥和被签名一段消息的比特串。
签名必须是可验证的,即如果对签名的真实性存在疑问,必须由一个中立的第三方作出公正的裁决,并且无需知道签名者的私钥。
对签名的抵赖以及伪造签名应该能被发现。
本文论述的是非对称摘要数字签名。
“非对称”即用户的密钥对各不相同。
用户的私钥用于签名,其他用户用他的公钥来检验签名的真实性。
摘要是指对一段消息先用哈希函数进行摘要计算,尔后再对消息摘要进行签名,而不是消息。
安全性:
从理论上讲,在选择消息攻击下,数字签名应该是不可伪造的。
这一概念由Goldwasser,Micali和Rivest提出。
更一般的讲就是攻击者获得用户A的摘要和签名,但他无法用其他的摘要来伪造这样一个签名。
应用:
数字签名方案用于以下一些用途:数据完整性(确保数据没有被未知或未授权的中间人改变),数据源认证(确保数据的来源是可信的),不可否认性(确保用户不能对自己的行为进行抵赖)。
数字签名是密码学协议的基本组成部分,并且可以提供其他一些服务如:身份认证(FIPS 196,ISO/IEC 9798-3),密钥传递前的认证(ANSI X9.63,ISO/IEC 11770-3),经验证的密钥协商(ISO/IEC 11770-3)。
分类:
数字签名方案可以根据所基于的数学难题进行分类:
1、基于大整数分解(IF)的方案,安全性基于大整数分解的难度。
实例有RSA方案和Rabin 方案。
2、基于离散对数(DL)的方案,安全性基于有限域上普通的离散对数问题。
实例包ElGamal,Schnorr,DSA和Nyberg-Rueppel方案。
3、基于椭圆曲线(EC)的方案,安全性基于椭圆曲线离散对数问题。
2.2数字签名算法
DSA于1991年由NIST提出,并在FIPS186中得到确认。
DSA可以看作是ElGamal签名方案的一个变形。
其安全性建立在素域上的离散对数问题的困难性之上。
DSA参数的产生:
每个用户的安全参数产生如下:
1、选择160比特的素数q和1024比特的素数p,满足 。
2、在有限域中寻找q阶循环子群的生成元g,具体方法是在选取元素h计算g=
mod p,当g≠1时即找到满足要求的g。
3、域参数就是p,q和g。
DSA密钥对的产生:
每个拥有域参数p,q和g进行如下操作:
1、选择随机或伪随机数x满足1<x<p-1。
2、计算。
3、用户的私钥是x,公钥是y。
DSA签名过程:
1、选择随机或伪随机数k满足1<k<p-1。
2、计算,若r=0则返回第一步。
K-1
3、计算。
4、计算e=SHA-1(m)。
5、计算,若s=0则返回第一步。
6、对消息m的签名就是(r,s)。
DSA签名的验证:
为了验证(r,s)是对m的签名,需要使用签名者的域参数(p,q,g)和公钥y进行如下运算:
1、验证r,s在区间[1,q-1]中。
2、计算e=SHA-1(m)。
3、计算。
4、计算和
5、计算及。
6、如果则认可此签名。
安全性分析:
由于r和s均小于q,故DSA签名长度小于320比特。
DSA的安全性依赖于两个方面,它们都基于离散对数问题的难解性,一个是Zp*上的离散对数问题,目前已有数域筛算法去加以解决,这是一种亚指数级的算法。
其平均运算时间为:
其中c约为1.923,若p是1024比特的素数,则上式的计算量是无法接受的。
因此目前1024比特的DSA可以应付现有攻击。
另一个是q阶子群上的离散对数问题,给定p,q,g和y,
,要寻找x,目前最好的算法是Pollard’s Rho算法,大约要做步。
若q是160比特的,则该算法在计算上不可行,因此DSA是很安全的。
DSA的安全性主要取决于p和q的尺寸。
增加其中一个的尺寸而不增加另一个的尺寸对安全性的提高并无益处。
此外,对两种离散对数问题解决算法的提高都会削弱DSA。
安全参数的产生:
DSA的早期版本受到了一些批评,因此FIPS186推出了一种新模式以产生素数p和q以及“可证明的随机性”。
它可以防止用户故意构造一个利于破译的素数(例如可以由CA来产生域参数并发送给用户)。
FIPS指定了两个模式,分别使用SHA-1和DES,产生伪随机私钥x。
FIPS186指定使用这两种模式以及其他经过FIPS认可的安全模式。
3、有限域
我们将简要介绍有限域的知识,更多详细内容请参看其他书籍。
有限域由一个有限集合F
和F上的两个二元运算组成,这两个运算满足某种运算规则,分别称为加法和乘法。
有限域的阶即域中元素的个数。
当仅当q是素数的幂次时存在一个q阶有限域,这个有限域是唯一
的,记作。
有很多方法可以描述的元素,有些描述方式可以使域上的软件及硬件运算
更加高效。
若q=pm,其中p为素数,m为正整数,则p称为的特征,m称为的度。
至于椭圆曲线密码,一般基于素域或是多项式域。
在3.1和3.2中我们将分别介绍这两种有限域上的元素和运算以及多项式域的两种表示方法:多项式表示方法和正规基表示方法。
3.1有限域Fp
P为素数,有限域称为素域,由整数集{1,2,……,p-1}和其上的符合下列规则的运算组成:
1、加法。
a,b∈p,a+b=r,r为a与b的和模p所得的值。
2、乘法。
a,b∈p,a*b=s,s为a与b的积模p所得的值。
3、求逆运算。
a是中的非零元素,a的逆是唯一的,记作,有
例1.,全部元素为{1,2,……,22},其上三种运算:12+20=9,8*9=3,8-1=3。
3.2有限域
称之为特征为2的有限域或者一个二进制有限域,可以看做是上的m维向量空间。
中存在m个不同的元素,任一个ß∈均可写为以下形式:
集合{}称为在上的基。
有这样一个基,域中所有元素就可以用一个比特串(a0,a1,……am-1)来表示。
这样,加法就可以用向量的逐比特异或运算来表示,乘法运算则依赖于基的选择。
基的选择方式是多种多样的。
一些基可以使运算变得高效。
ANSI X9.62给出了两种基,分别是多项式基和正规基。
多项式基
是上的m次本原多项式,那么f(x)定义了一个多项式基。
域元素
有限域由上的所有不多于m次的多项式组成。
域元素可以写为比特串形式。
因此的元素可以写为长度为m的比特串。
乘法单位元是(0,0,…,0,1),加法零元是全零串(0,0,……,0)。
域运算:
加法:
乘法:
求逆运算:
选择不可约多项式
ANSI X9.62的两条标准如下:
1.如果在上有m次三项本原多项式,则模多项式应在这些多项式中选取k最小的那个。
2.若不存在那样的多项式,则f(x)应为m次5项本原多项式。
这时有三条原则:(1)应尽量小。
(2)确定时k2应尽量小。
(3),确定时,应尽量小。
正规基表示
的正规基有着如下形式:。
正规基总是存在的。
任何元
素,能够写成如下的形式:。
正规基表示使得元素的平方运算效率很高。
另一方面,不同元素的乘积通常来说会显得效率很低。
因此,ANSI X9.62采用了高斯正规基,它的乘法运算更简单和有效率。
高斯正规基
正规基的T值表示正规基乘法运算的复杂度。
通常来说,T值越小,表示乘法运算更有效。
给定m,T,,至多有一个GNB的T值为T。
高斯正规基的存在性
高斯正规基总是存在的,当m不能被8整除。
一个Type 为T的高斯正规基存在的充分必要条件:p是素数且p=Tm+1,(Tm/k,m)=1 其中k为在模p下乘法阶为2.
域元素
域中的任意元素a可以表示为:.故有:。
零元素表示为0=(0,0,...0),乘法单位元表示1=(1,1,...,1).
域运算
加法与多项式基表示类似。
平方运算就是对向量表示的域元素做一次简单循环移位。
乘法运算
p=Tm+1,,阶为T。
定义序列
T为偶数和奇数的两种情况。
求逆运算跟多项式基表示类似。
高斯正规基的选取
ANSI X9.62给定了下列原则:
1.如果存在Type值为2的,必须使用。
2.如果不存在Type值为2的,若存在Type值为1的,必须使用。
3.如果上面两个条件都不满足,则选择Type值最小的高斯正规基
5、ECDSA域参数
ECDSA的域参数包括一条合适的椭圆曲线和其上一个基点G。
域参数可以全局公开,也可以只对单个用户公开。
5.1部分讲述域参数应该满足的要求,5.2部分讲解如何产生随机曲线,5.3部分介绍了一种产生域参数的方法,5.4部分给出了验证域参数是否符合要求的方法。
5.1域参数
为了提高实现效率,基域尺寸和参数的选择都有限制:另外,为了抵抗已知的攻击方式,曲线的选择和基点的阶都有一定的限制。
对域的要求
基域的阶要么q等于p,要么等于。
前者模一个大素数p,后者模一个多项式或正规基。
对曲线的要求
为了抵抗Pollard’s rho和Pohlig Hellman攻击。
E上的点的个数应能被一个大素数n整除。
ANSI X9.62规定n应大于和。
应选择E使得为素数或近似素数。
定义辅因子,其中n为素数,h非常小。
选择曲线时应注意的一些其他事项
为了抵抗MOV和FR攻击,曲线应是非超奇异(即要求p不能整除)的。
更一般的,应当满足n不能整除,1≤k≤C,一般取C为20。
最后,为了抵抗SSSA
对反常曲线的攻击,不得取反常曲线(即不得等于q)。
为了抵御上面提到的和将来可能出现的对这些特殊曲线的攻击,应使用随机方式选取一条椭
圆曲线满足能被一个大素数整除,满足上述一系列条件的随机曲线不甚可能被这些攻击方式所攻破。
可以使用随机数发生器(如SHA-1一类的单向函数)来产生曲线的系数。
5.2中介绍了一种类似FIPS-186的模式以产生随机曲线。
域参数的概述
1.域尺寸q,q=p或。
2.域的表示方法FR和其中元素的表示方法。
3.至少160比特长度的随机比特串。
4.两个域参数a和b。
5.基点G(xG,yG)。
6.点G的阶n>160bit,n>4sqrt(q)。
7.辅因子。
5.2用随机方法产生椭圆曲线
本节讲述如何用随机方法产生椭圆曲线。
随机参数使用SHA-1来产生。
使用这种方法产生的椭圆曲线具有良好的随机性,可以避免性质较差的曲线的产生。
q=p的情况
下面要使用到这些参数:
算法1.产生一条随机椭圆曲线。
输入:域尺寸p。
输出:至少160比特的比特串,参数a,b,它们确定了一条Fp上的椭圆曲线。
1.选择一个长度g大于160比特的随机比特串SeedE。
2.计算H=SHA-1(SeedE),c0表示H的右起v长比特串。
3.W0是H的左起v长比特串。
4.z是比特串SeedE所表示的整数。
5.for i from 1 to s do
(1)是的比特串。
(2)计算Wi=SHA-1()。
6.W是比特串W0||W1||……||Ws。
7.r是比特串W所表示的整数。
8.若r=0或4r+27=0 modp则返回第一步。
9.选择随机整数a,b∈Fp,不能同时为0,要求(可以让a,b同时为r)。
10.选定的曲线为。
11.输出SeedE,a,b。
上的椭圆曲线同构类
两条定义在上的椭圆曲线E1:和E2:在上同构的
充要条件是存在u∈使得(同构的椭圆曲线可以认为是相同的,若
E1同构于E2,则E1()同构于E2())。
若E1同构于E2且b1不为0,则有。
奇异椭圆曲线:曲线E:,4a*a*a+27b*b=0 modp,要么是a,b同时为0,要么是a*a*a/b*b=-27/4。
若r∈Fp,r≠0,r≠-27/4,则存在两个曲线同构
群E: ,a*a*a/b*b=r modp。
算法1的第9步中(a,b)就只有两种选择。
第8步中的限制条件确保曲线不是异常曲线。
另外我们注意到算法1产生的曲线不会发生a,b有
一个为0而另一个不为0的情况,这无关紧要因为这些曲线只是所有曲线中微不足道的一部分,任何算法都不可能完全随机地来产生曲线。
上的扭曲线
两条非同构曲线:E1: ,E2: y2=x3+ac2x+bc3,c∈,是一个非模p二次
剩余,则称E1,E2相互扭转。
它们的r是相等的。
它们的阶满足:#E1()+ #E2()=2p+2,若能计算出其中一条曲线的阶,另一条曲线的阶可轻易得出。
算法2.证明一条曲线是在上随机产生的。
输入:域尺寸p,长度g≥160bit的比特串SeedE,域参数a,b。
1.计算H=SHA-1(SeedE),c0是H的右起v长比特串。
2. W0是H的左起v长比特串。
3. z是比特串SeedE所表示的整数。
4. for i from 1 to s do
(1)是的比特串。
(2)计算Wi=SHA-1()。
5. W是比特串W0||W1||……||Ws。
6. r是比特串W所表示的整数。
7. 验证是否成立,成立则接受,反之则拒绝。
q=的情况
下面要使用到这些参数:
算法3:产生上的一条随机椭圆曲线。
输入:域尺寸。
输出:至少160比特的比特串,参数a,b,它们确定了一条上的椭圆曲线。
1. 选择一个长度g大于160比特的随机比特串SeedE。
2. 计算H=SHA-1(SeedE),b0表示H的右起v长比特串。
3. z是比特串SeedE所表示的整数。
4. for i from 1 to s do
(1)是的比特串。
(2)计算bi=SHA-1()。
5. b是比特串b0||b1||……||bs。
6.若b=0则返回第一步。
7.a是上的随机数。
8.上的椭圆曲线E:。
9.输出SeedE,a,b。
上的椭圆曲线同构类
上的两条曲线E1: ,E2: 在上同构的充要条件是b1= b2且TR(a1)= TR(a2),TR(ß)= ß +ß2+ ß4+……+ ß2^(m-1)。
同构的椭圆曲线可以认为是相同的,若E1同构于E2,则E1()同构于E2()。
下面是F2m上的一个
典型的椭圆曲线同构类{ |b∈,b≠0,a∈{0, ß }},其中ß∈,是一个满足TR(ß)=1的固定元素(若m是奇数,则令ß=1)。
因此对于已经选定的b,算法3中的步骤7中a只有两种选择。
上的扭曲线
两条不同构的曲线E1: ,E2: ,b1= b2=b,
TR(a1)≠TR(a2),则这两条曲线互称为扭曲线。
它们的阶满足#E1()+ #E2()=2p+2,
若能计算出其中一条曲线的阶,另一条曲线的阶可轻易得出。
上的椭圆曲线的阶总是偶
数,若TR(a1)=0,则#E1()=0 mod4,若TR(a1)=1,则#E1()=2 mod4。
算法4. 证明一条曲线是在F2m上随机产生的。
输入:域尺寸,长度g≥160bit的比特串SeedE,域参数a,b。
输出:判断算法3产生的曲线是否是随机的。
1. 计算H=SHA-1(SeedE),b0表示H的右起v长比特串。
2. z是比特串SeedE所表示的整数。
3. for i from 1 to s do
(1)是的比特串。
(2)计算bi=SHA-1()。
4. b’是比特串b0||b1||……||bs。
5.若b=b’,则接受反之则拒绝。
5.3域参数的产生
下面是产生安全参数的方法:
1.利用算法1或算法3产生曲线E:或。
2.计算。
3.验证N是否有一个长度大于160bit且大于的因子n,若没有,则返回第一步。
4.验证n是否能整除(1≤k≤20),若能,则返回第一步。
5.验证n是否等于q,若等于,则返回第一步。
6.随机选择点,计算,重复这一步,直至G≠O,G就是基点。
曲线阶的计算
1985年Schoof提出了一个多项式时间的算法以计算素域上椭圆曲线的阶,后来Koblitz使其也能用于。
在q较大时Schoof的算法效率较低。
经过若干年的改进,形成了Schoof-Elkies-Atkin算法,即SEA算法(算法细节详见其他资料)。
有了SEA算法,在工作站上用若干个小时就可以产生大约200bit左右尺寸的随机曲线。
Satoh提出了针对上曲线的新算法,在一台高速PC上若干秒就可以产生一条大约200bit尺寸的曲线。
复乘模式(CM)
该方法首先选择一个满足安全性约束的阶N,然后构造阶为N的椭圆曲线。
对于素域上的椭圆曲线,CM方法又称Atkin-Morain方法;对于二进制域称为 Lay-Zimmer方法。
对于阶为q的有限域,选择椭圆曲线的秩N=q+1-t,使得复乘法域的类数目很小,这时CM方法是很有效的。
在工作站上1分钟内就能生成160比特域上适合密码学用途的曲线。
特别是Cm 方法比最好的对素域和OEF上随机选择的椭圆曲线点的计数算法还要快得多。
对于二进制域上的椭圆曲线,已经有比CM方法更快的点的计数算法。
Koblitz曲线
这种曲线是多项式域上的一种反常曲线,首先由Koblitz提出。
这种曲线定义在上,而它的系数在F2中取值。
因此有两种Koblitz曲线:和。
Koblitz曲线上的标量乘法效率很高。
Koblitz 曲线在ECDSA中的应用前景广阔。
5.4域参数的验证
域参数的验证确保选定的域参数具有必须的算术性质。
这一步骤的必要性包括两点:(1)防止攻击者利用较弱的参数进行攻击。
(2)防止在传递参数时出现偶然的编码或传输错误。
使用较弱的参数将达不到安全要求。
验证域参数的方法
判断D={q,FR,a,b,G,n,h}是否合用可使用下面之一的算法:
1.使用算法5进行验证。
2.D是由一个可靠的系统产生的。
3.D由可靠的组织提供且经过算法5验证。
4. D由可靠的组织提供且由一个可靠的系统产生的。
算法5.椭圆曲线域参数的验证。
输入:D={q,FR,a,b,G,n,h}。
输出:判断参数是否合乎要求。
1.验证q=p或。
2.验证FR是合乎要求的。
3.验证G≠O。
4.验证a,b,xG,yG在p或模多项式所规定的范围内。
5.若随机曲线是用户自己用5.2的算法1或算法3产生的,验证a,b确由SeedE生成。
6.q=p时,验证;q=时,验证b≠0。
7.将G代人曲线方程,证明其确在曲线上。
8.验证n是素数。
9.验证n>且n>4sqrt(q)。
10.验证nG=O。
11.计算,验证h=h’。
12.验证n不整除(1≤k≤20)。
13.验证n≠q。
14.通过上述验证的D才是合格的。
求椭圆曲线的阶
由 Hasse定理可知。
由于 n>4sqrt(q),故n不可能整除#E(Fq),因此E(Fq)只有一个n阶子群。
另外由于存在唯一整数h使,即。
算法5的9,10,11步就是验证nh=#E(Fq)。
正如5.2所指出的,计算椭圆曲线的阶是件异常费时的工作。
实际应用中用户可以购买厂家的软件计算曲线的阶,不过这样的软件必须是经过认证的。
7、ECDSA签名的产生和认证
本节介绍ECDSA签名产生和认证的方法。
ECDSA签名的产生
有参数D={q,FR,a,b,G,n,h}和密钥对{d,Q}的用户A使用以下方法对消息m进行签名:
1.产生随机或伪随机数k,1≤k≤n-1。
2.计算。
3.计算,若r=0则返回第一步。
4.计算。
5.计算e=SHA-1(m)。
6.计算,若s=0则返回第一步。
7.对消息m的签名为(r,s)。
ECDSA签名的验证
为了验证A对消息m的签名(r,s),B需要A的公钥Q和A的公开参数D=(q,FR,a,b,G,n,h)。
B最好对D和Q也进行确认(见5.4和6.2)。
B进行如下操作:
1.验证r和s在区间[1,n-1]中。
2.计算e=SHA-1(m)。
3.计算。
4.计算。
5.计算。
6.若X=O,则签名非法,x1为X的x坐标,v=x1 mod n。
7.若v=r则接受签名。
签名验证的根据
若对消息m的签名(r,s)确为A所为,则。
将其化简可得:。
因此
,因此v=r时认可签名。
数据类型的转换
ANSI X9.62规定了一个将域参数转换为整数的规则,它用在产生签名的第二步和验证签名的第六步,在计算x1 modn之前将x1转换为整数。
ANSI X9.62也规定了一个将比特串转换为整数的规则,它用于将SHA-1产生的比特串转换为整数。
公钥证书
在验证A的签名之前B需要一份A的公开参数D和公钥Q的副本,ANSI X9.62对此未作详细说明。
实践中可靠的公钥一般由证书来分配。
A的公钥证书应包括能唯一标识他的信息(如姓名,住址等),公开参数D,公钥Q,以及CA对这些信息的签名。
B可以利用CA对A的证书来可靠地获得A的公开参数D和公钥Q的副本。
在签名验证中对r和s进行验证的基本原理
在签名验证的第1步中验证r和s是否在区间[1,n-1]中,这一操作是高效且极有必要的,ElGamal签名方案不进行这一操作,有一些攻击方法可以利用这一点进行攻击。
下面是一个
在ECDSA不验证r≠0 modn时可以采用的攻击方式,A使用Fp上的椭圆曲线:
,b是模p的二次剩余,并且假设A使用的基点是G(0,sqrt(b))(这是有可能的,用户可能会选择一个x坐标为0的点作为基点,这样可以使参数组D变得短小),攻击者可以对任意消息m伪造A的签名,签名是(r=0,s=e)。
DSA和ECDSA的比较
单从概念上讲,ECDSA和DSA的区别仅在于DSA的子群是Zp*上由g上生成的,而ECDSA的子群是椭圆曲线点群上由G生成的。
在实现上,ECDSA和DSA的唯一重要区别是r的产生,
DSA的r是通过计算,而ECDSA的r是取kG的x坐标而来。
8、安全方面的考虑
ECDSA在安全性方面的目标是能抵抗选择明文(密文)攻击。
而攻击A的攻击者的目标是在截获A的签名后,可以生成对任何消息的合法签名。
尽管ECDSA的理论模型很坚固,但是人们仍研究很多措施以提高ECDSA的安全性。
在ECDLP不可破解及哈希函数足够强的前提下,DSA和ECDSA的一些变形已被证明可以抵抗现有的任何选择明文(密文)攻击。
在椭圆曲线所在群是一般群并且哈希函数能够抗碰撞攻击的前提下,ECDSA本身的安全性已经得到证明。
ECDSA可能面临的攻击:
1.对ECDLP的攻击。
2.对哈希函数的攻击。
3.其他攻击。
本阶将介绍目前对ECDSA的攻击方式及防御它们的方法。
8.1椭圆曲线离散对数问题
若攻击者能由A的公钥和公开参数计算出A的私钥,则攻击者就可以随心所欲地伪造A的签名。
问题的定义。
椭圆曲线离散对数问题(ECDLP):一条定义在有限域Fq上的椭圆曲线E,E(F q)上的一个n阶点P,Q=LP,1≤L≤n-1,求L。
已知的攻击
这一部分将介绍一些已知的对ECDLP的攻击方式,并将论证它们在实际中是不可行的。
1.穷尽搜索法。
依次计算P,2P,3P,4P……直到与Q匹配为止,最差情况下要作n次。
2.Pohlig-Hellman算法。
该算法由Pohlig和Hellman发明,利用P的阶n的因子分解。
该算法将模n条件下求l的问题转化为求模每个n的因子条件下求l的问题。
利用中国剩余定理即可求得l。
为了抵抗这种攻击,椭圆曲线的阶应被一大素数n整除,或者曲线的阶就是素数或近乎是一个素数(即由一个大素数和一个小整数相乘而来)。
在本节的剩余部分我们假定曲线的阶是素数。
3.小步-大步算法。
该算法是一种需要很大存储空间的穷尽搜索算法,在最差情况下,需要存储sqrt(q)个点,运算sqrt(q)步。
4.Pollard’s Rho算法。
该算法由Pollard发明,这是小步-大步算法的一种随机化版本。
它大约需要sqrt(пn/2)步,但其所需要的存储空间几乎可以忽略不计。
Gallant, Lambert ,Vanstone和 Wiener,Zuccherato的文章向我们介绍了Pollard’s Rho 算法的改进。
改进后的算法效率提高了sqrt(2)倍,即算法只需sqrt(пn)/2步。
5.并行Pollard’s Rho算法。
Van Oorschot和Wiener的文章告诉我们在使用r个处理器并行运算时,Pollard’s Rho算法的时间复杂度为sqrt(пn)/2r,即使用r个处理器时,运算效率提高了r倍。
6.Pollard’s Lambda算法。
这也是小步-大步算法的一种随机化版本,在并行化时速度也有线性提高。
并行Pollard’s Lambda比并行Pollard’s Rho要略慢一些。
不过,如果已知离散对数在[0,b],b<0.39n时Pollard’s Lambda算法要快一些。
7.多重对数算法。
R.Silverman和Stapleton注意到若一个ECDLP被(并行)Pollard’s R ho算法解决,那么已进行的工作对解决另一个ECDLP(曲线和基点不变)大有好处。
更精确地说,若解决第一个ECDLP耗时t=sqrt(пn)/2r,则第二个耗时(sqrt(2)-1)t≈0.41t,第三个耗时需(sqrt(3)-sqrt(2)) ≈0.32t,第四个耗时(sqrt(4)-sqrt(3)) ≈0.27t……以此类推。
这样对于一条特定的曲线和一个特定的点,ECDLP会越来越易于解决。
从另一方面看,解决k个ECDLP(曲线和基点不变)只需sqrt(k)倍解决单个ECDLP所需代价。
这里的分析没有考虑存储方面的问题。
为了避免这种情况的出现,最好的办法就是使得密码系统足够强使得首次破解不可能。
8.超奇异椭圆曲线。
Menezes, Okamoto,Vanstone,Frey 和Ruck的研究表明,在某些适当的条件下,定义在有限域Fq上的椭圆曲线E上的ECDLP可以化为某个扩域Fqk(k≥1)上的普通乘法群上的DLP,从而可以使用数域筛法加以解决。
这样的转化算法只有在k较小时才有实用价值,因此对绝大多数椭圆曲线都不适用。
为了抵抗这种攻击方式,在选择安全曲线时必须检验基点P的阶n不整除qk-1,1≤k≤20。
这样可以使上述攻击方式在计算上不可行。
若E的迹t能够被Fq的特征p所整除,则称E是超奇异椭圆曲线。
对于这类曲线,它们的k≤6,使用上面的方法就可以产生解决ECDLP的亚指数算法。
因此ECDSA严禁使用超奇异椭圆曲线。
更一般地讲,在选择安全曲线时检验基点P的阶n不整除qk-1可以剔除那些可以将ECDLP 转化为Fq上的DLP的曲线,不仅包括超奇异椭圆曲线,也包括迹为2的椭圆曲线。
9.素域反常椭圆曲线。
定义在Fp上,且#E(Fp)=p的曲线称为素域反常曲线。
其上ECDLP存在高效攻击方式SSSA。
这种攻击方式不能用于其他曲线,因此只要确保#E(Fp)≠p即可使这种攻击无效。