椭圆曲线密码算法概述

4,464 阅读10分钟

椭圆曲线密码算法

椭圆曲线密码算法(Elliptic Curve Cryptography,ECC)是基于椭圆曲线数学的一种公钥密码算法,其安全性依赖于椭圆曲线离散对数问题的困难性。

下面这3篇文章详细讲述了椭圆曲线密码算法的数学原理,不过是英文版的,但是讲述的非常详细,需要掌握的相关数学概念也讲述的很清楚。

andrea.corbellini.name/2015/05/17/…
andrea.corbellini.name/2015/05/23/…
andrea.corbellini.name/2015/05/30/…

下面这2篇是上面文章的翻译:

blog.csdn.net/mrpre/artic…
blog.csdn.net/mrpre/artic…

椭圆曲线密码算法优点

  • 短的密钥长度,意味着小的带宽和存储要求。
  • 所有的用户可以选择同一基域上的不同的椭圆曲线,可使所有的用户使用同样的操作完成域运算。

椭圆曲线定义

p是一个大于3的素数,在有限域F_p上的椭圆曲线y^2=x^3+ax+b由一个基于同余式y^2=x^3+ax+b \ mod \ p的解集(x,y)\in F_p\times F_p和一个无穷远点的特定点O组成,这里a,b \in F_p是满足4a^3+27b^2 \neq 0 \ mod \ p的常数。

下图是显示了其中一种实际的椭圆曲线:

这里写图片描述

对椭圆曲线上的点,我们可以定义一种形式的加法:如果椭圆曲线上的三个点位于同一直线上,那么它们的和为O(无穷远点)。

根据上面的定义导出椭圆曲线上的加法运算法则如下: 当P \neq Q时:

这里写图片描述

P=Q时:

这里写图片描述

下面的动画解释了为什么是切线:

这里写图片描述
随着两个点越来越接近,过这两点的直线最终变成了曲线的切线

上面用几何的形式解释了椭圆曲线上的加法法则,下面是数学表达式。设P_1=(x_1,y_1)P_2=(x_2,y_2)为椭圆曲线上的两个点,加减法运算如下:
1) -O=O
2) -P_1=(x_1,-y_1)
3) O+P_1=P_1
4) 若P_2=-P_1,则P_1+P_2=O
5) 若P_2 \neq  -P_1,则P_1+P_2=(x_3,y_3),其中x_3=m^2-x_1-x_2-y_3=m(x_3-x_1)+y_1

这里写图片描述

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

给定椭圆曲线上的点P和点Q,寻找数k,使得kP=Q,其中k称为Q的基于P的离散对数。

在等式kP=P+P+\dots +P=Q中,已知k和点P,求点Q比较容易,反之已知点Q和点P,求k却是相当苦难的,这个问题称为椭圆曲线上点群的离散对数问题。椭圆曲线密码体制正是利用这个困难问题设计的。在实际应用中,k作为私钥,而Q作为公钥。

如何计算kP=P+P+\dots +P=Q

用这种形式表示时,计算kP似乎需要k次加法运算。如果kn个二进制位,那么算法的时间复杂度将为O(2^n),这真不是很好。存在一些更快的算法。其中一种是“加倍(double)与相加(add)”算法。计算的原理可以用一个例子来更好地解释。取n = 151。它的二进制表示形式为10010111_2 。这一二进制表示形式可以转换为一系列2的幂之和。

(取k的 每个二进制位上的数字,并用它乘以一个2的幂.) 用这种方法,我们可以将k这样写:

“加倍(double)与相加(add)”算法需要这样做: • 取P. • 加倍,得到2P. • 2PP相加(为了得到 2^1P + 2^0P). • 加倍 2P,得到2^2 P. • 与前一结果相加 (得到 2^2P + 2^1P + 2^0P). • 加倍 2^2P,得到2^3P. • 对2^3P不做任何操作. • 加倍2^3P,得到2^4P. • 与前一结果相加 (得到 2^4P + 2^2P + 2^1P + 2^0P). • … 最后,我们可以计算151 • P,只需7次“加倍”运算和4次“相加”运算。

secp256k1椭圆曲线

在比特币区块链实现中使用的椭圆曲线为secp256k1。所以这里需要学习一下。 secp256k1曲线形如y^2=x^3+ax+b,由六元组D=(p,a,b,G,n,h)定义,其中: p=FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F
= 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1 a = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 b = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000007 The base point G in compressed form is(压缩形式表示的基点G定义): G = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 and in uncompressed form is(非压缩形式表示): G = 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8 Finally the order n of G and the cofactor are(G的阶、协因子):

G的阶:n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141 协因子:h = 01 secp256k1椭圆曲线形状如下:

这里写图片描述
This is a graph of secp256k1's elliptic curve y^2 = x^3 + 7 over the real numbers. Note that because secp256k1 is actually defined over the field Z_p, its graph will in reality look like random scattered points, not anything like this. 详细参考:en.bitcoin.it/wiki/Secp25…

椭圆曲线参数 六元组解释: 我们的椭圆曲线算法是工作在循环子群上的。几个参数含义如下:
(1)素数p,这个值定义了有限域的大小
(2)椭圆曲线的系数ab
(3)基点G(子群的生成元)
(4)子群的阶n
(5)协因子h (h = N/n)

补充数学概念

这里所用到的密码学其数学基础主要是《数论》、《代数》。如果想要弄清其原理,这两部分数学基础是需要研读的。

同余式

数学上,同余(congruence modulo,符号:≡)是数论中的一种等价关系。当两个整数除以同一个正整数,若得相同余数,则二整数同余。同余是抽象代数中的同余关系的原型。

两个整数a,b,若它们除以正整数m所得到的余数相等,则称a,b对于模m同余,记作a \equiv b (mod \ m)。读作ab关于模m同余。(例 26 \equiv 14 (mod \  12))。同余式的其他详细参考:zh.wikipedia.org/wiki/同餘

密码学与有限循环群

现代密码学算法和协议中,消息是作为有限空间中的数字或元素来处理的。加密和解密的各种操作必须在消息之间进行变换,以使变换服从有限消息空间内部的封闭性。然而,数的一般运算诸如加减乘除并不满足有限空间内部的封闭性。所以密码算法通常运行于具有某些保持封闭性的代数结构的空间中,这种代数结构就是有限循环群。在数学中,群是一种代数结构,由一个集合以及一个二元运算组成。群必须满足以下四个条件:封闭性,结合律,存在单位元和存在逆元。

群(Group)的定义: 设G是一个非空集合,对于G中的任意两个元素a,b,乘法运算满足以下条件,那么G称为一个群:
(1). 对于G中任意元素a,b,c,有a(bc)=(ab)c.
(2). 在G中存在一个元素e,它对G中任意元素aea=a.(有单位元)
(3). 对于G中任意元素a,都存在G中一个元素b使的ba=e.(有逆)

最常见的群之一是整数集Z以及加法操作。

这里写图片描述

有限循环群在群的基础上满足两个额外条件:群元素个数有限以及交换律。循环群由单个元素(产生元)的叠加操作生成,最常见的有限循环群为模拟时钟。

这里写图片描述

椭圆曲线群定义

在数学上,椭圆曲线群的元素为椭圆曲线上的点,群操作为”+”,”+”的定义为,给定曲线两点PQP+Q等于PQ两点的连线与曲线交点沿X轴的对称点,如果P=Q,则P+P等于P在曲线上的切线与曲线交点沿X轴的对称点。该群的单位元为无穷远零点记作O=(0,0),有P+O=P,点P的逆元为其沿X轴的对称点,记作-P

椭圆曲线有限循环群

前面介绍的椭圆曲线都是基于有理数的,但是计算机运算浮点数(小数)的速度较慢,更重要的是四舍五入浮点数会产生误差,导致多次加密解密操作后原始消息不能被还原。故考虑到加密算法的可实现性,密码学上使用基于整数的模加运算产生椭圆曲线有限循环群。 基于整数的模加运算的特点:

  • 运算速度快
  • 精确的运算结果
  • 产生有限循环

下面举例说明,如何产生ECC有限循环群: 例如考虑y^2=x^3-7x+10 (mod \ 19)的集合,该集合中所有的元素如下图所示。模运算把发散的椭圆曲线映射到19*19的正方形空间中,并且保持了原有曲线的上下对称特性。

这里写图片描述
下图展示了y^2=x^3-7x+10(mod \ 19)集合中的元素和椭圆曲线的关系。 点Q’映射到点Q,点P的对称点也由点-P’映射到点-P
这里写图片描述
如果取一个更大的质数p进行模运算,集合中的元素点也会相应地增多。下图展示了利用同一个曲线方程进行不同模运算的结果。在实际的椭圆曲线加密算法中,使用长度为192-256位的质数p进行模运算。
这里写图片描述

现在我们基于y^2=x^3-7x+10(mod \ 19),利用产生元P=(2,2)来生成ECC有限循环群。如下图所示。

这里写图片描述
G=\{ nP|P=(2,2)\}完整的集合为{p=(2,2),2P=(13,8),3P=(1,2),4P=(16,17),5P=(10,3),6P=(18,15),7P=(3,15),8P=(12,1),9P=(9,12),10P=(5,10),11P=(17,15),12P=(7,0),13P=(17,4),14P=(5,9),15P=(9,7),16P=(12,18),17P=(3,4),18P=(18,4),19P=(10,16),20P=(16,2),21P=(1,17),22P=(13,11),23P=(2,17),24P=O=(0,0)}。

如下图所示,随着n的连续增加,元素点的分布没有任何特征,这正是密码学需要的特性。

这里写图片描述

可参考:mp.weixin.qq.com/s/jOcVk7olB…

椭圆曲线的阶

椭圆曲线定义在有限域上,这也意味着,椭圆曲线上的点也是有限的。所以引出了一个问题:一个椭圆曲线到底有多少个点?定义“椭圆曲线上点的个数”为 椭圆曲线的 阶 (order)。至于怎么计算阶参考这篇文章吧: en.wikipedia.org/wiki/Schoof…

椭圆曲线的数乘和循环子群

在实数域,数乘(标量乘法)被定义如下:

这里写图片描述
如何计算及算法复杂度,上面有讲过,这里讲述它的一个性质。举例说明: 椭圆曲线y^2 \equiv x^3+2x+3 \ (mod \ 97),点P=(3,6)。现在计算P的数乘。
这里写图片描述
上图可以化为下图的表示形式:
这里写图片描述
结果显示点P的倍数的结果只有出现5个点,其他的点从未出现;其次他们是周期出现的。 显然,上面的5个点的集合,运算是封闭的。 当然,不仅仅P有这样的性质,其他点也有类似的性质。 即,P的加法构成了一个群S,由于S属于G,故SG的子群。 循环子群是ECC的基础。

子群的阶
  1. 首先,我们已经定义了阶就是群中点的个数。在子群中也是这样的,但是我们可以换一种表达方式:子群的阶是最小能够使得nP=0n
  2. 子群的阶和群的阶是有关系的。拉格朗日定理说明了,子群的阶是群的阶的因子。即如果N是群的阶,则其子群的阶n,则nN的因子(n is a diviser of N)。

找到子群的阶的方法(根据上面讲述的定义和性质就能得出下面的方法):
(1)计算群的阶N
(2)找出所有N的因子
(3)每个N的因子n,然后乘以P
(4)在3中,找出最小的n,使得满足nP = 0。则n是子群的阶。

如何找一个基点

在ECC算法种,我们希望找到一个阶数较大的子群。 通常我们会选择一个椭圆曲线,然后计算它的阶N,选择一个较大的因子n,然后找一个合适的基点。也就是说,我们不是首先找一个基点,然后计算它的阶,而是相反,我们先找到一个合适的阶,然后找以这个数为阶的子群的生成元。

首先,拉格朗日揭示,h = N/n是一个整数(当然,nN的因子),h有一个自己的名字:cofactor of the subgroup(协因子)。

其次,每个椭圆曲线上的点PNP = 0,因为NP的阶n的倍数。 我们可以写成这样 n(hP) = 0。 假设n是一个素数,我们令G= hP,则G就是子群的生成元。 n必须是素数,若非如此,则nP = 0不一定表示nP的阶,因为P的阶可能是n的一个因子。 总结如下:

  1. 计算椭圆曲线的阶N
  2. 选择一个数n当成子群的阶。n应该是N的素因数
  3. 计算h = N/n
  4. 随机选择一个点P
  5. 计算G = hP
  6. 如果G0,到第4步。否则,我们找到了这个基点。