python 椭圆曲线加法_椭圆曲线密码学简介(一):实数域的椭圆曲线及其群运算规则...
经过前面几篇文章的介绍,相信对公钥密码学有所了解的各位应该已经听说过ECC,ECDH和ECDSA,ECC是椭圆密码学的简称,后面两个是基于椭圆密码学的具体算法。
目前我们可以在当前web和IT世界当中的三大主要技术
在ECC开始流行之前,几乎所有的公钥加密算法都是基于RSA,DSA以及DH,底层的加密系统对应的数学难题是模运算。RSA系列算法依然很重要,常常和ECC一同使用。考虑到RSA系列算法背后的原理比较简单,也很容易解释清楚,而ECC却依然蒙着神秘的面纱,本文将提供一个关于ECC的综述,并解释其安全背后的机理,也一并给出一些具体的例子。文章主要包含以下几个方面的内容:基于群论在实数域定义的椭圆曲线
基于有限域的椭圆曲线和离散对数问题
密钥对的生成和两个ECC算法:ECDH和ECDSA
ECC破解算法,与RSA算法安全性比较
在开始之前,你需要对集合论、几何学以及模运算有所了解,并且对对称加密和非对称加密比较熟悉,关于秘密学当中对“easy”问题和“hard”问题的定位也要有清晰的认识。
椭圆曲线(Elliptic Curves)
首先,什么是椭圆曲线,Wolfram MathWorld给出了完整的
,即:
其中参数
至
的不同取值决定椭圆曲线在坐标系中的形状。实际常用的形式是一类称为Weierstrass Normal Form(WNF)的的简化形式,即:
由于ECC算法运算过程中需要使用WMF曲线的切线,因此为了使WNF曲线没有奇异点,即处处光滑可导,需要满足其判别式不为零,即:
同时,定义射影平面上的无穷远点,记为0.无穷远点是所有曲线在无穷远处的交点,也被称为理想点。因此,下面的论述当中所采用的完整的WNF椭圆曲线公式为:
当令
,
从2递减1到-3的椭圆曲线如下所示:
下面我们再来看两条存在奇异点的曲线,如下图所示:
左边这条曲线的方程为
,右边的这条曲线方程为
,两者都不是合格可用的椭圆曲线。另外,不难发现,所有的椭圆曲线都是关于
轴对称的。
群论(Groups)
从数学的角度,一个群是由一种集合以及定义在该群上的一个二元运算所组成,且符合“群公理”。具体完整的定义如下:假设
是一个非空集合,
是它的一个二元运算,如果满足以下条件,则
和
构成一个群。封闭性(closure):若
和
是集合
的成员,则存在唯一确定的
,使得
结合律(associativity):即对
中任意元素
,都有
单位元(identify element):存在
中的一个元素
,对任意所有的
中的元素
,总有等式
。则将
称为单位元,也称幺元
逆元(inverse):对于
任意一个
,存在
中的一个元素
,使得总有
(
为单位元),则称
与
互为逆元素,简称逆元。
记作
群运算的次序很重要,把元素
与元素
结合,所得到的结果不一定与把元素
与元素
结合相同;亦即,
(交换律)不一定恒成立。满足交换律的群称为交换群(阿贝尔群,以尼尔斯·阿贝尔命名),不满足交换律的群称为非交换群(非阿贝尔群)。
如果我们将加法作为集合的二元运算,那么加上整数集合
将得到一个群,且是一个阿贝尔群。而自然数集合
因为不满足逆元,则无法与加法构成一个群。
群的奇妙之处在于如果你能够上述四个性质,那么你可以获得一些其它有趣的性质。
比如,单位元是独一无二的,逆元也是独一无二的。对于任何一个
,有且仅有一个
满足
。
椭圆曲线的群法则(The group law for elliptic cirves)
我们可以基于特定的椭圆曲线定义一个群,作如下规定:群的元素是椭圆曲线上面的点的集合
单位元是在无穷远处的点,记为0
一个元素点
的逆元是其关于
轴对称的点
二元远算操作规则定义如下:在曲线上面找到对齐的在一条直线上面的三个非零的点:
,三者之和为0,即
对于最后一点,我们的要求仅仅是一条直线上面对齐的三个点,而对齐本身与顺序是无关的,因此,如果
是对齐的,则有
,如此这般,我们也顺带证明了我们所定义的二元操作符是能够同时满足结合律和交换律的,我们在椭圆曲线上面定义的群还是一个阿贝尔群。
几何加法(Geometric addition)
庆幸我们是在一个阿贝尔群当中,我们可以将
写成
。这个形式的方程,可以让我们得到一种计算两个点
和
相加之和的几何方法:如果我们画一条直线通过
和
,那么直线会与曲线相交与第三个点
。那么该点的逆元
即为
的结果。
几何方法一目了然,但是还需要回答一些边界条件::考虑到无穷远点本身并不在这个平面上面,线是画不出来的,但是我们已经定义了0为单位元,对于任意
和
,都有
:经过这两个点的直线是一条垂直线,与椭圆曲线不会有第三个交点。但是
是
的逆元,根据逆元的定义有
:会有无数条线经过这个点,情况会有一些复杂。令
,如果我们让
无限得接近
,则经过它们的直线会变成椭圆曲线的切线,此时有
,其中
是切线与椭圆曲线的交点。如下图所示:,且找不到第三点
:这个情况与上面的情况非常类似,此时过
的线就是椭圆曲线的切线。假设
就是切点,在前面的一个情况当中,
,这个方程现在变成
。反过来,如果
是这个切点,则有
。如下图所示:
现在几何加法已经能够覆盖所有的情况了,你只需要尺规就可以在椭圆曲线上面进行各种加法计算了。如果有兴趣也可以看看本文主要参考资料作者提供的
代数加法(Algebraic addition)
如果要使用计算机进行具体的加法远算,那么要从几何方法切换到代数方法。将以上所描述的规则转化为方程组是直截了当的办法,但是因为涉及到求解三次方程,会非常麻烦,这里仅仅给出最终结果,具体的求解和推导过程可以查阅相关资料,比如wiki百科等。
首先,对于简单的边界条件先排除掉,我们已经知道
,以及
。因此,我们只需要考虑两个非零且不对称的点
。
如果
和
不相等,则通过这两个点的直线的斜率为:
则直线与椭圆曲线的第三个交点
的坐标如下:
或者,等价于:
因此有:
,需要注意
的负号。
为了验证结果的正确性,需要验证以下两点:是否在这条曲线上面
是否共线
验证三点是否共线相对简单,而验证一个点是否在椭圆曲线上面则相对复杂一些,需要求解三次方程。这里我们还是借助前面提到的
上面取两点
,得到
,我们由此验证下前面的代数表达式是否正确:
另外,当
或者
其中之一是切点的时候,上述方程依然正确,具体读者可以自行验证。
而当
时,情况会稍微复杂一些:因为
,所以关于斜率我们需要采用另外一个不同的方程:
不难发现,正如我们期望的那样,上述
的表达式就是下式的一阶导数:
为了证明这一结果的有效性,只需检查
在这条椭圆曲线上,以及经过
和
的直线与椭圆曲线只有两个交点。当然,具体证明还是交给相关专业的数学教材,这里只举一个具体的例子:
。
这里我们有
,结果正确。
标量乘法(Scalar multiplication)
除了加法,我们可以定义另外一个操作:标量乘法,具体如下:
其中
是一个自然数。这里我们依然可以借助前面提到的
从上面的形式可以看出,计算标量乘法
需要进行
次的加法。如果
有
个二进制位的话,那么我们的算法复杂度将是
,不过,对于乘法的计算有现成的更为优化的多项式级别复杂度的算法。
其中一个比较著名的是**加倍累加(double and add )**算法。我们用一个具体的例子来解释其原理。不妨取
,其二进制表示形式为:
。而将二进制转化为十进制的过程可以用2的不同次方的累加表示如下:
从这个角度,我们可以改写上述变量乘法公式:
这样,标量乘法可以表示为多项式乘法类似的算法,具体步骤如下:得到
翻倍
,得到
将
加到
(得到
的结果)
翻倍
,得到
将翻倍的
加到上一次的结果当中得到
翻倍
,得到
不对
进行任何操作
翻倍
,得到
将翻倍的
加到上一次的结果当中得到
...
最后,我们仅需要7次的翻倍计算和4次的加法计算就可以得到
的结果。
如果这个过程不够清晰,这里有一段实现了这个算法的python脚本:
def bits(n):
"""
Generates the binary digits of n, starting
from the least significant bit.
bits(151) -> 1, 1, 1, 0, 1, 0, 0, 1
"""
while n:
yield n & 1
n >>= 1
def double_and_add(n, x):
"""
Returns the result of n * x, computed using
the double and add algorithm.
"""
result = 0
addend = x
for bit in bits(n):
if bit == 1:
result += addend
addend *= 2
return result
这里我们分析下这个算法的时间复杂度。如果翻倍和加法都是
的话,那么这个算法就是
,比起之前的
,算法时间复杂度大大简化。
对数(Logarithm)
给定
和
,我们有一个至少是多项式时间复杂度的算法来计算
。但是,如果反过来呢?比如已知
和
来计算
呢?通常将这种问题叫作对数问题(logarithm problem)。之所以用对数来代替除法是为了与其它的加密系统保持一致。
对于对数问题我们不知道是否有可以称之为“简单”的算法,但是通过
和点
为例。我们可以立刻确认,如果
是奇数,
将会在曲线的左半部分;如果
是偶数,
将会在曲线的右半部分。如果我们做更多的实验,我们可以发现更多的规律,最终可以指引我们写出一个基于特定曲线的求解对数问题的特定算法。
当然,对数问题也有一些衍生:离散对数问题。这个将在下一篇文章当中进行讨论,如果我们减小椭圆曲线的域,变量乘法依然“简单”,但是离散对数却变成一个“难题”,这个双重特性是椭圆曲线密码学的基石。
参考资料
python 椭圆曲线加法_椭圆曲线密码学简介(一):实数域的椭圆曲线及其群运算规则...相关推荐
- python 椭圆曲线加法_椭圆曲线上点的运算
https://aaron67.cc/2020/09/26/ec-point-operation/ 对定义在有限域上的椭圆曲线 E = ( p , a , b , G , n , h ) E = (p ...
- 密码学安全强随机数生成器_强密码学简介
密码学安全强随机数生成器 让我惊讶的一件事是,大多数开发人员都不熟悉强大的加密技术. 在我的职业生涯中,我已经看到过各种各样的错误,这些错误会导致数据泄漏,可猜测的密码,不幸的泄露甚至更糟. 令人高兴 ...
- 椭圆曲线介绍(一):实数上面的椭圆曲线
大部分内容翻译自 ANDREA CORBELLINI的椭圆曲线密码学的介绍:Elliptic Curve Cryptography: a gentle introduction 我在里面加了一些使用p ...
- matlab有限域多项式除法_椭圆曲线密码学简介(二):有限域的椭圆曲线及离散对数问题...
本文主要翻译自这篇文章 译者注 ★ 本文承接上文所讨论的椭圆曲线,并将曲线的定义域从实数域缩小到了有限域,引出离散对数问题 " ★ 首先介绍了有限域的定义,并给出了一种基于模运算的有限域 & ...
- python椭圆曲线加密算法_椭圆曲线加密中的加法乘法浅析
本文不深入椭圆曲线加密算法的全部知识,只针对椭圆曲线加密中需要用到的加法和乘法计算规则进行浅析. 实际练习中碰到一个比较简单密码学的问题,但是涉及到了椭圆曲线加密算法,题目描述如下: 已知椭圆曲线加密 ...
- python椭圆曲线加密算法_区块链的基石--椭圆曲线密码学
椭圆曲线密码学 椭圆曲线密码学(ECC, Elliptic Curve Cryptography)是基于椭圆曲线数学的一种公钥加密方法. 什么是公钥加密方法 在诸如 DES.AES 这类对称密码系统中 ...
- 【区块链技术工坊46期】PPIO蒋鑫:椭圆曲线密码学简介
1. 活动基本信息 1)题目: [区块链技术工坊46期]椭圆曲线密码学简介 2)议题: 目前区块链项目如火如荼,几乎所有的区块链都会用到钱包,我们也经常听说椭圆曲线这个密码学术语,那么它们之间有没有什 ...
- 椭圆曲线密码学简介****
知道什么是公钥密码学的人可能已经听说过ECC.ECDH或是ECDSA.第一个术语是椭圆曲线密码学(Elliptic Curve Cryptography) 的缩写,后两个是基于它的算法名称. 如今,我 ...
- python并行运算库_最佳并行绘图Python库简介:“ HiPlot”
python并行运算库 HiPlot is Facebook's Python library to support visualization of high-dimensional data ta ...
最新文章
- 软件架构之美在于简单、好用、稳定、功能定位明确、代码简洁、通俗易懂
- 为拯救爸妈朋友圈,达摩院造了“谣言粉碎机”
- 新鲜的jquery插件收集
- Arduino--ESP8266物联网WIFI模块(贝壳物联)--数据上传服务器(单数据接口)
- 1026 程序运行时间 (15分)(附四舍五入标准写法)(解题报告)
- c语言链表实现数组逆置,数组与链表等顺序表逆置
- 金蝶k3财务接口_记录用友T+接口对接的心酸历程
- 系统的延时与定时任务
- 《面向对象分析与设计》一1.4面向对象方法的主要优点
- Atitit 团队远景规划与目标总结 v4 目录 1. 使命和组织宗旨	1 1.1. 组织使命	1 1.2. 核心价值观	1 2. 行政目标体系	2 2.1. 打造体系齐全的复合体	2 2.2. 人
- 相似度系列8:unify-BARTSCORE: Evaluating Generated Text as Text Generation
- Jenkins-LADP认证管理员密码修改后导致Jenkins没法登陆
- 业务型团队如何提高人效
- 回溯法----图的着色问题
- 安卓手机兼职教程,下载应用试玩,每天2小时50块
- 创业时也要读下这十本经典书
- 软考信息系统项目管理师(高项),论文该怎么准备?
- 神经调节的知识网络图,图神经网络与知识图谱
- [BZOJ3238][Ahoi2013]差异
- 云计算安全测评:云原生安全