椭圆曲线密码算法
椭圆曲线密码算法(Elliptic Curve Cryptography,ECC)是基于椭圆曲线数学的一种公钥密码算法,其安全性依赖于椭圆曲线离散对数问题的困难性。
下面这3篇文章详细讲述了椭圆曲线密码算法的数学原理,不过是英文版的,但是讲述的非常详细,需要掌握的相关数学概念也讲述的很清楚。
andrea.corbellini.name/2015/05/17/…
andrea.corbellini.name/2015/05/23/…
andrea.corbellini.name/2015/05/30/…
下面这2篇是上面文章的翻译:
椭圆曲线密码算法优点
- 短的密钥长度,意味着小的带宽和存储要求。
- 所有的用户可以选择同一基域上的不同的椭圆曲线,可使所有的用户使用同样的操作完成域运算。
椭圆曲线定义
设是一个大于3的素数,在有限域
上的椭圆曲线
由一个基于同余式
的解集
和一个无穷远点的特定点
组成,这里
是满足
的常数。
下图是显示了其中一种实际的椭圆曲线:
对椭圆曲线上的点,我们可以定义一种形式的加法:如果椭圆曲线上的三个点位于同一直线上,那么它们的和为(无穷远点)。
根据上面的定义导出椭圆曲线上的加法运算法则如下:
当时:
当时:
下面的动画解释了为什么是切线:
上面用几何的形式解释了椭圆曲线上的加法法则,下面是数学表达式。设与
为椭圆曲线上的两个点,加减法运算如下:
1)
2)
3)
4) 若,则
5) 若,则
,其中
,
,
椭圆曲线上点群的离散对数问题
给定椭圆曲线上的点和点
,寻找数
,使得
,其中
称为
的基于
的离散对数。
在等式中,已知
和点
,求点
比较容易,反之已知点
和点
,求
却是相当苦难的,这个问题称为椭圆曲线上点群的离散对数问题。椭圆曲线密码体制正是利用这个困难问题设计的。在实际应用中,
作为私钥,而
作为公钥。
如何计算
用这种形式表示时,计算似乎需要
次加法运算。如果
有
个二进制位,那么算法的时间复杂度将为
,这真不是很好。存在一些更快的算法。其中一种是“加倍(double)与相加(add)”算法。计算的原理可以用一个例子来更好地解释。取
。它的二进制表示形式为
。这一二进制表示形式可以转换为一系列
的幂之和。
(取的 每个二进制位上的数字,并用它乘以一个
的幂.)
用这种方法,我们可以将
这样写:
“加倍(double)与相加(add)”算法需要这样做:
• 取.
• 加倍,得到
.
•
与
相加(为了得到
).
• 加倍
,得到
.
• 与前一结果相加 (得到
).
• 加倍
,得到
.
• 对
不做任何操作.
• 加倍
,得到
.
• 与前一结果相加 (得到
).
• …
最后,我们可以计算
,只需7次“加倍”运算和4次“相加”运算。
secp256k1椭圆曲线
在比特币区块链实现中使用的椭圆曲线为secp256k1。所以这里需要学习一下。
secp256k1曲线形如,由六元组
定义,其中:
The base point G in compressed form is(压缩形式表示的基点G定义):
and in uncompressed form is(非压缩形式表示):
Finally the order n of G and the cofactor are(G的阶、协因子):
G的阶:
协因子:
secp256k1椭圆曲线形状如下:
椭圆曲线参数 六元组解释: 我们的椭圆曲线算法是工作在循环子群上的。几个参数含义如下:
(1)素数,这个值定义了有限域的大小
(2)椭圆曲线的系数、
(3)基点(子群的生成元)
(4)子群的阶
(5)协因子(
)
补充数学概念
这里所用到的密码学其数学基础主要是《数论》、《代数》。如果想要弄清其原理,这两部分数学基础是需要研读的。
同余式
数学上,同余(congruence modulo,符号:≡)是数论中的一种等价关系。当两个整数除以同一个正整数,若得相同余数,则二整数同余。同余是抽象代数中的同余关系的原型。
两个整数若它们除以正整数
所得到的余数相等,则称
对于模
同余,记作
。读作
与
关于模
同余。(例
)。同余式的其他详细参考:zh.wikipedia.org/wiki/同餘
密码学与有限循环群
现代密码学算法和协议中,消息是作为有限空间中的数字或元素来处理的。加密和解密的各种操作必须在消息之间进行变换,以使变换服从有限消息空间内部的封闭性。然而,数的一般运算诸如加减乘除并不满足有限空间内部的封闭性。所以密码算法通常运行于具有某些保持封闭性的代数结构的空间中,这种代数结构就是有限循环群。在数学中,群是一种代数结构,由一个集合以及一个二元运算组成。群必须满足以下四个条件:封闭性,结合律,存在单位元和存在逆元。
群(Group)的定义: 设
是一个非空集合,对于
中的任意两个元素
,乘法运算满足以下条件,那么
称为一个群:
(1). 对于中任意元素
,有
.
(2). 在中存在一个元素
,它对
中任意元素
有
.(有单位元)
(3). 对于中任意元素
,都存在
中一个元素
使的
.(有逆)
最常见的群之一是整数集以及加法操作。
有限循环群在群的基础上满足两个额外条件:群元素个数有限以及交换律。循环群由单个元素(产生元)的叠加操作生成,最常见的有限循环群为模拟时钟。
椭圆曲线群定义
在数学上,椭圆曲线群的元素为椭圆曲线上的点,群操作为”+”,”+”的定义为,给定曲线两点,
,
等于
和
两点的连线与曲线交点沿
轴的对称点,如果
,则
等于
在曲线上的切线与曲线交点沿
轴的对称点。该群的单位元为无穷远零点记作
,有
,点
的逆元为其沿
轴的对称点,记作
。
椭圆曲线有限循环群
前面介绍的椭圆曲线都是基于有理数的,但是计算机运算浮点数(小数)的速度较慢,更重要的是四舍五入浮点数会产生误差,导致多次加密解密操作后原始消息不能被还原。故考虑到加密算法的可实现性,密码学上使用基于整数的模加运算产生椭圆曲线有限循环群。 基于整数的模加运算的特点:
- 运算速度快
- 精确的运算结果
- 产生有限循环
下面举例说明,如何产生ECC有限循环群:
例如考虑的集合,该集合中所有的元素如下图所示。模运算把发散的椭圆曲线映射到19*19的正方形空间中,并且保持了原有曲线的上下对称特性。
现在我们基于,利用产生元
来生成ECC有限循环群。如下图所示。
如下图所示,随着的连续增加,元素点的分布没有任何特征,这正是密码学需要的特性。
椭圆曲线的阶
椭圆曲线定义在有限域上,这也意味着,椭圆曲线上的点也是有限的。所以引出了一个问题:一个椭圆曲线到底有多少个点?定义“椭圆曲线上点的个数”为 椭圆曲线的 阶 (order)。至于怎么计算阶参考这篇文章吧: en.wikipedia.org/wiki/Schoof…
椭圆曲线的数乘和循环子群
在实数域,数乘(标量乘法)被定义如下:
子群的阶
- 首先,我们已经定义了阶就是群中点的个数。在子群中也是这样的,但是我们可以换一种表达方式:子群的阶是最小能够使得
的
。
- 子群的阶和群的阶是有关系的。拉格朗日定理说明了,子群的阶是群的阶的因子。即如果
是群的阶,则其子群的阶
,则
是
的因子(
is a diviser of
)。
找到子群的阶的方法(根据上面讲述的定义和性质就能得出下面的方法):
(1)计算群的阶
(2)找出所有的因子
(3)每个的因子
,然后乘以
(4)在3中,找出最小的,使得满足
。则
是子群的阶。
如何找一个基点
在ECC算法种,我们希望找到一个阶数较大的子群。
通常我们会选择一个椭圆曲线,然后计算它的阶,选择一个较大的因子
,然后找一个合适的基点。也就是说,我们不是首先找一个基点,然后计算它的阶,而是相反,我们先找到一个合适的阶,然后找以这个数为阶的子群的生成元。
首先,拉格朗日揭示,是一个整数(当然,
是
的因子),
有一个自己的名字:cofactor of the subgroup(协因子)。
其次,每个椭圆曲线上的点,
,因为
是
的阶
的倍数。
我们可以写成这样
。
假设
是一个素数,我们令
,则
就是子群的生成元。
必须是素数,若非如此,则
不一定表示
是
的阶,因为
的阶可能是
的一个因子。
总结如下:
- 计算椭圆曲线的阶
。
- 选择一个数
当成子群的阶。
应该是
的素因数
- 计算
- 随机选择一个点
- 计算
- 如果
是
,到第4步。否则,我们找到了这个基点。