椭圆曲线加密算法,即:Elliptic Curve Cryptography,简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密。 椭圆曲线在密码学中的使用,是1985年由Neal Koblitz和Victor Miller分别独立提出的。 ## 椭圆曲线 一般情况下,椭圆曲线可用下列方程式来表示,其中a,b,c,d为系数。 > E:y2=ax3+ bx2+cx+d 例如,当a=1,b=0,c=-2,d=4时,所得到的椭圆曲线为: > E:y2=x3-2x+4 ## 定义椭圆曲线的运算规则 ### 加法 过曲线上的两点A、B画一条直线,找到直线与椭圆曲线的交点,交点关于x轴对称位置的点,定义为A+B,即为加法。 ### 二倍运算 上述方法无法解释A + A,即两点重合的情况。因此在这种情况下,将椭圆曲线在A点的切线,与椭圆曲线的交点,交点关于x轴对称位置的点,定义为A + A,即2A,即为二倍运算。 ### 正负取反 将A关于x轴对称位置的点定义为-A,即椭圆曲线的正负取反运算。 ### 无穷远点 如果将A与-A相加,过A与-A的直线平行于y轴,可以认为直线与椭圆曲线相交于无穷远点。 综上,定义了A+B、2A运算,因此给定椭圆曲线的某一点G,可以求出2G、3G(即G + 2G)、4G......。即:当给定G点时,已知x,求xG点并不困难。反之,已知xG点,求x则非常困难。此即为椭圆曲线加密算法背后的数学原理。 ## 有限域上的椭圆曲线运算 椭圆曲线要形成一条光滑的曲线,要求x,y取值均为实数,即实数域上的椭圆曲线。但椭圆曲线加密算法,并非使用实数域,而是使用有限域。按数论定义,有限域GF(p)指给定某个质数p,由0、1、2......p-1共p个元素组成的整数集合中定义的加减乘除运算。 假设椭圆曲线为y² = x³ + x + 1,其在有限域GF(23)上时,写作:y² ≡ x³ + x + 1 (mod 23)此时,椭圆曲线不再是一条光滑曲线,而是一些不连续的点,如下图所示。以点(1,7)为例,7² ≡ 1³ + 1 + 1 ≡ 3 (mod 23)。如此还有如下点:(0,1) (0,22)  (1,7) (1,16)  (3,10) (3,13)  (4,0)  (5,4) (5,19)  (6,4) (6,19)  (7,11) (7,12)  (9,7) (9,16)  (11,3) (11,20)  等等。 另外,如果P(x,y)为椭圆曲线上的点,则-P即(x,-y)也为椭圆曲线上的点。如点P(0,1),-P=(0,-1)=(0,22)也为椭圆曲线上的点。 ## 生成密钥和地址 ​ 考虑一条椭圆曲线 $$ y^{2}=x^{3}+ax+b(mod\ p) $$ ,其上有点 G, G 的阶为 n 。任选整数 l