椭圆曲线加密和签名算法
简述
椭圆曲线密码学,简称ECC。是一种建立公开加密的算法,也就是非对称加密。和RSA类似。被公认在给定密钥长度下最安全的加密算法。应用范围很广,主要的三个技术TLS、PGP、SSH都在使用它,特别是以BTC为代表的数字货币。

椭圆曲线
椭圆曲线并不是我们高中时学习的椭圆形状,其名字的由来是应为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程。这里用来加密的 椭圆曲线的定义 是一个特殊情况。

椭圆曲线暂时可以简单的理解为:

其中:

a和b决定了曲线在坐标系的不同形状。举个例子:

当b=1,a的取值从2到-3时,曲线的形状如下:

特殊曲线:当a=b=0时(左),或a=-3,b=2时(右),这两条都不是符合标准的曲线。

阿贝尔群
数学上,群是指定义了二元操作运算并且用符号“+”表示的一个集合。则必须满足以下要求:

封闭性:如果a和b都是群成员,那么a+b也是群成员。
组合性:(a+b)+c=a+(b+c)
单位元:存在确切的一个值可以保证 a+0=0+a=a成立,我们称之为单位元
逆元:每个成员都有一个相反数:对于任意值a必定存在b使得a+b=0
这样的群我们称之为阿贝尔群。另外阿贝尔群还应该满足交换律a+b=b+a

我们所熟知的在整数范围内的加法运算(Z,+)就是阿贝尔群

封闭性:a、b属于整数,a+b也属于整数
组合性:(a+b)+c=a+(b+c)
单位元:0值就是单位元
逆元:a的逆元就是-a
所以(Z,+)是一个阿贝尔群。

椭圆曲线的加法
假设我们有这样一条椭圆曲线y2=x3-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利用“大数质因数分解”一样。

椭圆曲线上的离散对数问题
离散对数问题:

已知:

椭圆曲线E
椭圆曲线E上的一点G(基点)
椭圆曲线E上的一点xG(x倍的G)
求:

x
这里需要说明一下,若果椭圆曲线上的一点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时,计算过程如下所示:

椭圆曲线加密ECC
考虑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为公钥。

加密过程如下:

Alice选定一条椭圆曲线E,并取椭圆曲线上一点作为基点G 假设选定E29(4,20),基点G(13,23) , 基点G的阶数n=37
Alice选择一个私有密钥k(k<n),并生成公开密钥K=kG 比如25, K= kG = 25G = (14,6)
Alice将E和点K、G传给Bob
Bob收到信息后,将待传输的明文编码到上的一点M(编码方法略),并产生一个随机整数r(r<n,n为G的阶数) 假设r=6 要加密的信息为3,因为M也要在E29(4,20) 所以M=(3,28)
Bob计算点C1=M+rK和C2=rG C1= M+6K= M+625G=M+2G=(3,28)+(27,27)=(6,12) C2=6G=(5,7)
Bob将C1、C2传给Alice
Alice收到信息后,计算C1-kC2,结果就应该是点M C1-kC2 =(6,12)-25C2 =(6,12)-25*6G =(6,12)-2G =(6,12)-(27,27) =(6,12)+(27,2) =(3,28)
参数要求:
p越大安全性越好,但会导致计算速度变慢,200bit左右可满足一般安全要求
n应为质数
ECC VS RSA
优点:
安全性能更高
160位ECC与1024位RSA、DSA有相同的安全强度
处理速度更快
在私钥的处理速度上,ECC远 比RSA、DSA快得多
带宽要求更低
存储空间更小
ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多
缺点:
设计困难,实现复杂
如果序列号设计过短,那么安全性并没有想象中的完善
椭圆曲线签名算法
即是ECDSA。

这里我们依然假设私钥、公钥分别为k,K。其中K=kG,G为基点。

私钥签名:
Alice选择随机数r,计算点rG(x, y)。
Alice根据随机数r、消息M的哈希h、私钥k,计算s = (h + kx)/r。
Alice将消息M、和签名{rG, s}发给接收方。
公钥验证签名:
Bob收到消息M、以及签名{rG=(x,y), s}。
Bob根据消息M,求哈希h。
使用发送方公钥K计算:hG/s + xK/s,并与rG比较,如相等即验签成功。
验证原理
hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s = r(h+xk)G / (h+kx) = rG

这里关键的一点是引入了随机数r,提高了签名的安全性,即使同一条消息,只要改变随机数r,所得到的签名也会随之改变。