椭圆曲线密码学,简称ECC。是一种建立公开加密的算法,也就是非对称加密。和RSA类似。被公认在给定密钥长度下最安全的加密算法。应用范围很广,主要的三个技术TLS、PGP、SSH都在使用它,特别是以BTC为代表的数字货币。
椭圆曲线并不是我们高中时学习的椭圆形状,其名字的由来是应为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程。这里用来加密的 椭圆曲线的定义 是一个特殊情况。
椭圆曲线暂时可以简单的理解为:
其中:
a和b决定了曲线在坐标系的不同形状。举个例子:
当b=1,a的取值从2到-3时,曲线的形状如下:
特殊曲线:当a=b=0时(左),或a=-3,b=2时(右),这两条都不是符合标准的曲线。
数学上,群是指定义了二元操作运算并且用符号“+”表示的一个集合。则必须满足以下要求:
这样的群我们称之为阿贝尔群。另外阿贝尔群还应该满足交换律a+b=b+a
我们所熟知的在整数范围内的加法运算(Z,+)就是阿贝尔群
所以(Z,+)是一个阿贝尔群。
假设我们有这样一条椭圆曲线y^2=x^3-x,曲线上有两点P、Q,过P和Q做一条直线,交椭圆曲线于R'点,再过R'点做垂直于X轴的直线,交椭圆曲线于另一点R,我们定义P+Q=R。
当P=Q时候,则是过P点的切线交于椭圆曲线于R',此时R=2P,如图所示:
当有k个相同的点P相加时,记做kP,如:P+P+P=2P+P=3P,如图:
椭圆曲线密码利用上述“运算”中的“椭圆曲线上的离散多数问题”,就像RSA利用“大数质因数分解”一样。
离散对数问题:
已知:
求:
这里需要说明一下,若果椭圆曲线上的一点P,存在最小正整数n使得数乘nP=0(无限原点),则称n是P的阶,若n不存在,则P是无限阶的。
也就是当给定点P时,我们已知数x求xG是非常简单的,但反过来已知xG求x就非常困难了,利用离散度数就可以保证椭圆曲线密码的安全性。
我们知道椭圆曲线是连续的,并不适合加密;所以我们需要把椭圆曲线定义在有限域上的,把它变成离散的点。
有限域Fp是指对于某个给定的质数P,由0,1,2,3.....P-1组成的P个元素所组成的整数集合中定义的加减乘除运算。
比如当椭圆曲线位于有限域F23上时,记做:
可以理解为左侧的值和右侧的值除以23的余数相等,此时的函数图像如图所示:
如果我们已知曲线上的一点P(3,10),依照加法运算的规则计算2P,3P....结果如图所示:
当我们已知P(3,10),Q(9,7),求-P,P+Q,2P时,计算过程如下所示:
考虑K=kG ,其中K、G为椭圆曲线Ep(a,b)上的点,n为G的阶(nG=O∞ ),k为小于n的整数。则给定k和G,根据加法法则,计算K很容易但反过来,给定K和G,求k就非常困难。因为实际使用中的ECC原则上把p取得相当大,n也相当大,要把n个解点逐一算出来列成上表是不可能的。其中G称为基点,k为私钥,K为公钥。
加密过程如下:
即是ECDSA。
这里我们依然假设私钥、公钥分别为k,K。其中K=kG,G为基点。
hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s = r(h+xk)G / (h+kx) = rG
这里关键的一点是引入了随机数r,提高了签名的安全性,即使同一条消息,只要改变随机数r,所得到的签名也会随之改变。