前言和RSA(三个天才的名字:罗恩里维斯特、阿迪萨莫尔和莱恩阿德曼)一样,ECC(椭圆曲线密码)也是一种公钥算法。目前国内详细介绍ECC的公开文献并不多(反正我也没找到)。有一些介绍,也是泛泛而谈。看完他们,我还是不能理解ECC的本质(可能是我的理解能力太差了)。前几天从国外网站找到一些资料。看完他们,我好像对ECC一无所知。所以我想整理一下我对ECC的理解,分享给大家。当然,ECC博大精深,我的理解还很肤浅。这篇文章一定有很多错误。欢迎各路专家批评指正。我洗耳恭听,及时纠正。文章会连载,写好之后我会发一点。本文主要以理论为主,暂时不涉及代码实现。这就需要你有一点数学知识。最好你能懂RSA算法,对公钥算法有了解。《近世代数基础》 《初等数论》书,你最好先看完,对你理解这篇文章有帮助。不要害怕,我会尽我所能让这种语言流行起来。希望这篇文章能成为学习ECC的敲门砖。
首先,从平行线开始。
平行线永不相交。没有人怀疑:)但是到了现代,这个结论受到了质疑。平行线会在很远很远的地方相交吗?其实没人见过。所以“平行线永不相交”只是一个假设(大家想想初中学习的平行公理,不证明)。既然可以假设平行线从不相交,也可以假设平行线在很远很远的地方相交。即平行线相交于无穷远点P处(请闭上眼睛想象无穷远点P和P是否是虚幻的。其实数学锻炼的是人的想象力而不是抽象能力)。给个图帮助你理解:

直线上P点的出现,好处是所有直线相交且只有一个交点。这样就统一了直线的平行和相交。为了区别于无穷远,原平面上的点称为普通点蓑衣网小编2022。
下面是无穷的一些性质。
直线l上只能有一个无穷远点(从定义上可以直接画出来)平面上的一组平行直线有一个共同的无穷远点。(从定义上可以直接画出来)平面上任意两条相交的直线L1和L2都有不同的无穷远点。(否则,L1和L2有一个共同的无穷远点P,那么L1和L2有两个交点A和P,所以假设是错误的。)平面上所有的无穷多个点组成一条无限长的直线。(自己想象一下这条直线)平面上所有无穷远点和所有普通点构成一个射影平面。
二、射影平面坐标系
射影平面坐标系是普通平面直角坐标系(也就是我们初中学过的笛卡尔平面直角坐标系)的延伸。我们知道普通的平面直角坐标系是不为无穷远设计坐标的,不能表示无穷远。为了表示无穷远处的点,产生了射影平面坐标系。当然,射影平面坐标系也可以很好地表示旧的普通点(数学也是“向后兼容”)。

我们对普通平面直角坐标系中A点的坐标(X,y)做如下改变:设x=X/Z,y=y/Z(Z0);那么a点可以表示为(X:Y:Z)。它变成了一个带三个参数的坐标点,为平面上的点建立了一个新的坐标系。
例2.1:求点(1,2)在新坐标系中的坐标。解:X/Z=1,Y/Z=2(Z0)X=Z,Y=2Z 坐标为(Z:2Z:Z),Z0。即(1:2:1)(2:4:2)(1.2:2.4:1.2)等(Z:2Z:Z)和Z0形式的坐标在新坐标系中都是(1,2)。
我们也可以由cZ=0得到方程aX(想想为什么?提示:普通平面直角坐标系中直线的一般方程是ax乘c=0)。新坐标系能代表无穷大吗?好吧,我们先想想无穷在哪里。根据上一节的知识,我们知道无穷是两条平行直线的交点。
那么,如何求两条直线交点的坐标呢?这是初中的知识,就是同时解两条直线对应的方程组。平行直线的方程是:ax乘c1z=0;aX乘以c2Z=0?(C1C2);(为什么蓑衣网小编2022?提示:可以考虑斜率,因为平行线的斜率是一样的);
两个方程同时求解。有c2Z=c1Z=-(aX bY),C1C2?Z=0?aX乘=0;所以无穷远处的点用这种形式表示(x: y: 0)。注意普通点Z0,无穷远点Z=0,那么无穷远直线对应的方程就是Z=0。
例2.2:求平行线L1: X2Y3Z=0与L2: X2YZ=0相交的无穷远点。解:因为L1L2有Z=0,X2y=0;所以坐标是(-2Y:Y:0),Y0。也就是说,(-2:1:0)(-4:2:0)(-2.4:1.2:0)等坐标以(-2Y:Y:0)和Y0的形式都表示这个无穷远点。
似乎这个新坐标系可以表示射影平面上的所有点,所以我们把这个可以表示射影平面上所有点的坐标系叫做射影平面坐标系。
练习:1。求点A(2,4)在射影平面坐标系中的坐标。2.求该点在射影平面坐标系和普通平面直角坐标系中的坐标(4.5:3:0.5)。3.求直线X Y Z=0上无穷远点的坐标。4.判断:直线aX bY=0上无穷远处的点和直线aX bY=0的交点是同一点吗?
三。椭圆曲线
上一节我们建立了射影平面坐标系。在这一节中,我们将建立这个坐标系中的椭圆曲线方程。因为我们知道坐标中的曲线可以用一个方程来表示(比如单位圆的方程是x2 y2=1)。椭圆曲线是曲线,自然椭圆曲线也有方程。
椭圆曲线的定义:一条椭圆曲线在射影平面上满足方程Y2Z a1XYZ a3YZ2=X3 a2X2Z a4XZ2 a6Z3?——3354——[3-1]所有点的集合,并且曲线上的每一点都是非奇异的(或光滑的)。
详细定义:
Y2Z a1XYZ a3YZ2?=X3 a2X2Z a4XZ2 a6Z3是维尔斯特拉斯方程(Wilstrass,卡尔西奥多威廉维尔斯特拉斯,1815-1897),这是一个齐次方程。
椭圆曲线的形状不是椭圆。只是因为描述椭圆曲线的方程类似于计算椭圆周长的方程(我没见过计算椭圆周长的方程),椭圆线(设密度为1)的积分无法求解。蓑衣网小编2022谁知道这个方程,请告诉我啊_),因此得名。
我们来看看椭圆曲线是什么样子的。
数学上所谓的“非奇异”或“光滑”是指曲线上任意一点的偏导数Fx(x,y,z),Fy(x,y,z),Fz(x,y,z)不能。如果没学过高等数学,可以这样理解这个词,即在任意一点都有一条切线满足方程。
下面两个方程都不是椭圆曲线,虽然它们都是方程[3-1]的形式。


因为它们在点(0:0:1)即原点没有切线。
椭圆曲线上有一个无穷远点O(0:1:0),因为这个点满足方程[3-1]。
知道椭圆曲线上的无穷远点。我们可以把椭圆曲线放在普通的平面直角坐标系上。因为普通平面直角坐标系只是无限小于射影平面坐标系。在普通平面直角坐标系中,找到椭圆曲线上所有普通点组成的曲线方程,加上无穷远点O(0:1:0)形成椭圆曲线。
我们假设x=X/Z,y=Y/Z代入方程[3-1],我们得到:Y2A1XA3Y=X3x2xA4XA6?——3——333——3354-[3-2]
也就是说,满足方程[3-2]的光滑曲线加上一个无穷远点O构成椭圆曲线。为了便于操作、表达和理解,今后椭圆曲线的讨论将主要采用[3-2]的形式。
在这一节的最后,我们来谈谈求椭圆曲线的切斜率。从椭圆曲线的定义可以知道,椭圆曲线是光滑的,所以椭圆曲线上所有的普通点都有切线。切线最重要的参数是斜率K.
例3.1:求椭圆曲线上普通点A(x,y)的切线的斜率k方程y 2 a1 xa 3y=xa 2 x2 a4 a6。
解法:设f (x,y)=Y2A1XA3Y-X3-A2X2-A4X-A6求偏导数FX (x,y)=A1Y-3x2-2X2-A4FY (x,y)=2YAA1XA3,则导数为:f' (x)=-FX (x,y)。y)=-(A1y-3 x2-2A2x-A4)/(2 a1xa 3)=(3 x2 a2 xa 4-A1y)/(2 a1xa 3)所以k=(3x2a2xa4-A1y)/(2A1xa3)?——3——333——【3-3】不理解解题过程没关系,记住结论就好【3-3】。
练习:1。将给出图例的椭圆曲线方程Y2Z=X3-XZ2。和Y2Z=X3 XZ2 Z3转换成公共平面直角坐标系中的方程。
第四,椭圆曲线上的加法
上一节我们已经看到了椭圆曲线的图像,但是点与点之间似乎没有联系。能否在实数轴上建立类似加法的算法?天才数学家找到了这个算法。自从近百年来代数引入群、环、域的概念以来,代数运算达到了高度的统一。比如数学家总结了普通加法的主要特征,提出了加法群(也叫交换群或阿贝尔(Abel)群)。实数的加法和椭圆曲线的加法没有区别。这可能是数学上的抽象:)。群和加群的具体概念,请参考近世代数的数学书籍。算法:任意取椭圆曲线上的两点P、Q(若P、Q两点重合,则作P点的切线)使直线与椭圆曲线的另一点R’相交,平行线穿过R’使Y轴与R相交.我们规定p q=R .(如图)
?
定律详解:这里的不是实数中的普通加法,而是从普通加法中抽象出来的加法。它具有普通加法的一些性质,但具体算法明显不同于普通加法。
根据这个规律可以知道,椭圆曲线的无穷远点o 与椭圆曲线上的一点P的连线与P’相交,Y轴穿过P’的平行线与P相交,所以有一个无穷远点o p=p,这样,无穷远点O的作用就相当于普通加法中0的作用(0 ^ 2=2),我们称无穷远点O为?零元。同时我们称P’为P的负元素(简称负P;写下来,-P)。(见下图)
根据这个规律,我们可以得出如下结论:如果一条椭圆曲线上的三个点A、B、C在同一条直线上,那么它们的和等于零,即ABC=O
K个相同的点P相加。如下图:P P P=2P P=3P。
接下来我们用点P和Q的坐标(x1,y1)和(x2,y2)求R=P Q的坐标(x4,y4)例4.1:求椭圆曲线方程y2 a1 xa 3y=xa 2 x2 a4 a6上普通点P(x1,y1),Q(x2,y2)和R(x4,y4)之和的坐标。解法:(1)先求点-R(x3,y3)。因为p,q和-r共线,设共线性方程为y=kx b,其中如果p q (p和q不重合),直线的斜率为k=(y1-y2)/(x1-x2)如果p=q. -a1y) /(2y a1x a3)
因此,p,q和-r的坐标值为方程:Y2A1xyA3y=X3a2xa4x6?———— ——[ 1]y=(kx b)??——3354-[2]的解。
将[2]代入[1]你有(kxb)2a1x(kxb)a3(kxb)=x3 a2 x2 a4x 6?——-[3]将[3]转化为一般方程。根据三次方程的根与系数的关系(当三次项的系数为1;-x1x2x3?等于常数项系数,X1X2X3x3x1等于线性项系数,(x1 x2 x3)等于二次项系数。)So-(x1x2x 3)=A2-KA1-k2x 3=k2 ka 1a 2x 1 x 2;———————求点-R的横坐标,因为k=(y1-y3)/(x1-x3),y3=y1-k(x1-x3);——————333——-求点的纵坐标
-R(2)用-R求R显然有x4=x3=k2 ka1 a2 x1 x2——3354求点R和y3的横坐标?y4?当x=x4时,方程Y2 a1 xa 3Y=xa 2 x2 a4 a6解为一般方程Y2(a1xa 3)Y-(xa 2 x2 a4 a6)=0,根据二次方程的根与系数的关系,为:-(a1x a3)=y3 y4,所以Y4=-Y3-(A1XA3)=K (X1-X4)-Y1。———— ——求R点的纵坐标,即x4=k2 ka1 a2 x1 x2y4=k(x1-x4)-y1-a1 x4-a3;
在这一节的最后,我要提醒你,之前提供的图片可能会给你一种椭圆曲线关于X轴对称的错觉。其实椭圆曲线不一定是关于x轴对称的。
Y2-xy=x3 1
五、密码学中的椭圆曲线
现在我们基本上对椭圆曲线有了初步的了解,这是可喜的。但请注意,前面学的椭圆曲线是连续的,不适合加密;因此,我们必须把椭圆曲线变成离散的点。我们来想一想,为什么椭圆曲线是连续的?因为椭圆曲线上的点的坐标是实数(也就是说上面说的椭圆曲线是在实数域上定义的),所以实数是连续的,这就导致了曲线的连续性。所以我们要把椭圆曲线定义在有限域上(顾名思义,有限域就是只由有限个元素组成的域)。场的概念是从有理数和实数的运算中抽象出来的。严格的定义请参考近世代数的书籍。简单来说,一个域中的元素和有理数一样,有自己的加、乘、除、单位元素(1)和零元素(0),满足交换率和分配率。接下来,我们给出一个有限域Fp,它只有有限个元素。只有p(p是质数)个元素0,1,2.外交人员中的P-2、P-1;Fp?加法的规则(a b)是abc(mod p);即(a c)p的余数与c p的余数相同,Fp?的乘法(ab)法则是什么?abc(mod p);Fp?什么是除法(ab)法则?a/bc(mod p);也就是ab-1c?(mod p);(b-1也是0-p-1之间的整数,但满足bb-11(mod p);具体解法可以参考初等数。论,或我的另一篇文章)。Fp?的单位元是1,零元是 0。同时,并不是所有的椭圆曲线都适合加密。y2=x3+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类。下面我们就把y2=x3+ax+b 这条曲线定义在Fp上:选择两个满足下列条件的小于p(p为素数)的非负整数a、b4a3+27b2≠0 (mod p)则满足下列方程的所有点(x,y),再加上 无穷远点O∞ ,构成一条椭圆曲线。y2=x3+ax+b ?(mod p)其中 x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。我们看一下y2=x3+x+1 ?(mod 23)的图像
是不是觉得不可思议?椭圆曲线,怎么变成了这般模样,成了一个一个离散的点?椭圆曲线在不同的数域中会呈现出不同的样子,但其本质仍是一条椭圆曲线。举一个不太恰当的例子,好比是水,在常温下,是液体;到了零下,水就变成冰,成了固体;而温度上升到一百度,水又变成了水蒸气。但其本质仍是H2O。
Fp上的椭圆曲线同样有加法,但已经不能给以几何意义的解释。不过,加法法则和实数域上的差不多,请读者自行对比。1 无穷远点 O∞是零元,有O∞+ O∞= O∞,O∞+P=P2 P(x,y)的负元是 (x,-y),有P+(-P)= O∞3 P(x1,y1),Q(x2,y2)的和R(x3,y3) 有如下关系:x3≡k2-x1-x2(mod p)y3≡k(x1-x3)-y1(mod p)其中若P=Q 则 k=(3x2+a)/2y1??若P≠Q,则k=(y2-y1)/(x2-x1)例5.1 已知E23(1,1)上两点P(3,10),Q(9,7),求1)-P,2)P+Q,3) 2P。解 1) ?–P的值为(3,-10)2) ?k=(7-10)/(9-3)=-1/2,2的乘法逆元为12 因为2*12≡1 (mod 23)k≡-1*12 (mod 23) 故 k=11。x=112-3-9=109≡17 (mod 23);y=11[3-(-6)]-10=89≡20 (mod 23)故P+Q的坐标为(17,20)3) ?k=[3(32)+1]/(2*10)=1/4≡6 (mod 23)x=62-3-3=30≡20 (mod 23)y=6(3-7)-10=-34≡12 (mod 23)故2P的坐标为(7,12)最后,我们讲一下椭圆曲线上的点的阶。如果椭圆曲线上一点P,存在最小的正整数n,使得数乘nP=O∞,则将n称为P的?阶,若n不存在,我们说P是无限阶的。事实上,在有限域上定义的椭圆曲线上所有的点的阶n都是存在的(证明,请参考近世代数方面的书)
练习:1 求出E11(1,6)上所有的点。2 已知E11(1,6)上一点G(2,7),求2G到13G所有的值。
六、椭圆曲线上简单的加密/解密
公开密钥算法总是要基于一个数学上的难题。比如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
现在我们描述一个利用椭圆曲线进行加密通信的过程:1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。2、用户A选择一个私有密钥k,并生成公开密钥K=kG。3、用户A将Ep(a,b)和点K,G传给用户B。4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r(r在这个加密通信中,如果有一个偷窥者H ,他只能看到Ep(a,b)、K、G、C1、C2?而通过K、G 求k 或通过C2、G求r 都是相对困难的。因此,H无法得到A、B间传送的明文信息。密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:T=(p,a,b,G,n,h)。(p 、a 、b 用来确定一条椭圆曲线,G为基点,n为点G的阶,h 是椭圆曲线上所有点的个数m与n相除的整数部分)
这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;2、p≠n×h;3、pt≠1 (mod n),1≤t<20;4、4a3+27b2≠0 (mod p);5、n 为素数;6、h≤4。七、椭圆曲线在软件注册保护的应用我们知道将公开密钥算法作为软件注册算法的好处是Cracker很难通过跟踪验证算法得到注册机。下面,将简介一种利用Fp(a,b)椭圆曲线进行软件注册的方法。软件作者按如下方法制作注册机(也可称为签名过程)1、选择一条椭圆曲线Ep(a,b),和基点G;2、选择私有密钥k(k软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K)1、从用户输入的序列号中,提取sn以及Hash;2、计算点R≡sn*G+Hash*K ( mod p ),如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y)的坐标,因为sn≡r-Hash*k (mod n)所以sn*G + Hash*K=(r-Hash*k)*G+Hash*K=rG-Hash*kG+Hash*K=rG- Hash*K+ Hash*K=rG=R ;3、将用户名和点R的坐标值x,y作为参数,计算H=SHA(username,x,y);4、如果H=Hash 则注册成功。如果H≠Hash ,则注册失败(为什么?提示注意点R与Hash的关联性)。简单对比一下两个过程:作者签名用到了:椭圆曲线Ep(a,b),基点G,私有密钥k,及随机数r。软件验证用到了:椭圆曲线Ep(a,b),基点G,公开密钥K。Cracker要想制作注册机,只能通过软件中的Ep(a,b),点G,公开密钥K ,并利用K=kG这个关系获得k后,才可以。而求k是很困难的。练习:下面也是一种常于软件保护的注册算法,请认真阅读,并试回答签名过程与验证过程都用到了那些参数,Cracker想制作注册机,应该怎么样做。软件作者按如下方法制作注册机(也可称为签名过程)1、选择一条椭圆曲线Ep(a,b),和基点G;2、选择私有密钥k(k软件验证过程如下:(软件中存有椭圆曲线Ep(a,b),和基点G,公开密钥K)1、从用户输入的序列号中,提取sn以及x’;2、将用户名作为参数,计算Hash=SHA(username);3、计算 R=(Hash*G+x’*K)/sn,如果sn、Hash正确,其值等于软件作者签名过程中点R(x,y),因为sn≡(Hash+x’*k)/r (mod n)所以(Hash*G+x’*K)/sn=(Hash*G+x’*K)/[(Hash+x’*k)/r]=(Hash*G+x’*K)/[(Hash*G+x’*k*G)/(rG)]=rG*[(Hash*G+x’*K)/(Hash*G+x’*K)]=rG=R (mod p)4、v≡x (mod n)5、如果v=x’ 则注册成功。如果v≠x’ ,则注册失败。八、结语历经半个多月断断续续的写作,这篇拙作终于算告一段落了。为写这篇文章,我查了大量的资料,但为了使文章更通俗易懂,我尽量避免涉及专业术语,F2n域上的椭圆曲线本文也没有涉及。不过,一些名词描述的可能还不太精确,希望众读者对文章的问题,多多批评指正。我也仅仅把这篇文章作为初稿,我会不断修订他的。最后感谢看雪、Sunbird、CCG以及看雪论坛所有成员对我的支持,感谢一切帮助过我的人,没有你们的鼓励,这篇文章我是没有动力写完的,谢谢,谢谢大家!2003-5-3 初稿,于看雪论坛2004-7-11二稿,修正一张图片———————–作者 ?:ZMWorm[CCG]E-Mail:zmworm@sohu.com主页 ?:Http://ZMWorm.Yeah.Net/主要参考文献张禾瑞,《近世代数基础》,高等教育出版社,1978闵嗣鹤 严士健,《初等数论》,高等教育出版社,1982段云所,《网络信息安全》第三讲,北大计算机系Michael Rosing ,chapter5《Implementing Elliptic Curve Cryptography》,Softbound,1998《SEC 1: Elliptic Curve Cryptography》,Certicom Corp.,2000《IEEE P1363a / D9》,2001