本文主要翻译自这篇文章

译者注

★ 本文承接上文所讨论的椭圆曲线,并将曲线的定义域从实数域缩小到了有限域,引出离散对数问题

★ 首先介绍了有限域的定义,并给出了一种基于模运算的有限域


★ 然后对离散域上的椭圆曲线重新进行群的构建

★ 接着介绍了群的阶数的概念,介绍了计算椭圆曲线上的群的阶数的算法,并讨论群和子群的阶数的联系

★ 随后展示了如何用椭圆曲线上的任意一点,通过计算点的倍数的方法,构造一个循环子群

★ 最后介绍了一种算法,可以在椭圆曲线上找到一个基点,并通过该基点生成一个阶数为大质数的循环子群

上一篇文章当中,我们已经了解了在实数域的椭圆曲线可以用来定一个群。特别的,根据群的定义,我们在实数域上面的椭圆曲线定义了一个点加法的二元操作:对于曲线上面对齐的三个点,三点累加之和为0。并对加法运算的几何方法和代数方法进行了推导。

然后在加法的基础上面介绍了标量乘法,并找到了一种计算标量乘法的简单算法:翻倍和累加,可以使得算法时间复杂度到

接下来,我们将椭圆曲线限定在有限域内,然后看看会有什么变化。

的整数域(The field of integers modulo p)

有限域,顾名思义,就是一个包含有限个元素的集合。一个有限域的具体例子就是模

的整数域,其中
是一个素数。通常它可表示为
等,为了简洁,本文采用最后一种符号

在有限域中,我们有两种二元操作:加法

和乘法
。两者都满足封闭性、结合律和交换律。对这两个操作,存在独一无二的单位元,且对每一个元素都有一个唯一的逆元。

最后,乘法相对加法满足分配率:

的整数域是包含所有从0到
的整数,即集合
是定义在整数集
上。在
上面的加法和乘法以

模运算(modular arithmetic)的方式进行工作。下面是一些在

上面的操作实例:
  • 加法:

  • 减法:
  • 乘法:
  • 加法逆元:
    实际上:作为加法群时,其单位元为0,根据
    ,有
  • 乘法逆元:
    实际上:作为乘法群时,其单位元为1,根据
    ,有

如果对这些等式看起来有点模式,可以进一步阅读关于模运算的资料,比如wiki百科,或者Khan Academy

正如我们之前所说,整数对

取模后所组成的有限域将具备以上所有性质。不过需要注意的是,
必须是一个质数!否则将无法成为一个域。比如模4整数集就不是一个域:因为2没有乘法逆元,即方程
无解。

除法(Division modulo p)

在完成对

域上面对椭圆曲线进行定义之前,我们先来搞搞清楚
域上面
意味着什么。本质上,我们可以认为:
,用语言来表示就是
除以
等价于
乘以
的乘法逆元。这个结果并不意外,且给出了求解除法的基本方法:找到元素的乘法逆元然后再做一个乘法。

利用扩展欧几里德算法(Extended Euclidean algorithm)可以“方便”地计算乘法逆元,即便在最坏的情况下,算法的时间复杂度也仅为

,如果考虑
的二进制比特长度为
的话,则为

扩展欧几里德算法的具体细节不在本文的议题范围之内,不过下面是一个python脚本的具体实现:

def extended_euclidean_algorithm(a, b):"""Returns a three-tuple (gcd, x, y) such thata * x + b * y == gcd, where gcd is the greatestcommon divisor of a and b.This function implements the extended Euclideanalgorithm and runs in O(log b) in the worst case."""s, old_s = 0, 1t, old_t = 1, 0r, old_r = b, awhile r != 0:quotient = old_r // rold_r, r = r, old_r - quotient * rold_s, s = s, old_s - quotient * sold_t, t = t, old_t - quotient * treturn old_r, old_s, old_tdef inverse_of(n, p):"""Returns the multiplicative inverse ofn modulo p.This function returns an integer m such that(n * m) % p == 1."""gcd, x, y = extended_euclidean_algorithm(n, p)assert (n * x + p * y) % p == gcdif gcd != 1:# Either n is 0, or p is not a prime number.raise ValueError('{} has no multiplicative inverse ''modulo {}'.format(n, p))else:return x % p

域上的椭圆曲线(Elliptic curves in

现在,我们有足够的必要条件对

域上的椭圆曲线进行定义,前面实数域上的定义如下:
有限域上的定义如下:

其中0依然是位于无限远的点,

域上的两个整数。

从几何的角度,图形则从连续的曲线变成

平面上面的不相连的离散点的集合。好在,我们可以依然证明,即便我们对于定义域进行诸多限制,
域上的椭圆曲线依然可以组成一个阿贝尔群。

点加法(Point addition)

显然,为了使得点加法在

域上依然有效,我们需要对定义作一些小小的修改。对于实数,我们定义三个共线的点之和为0。这个定义可以保留,但是我们需要搞明白在
域中三点共线意味着什么。

在实数域,显然,三点共线意味着能够找到一条直线将三个点连在一起就好。当然,在

域中,直线与实数域
中的是有所不同的。不太严谨地说,
中的直线是满足方程
的点
的集合。

假设我们在一个群当中,点加法将保留所有我们已知的特性:

  • 对于一个非0的点
    ,逆元
    是横坐标相同但是纵坐标相反的点。或者如果你愿意,可以这样计算,
    ,举个例子,在
    域上的曲线有一个点
    ,则其逆元
  • 根据逆元的定义有

代数加法(Algebraic sum)

除了在每一个表达式后面加上一个

的操作以外其它与前一篇文章当中所描述的步骤都相同。因此,令
,我们可以按如下方程计算

如果

,斜率
的形式如下:

如果

,则有:

方程形式的一致并不是巧合:实际上在任何一个域,方程的形式都是相同的,有限的或者无限的,仅在

两个特定域上不成立。关于数学上的证明有兴趣的话可以参阅

proof from Stefan Friedl

另外,考虑到离散化后的曲线切线已无从谈起,以及其它方面的一些问题,在离散化域中,我们不再定义几何加法。

椭圆曲线群的阶(The order of an elliptic curve group)

显而易见,有限域上定义的椭圆曲线只有有限个点。但是有一个重要的问题不应该忽略:对于一个特定有限域上的椭圆曲线,到底有多少个点呢?

首先,我们将群中所包含点的数目定义为群的阶

通常从

进行暴力枚举不是一个可行的方式,这个需要
的步骤,如果
是一个很大的质数,这将是一个难题。

所幸,有一个更快的算法可以计算群的阶:Schoof's algorithm,这个算法可以在多项式级别的算法世界复杂度内,这正是我们所需要的。

标量乘法与循环子群(Scalar multiplication and cyclic subgroups)

这次我们依然可以使用翻倍累加算法将乘法计算的时间复杂度控制在

域上的椭圆曲线进行乘法有一个有趣的性质。以曲线
和点
为例,

计算

的所有乘积:
  • ...

在此,我们可以确认两件事情:第一,

的乘积只有五种可能答案:椭圆曲线上面的其它的点决不会出现;第二,这五个点循环出现。我们可以这样写:

对于每一个整数

,上述5个方程可以借助模运算符压缩成一个方程:

不仅如此,我们可以立刻确认这五个点在加法操作上面也是封闭的。这意味着:不管我是加

中的哪一个,结果都是上述五个点之一,其它的点依然不会出现在结果当中。

不仅仅对于

,对于任何点都有这样的结果。如果我们假设一个通用的点

这意味着:如果我们将两个

的乘积相加,我们将得到一个
的乘积,
的乘积在加法操作下是封闭的。

这足以证明

的乘积的集合是一个由椭圆曲线所组成的群的循环子群(cyclic subgroup)。

一个“子群”是指另外一个群的子集的群。而“循环子群”则是指子群中的元素循环地出现,就好像在前面的例子当中所示。点

被称为

发生器(generator)或者基点(base point)

循环子群是椭圆曲线密码学以及其它加密系统的基础。

子群的阶(Subgroup order)

我们可以自问一下:由一个点

产生的子群的阶(order)是多少,或者也可以称之为
的阶。回答这个问题无法使用

Schoof's algorithm,因为该算法只有在整个椭圆曲线上面是有效的,在子群当中就无效了。在解决这个问题之前,我们需要了解以下几点:

  • 我们已经对群的阶进行过定义:阶是一个群的点数。目前这个定义依然有效,但是在一个循环子群当中,我们可以给一个新的等价的定义:循环子群的阶是使得

    的最小正整数
    。我们可以看之前那个例子,我们的子群有5个点,然后我们有
  • Lagrange's theorem
    的阶与椭圆曲线本身的阶有联系,一个子群的阶是父群阶的一个因子。换句话说,如果一个椭圆曲线有
    个点,然后它的一个子群有
    个点,那么
    的一个因子

以上两个有用的信息合在一起可以帮助我们找到基于特定几点

的子群的阶:
  • 使用Schoof's algorithm找到椭圆曲线而阶

  • 找到
    的所有因子
  • 的每一个因子
    ,都计算
  • 满足
    的最小正整数
    ,就是子群的阶

举个例子,曲线

在域
上的阶为
,则其子群可能的阶为
。如果我们选取基点
,我们可以发现
,因此基点
的阶为

需要特别注意的是,选取最小的因子非常重要,而不是随机选取。如果随机选取,我们还可能选择

,虽然
是满足
的,但是它并不是子群的阶,而且其中的一个乘数。

再举一个例子,曲线

在域
上的阶为
,是一个素数,其子群可能的阶仅为
。不难猜到,当
时,子群只包含一个在无限远的点;当
时,子群包含椭圆曲线上面所有的点。

寻找一个基点(Finding a base point)

对于我们的椭圆曲线加密算法,我们需要一个尽量高阶的子群。通常来说,我们选择一条椭圆曲线,计算它的阶(

),确定一个比较大的因子作为子群的阶(
),然后据此寻找一个合适的基点。下面来看看我们是如何先确定子群的阶再匹配合适的基点,而不是先找基点再计算子群的阶的。

首先,需要再介绍一个概念。Lagrange's theorem表明

一定是一个整数。
被称为子群的协因子(cofactor)。

对于椭圆曲线上面的每一个点,我们有

,根据协因子的定义,我们有

现在假设

是一个素数,那么这个方程告诉我们点
可以产出一个阶为
的子群。

综上所述,通过确定子群的阶,再据此寻找合适的基点的算法如下:

  • 计算椭圆曲线的阶

  • 选择恰当的子群的阶
    ,为了使得这个算法能够正常工作,这个整数必须是素数,并且是
    的一个因子
  • 计算协因子
  • 再曲线上面选择一个随机点
  • 计算
  • 如果
    是0,则返回第四步,否则,我们就找到了一个阶为
    且协因子为
    的子群

需要指出的是该算法当且仅当

是素数的时候才能够正常工作,如果
不是一个素数,则
的阶会是
的一个因子。

离散对数(Discrete logarithm)

正如我们再之前那篇文章当中对连续的椭圆曲线所做的,对于定义在离散域当中的椭圆曲线,我们接下来讨论一下下面这个问题:如果已知

,如果求得满足
呢?

这个问题,就是经典的椭圆曲线离散对数问题,通常来说是“hard”的问题,在经典的计算机上面是无法通过多项式级别的时间复杂度来解决这个问题的,尽管目前还没有严格的数学证明。

这个问题和其它加密系统当中使用的离散对数问题类似,比如DSAD-HElGamal。这并不是一个巧合。不同的是,在这些算法当中,我们使用幂模运算来代替标量乘法。这些离散对数问题可以表示如下: 已知

,求满足

两个问题都是离散的,因为它只与有限的集合相关,更加精确地说,是循环子群。而当前椭圆曲线加密更为有趣是在于它比起其它类似的加密系统难题更难,可以使用更小的字节来表示整数

来获得的安全级别。

参考资料

  • 扩展欧几里德算法(Extended Euclidean algorithm)
  • 模运算(modular arithmetic)
  • Khan Academy
  • Elliptic Curve Cryptography: finite fields and discrete logarithms
  • 有限域和离散对数问题(ECC椭圆曲线算法2)

matlab有限域多项式除法_椭圆曲线密码学简介(二):有限域的椭圆曲线及离散对数问题...相关推荐

  1. matlab有限域多项式除法_有限域GF(2^8)的四则运算及拉格朗日插值

    域的性质: 群和域在数学上的概念就不解释,可以参考维基百科.当然也可以参考<密码编码学与网络安全>这书的有限域一章.形象地说,域有这样一个性质:在加法和乘法上具有封闭性.也就是说对域中的元 ...

  2. 【区块链技术工坊46期】PPIO蒋鑫:椭圆曲线密码学简介

    1. 活动基本信息 1)题目: [区块链技术工坊46期]椭圆曲线密码学简介 2)议题: 目前区块链项目如火如荼,几乎所有的区块链都会用到钱包,我们也经常听说椭圆曲线这个密码学术语,那么它们之间有没有什 ...

  3. python 椭圆曲线加法_椭圆曲线密码学简介(一):实数域的椭圆曲线及其群运算规则...

    经过前面几篇文章的介绍,相信对公钥密码学有所了解的各位应该已经听说过ECC,ECDH和ECDSA,ECC是椭圆密码学的简称,后面两个是基于椭圆密码学的具体算法. 目前我们可以在当前web和IT世界当中 ...

  4. 椭圆曲线密码学简介****

    知道什么是公钥密码学的人可能已经听说过ECC.ECDH或是ECDSA.第一个术语是椭圆曲线密码学(Elliptic Curve Cryptography) 的缩写,后两个是基于它的算法名称. 如今,我 ...

  5. python定义多项式除法_快速多项式除法的fft除法

    下面是一个快速多项式除法算法的直接实现,在这些lecture notes中找到.在 除法是基于除数的倒数与被除数的快速/FFT相乘.我下面的实现严格遵循了被证明具有O(n*log(n))时间复杂度的算 ...

  6. matlab有限域多项式除法_MATLAB极小值优化

    11.1.2  极小值优化 1.标量最小值优化 求解单变量最优化问题的方法有多种,根据目标函数是否需要求导,可以分为两类,即直接法和间接法.直接法不需要对目标函数进行求导,而间接法则需要用到目标函数的 ...

  7. 密码学安全强随机数生成器_强密码学简介

    密码学安全强随机数生成器 让我惊讶的一件事是,大多数开发人员都不熟悉强大的加密技术. 在我的职业生涯中,我已经看到过各种各样的错误,这些错误会导致数据泄漏,可猜测的密码,不幸的泄露甚至更糟. 令人高兴 ...

  8. matlab图像校正工具箱_相机标定简介与MatLab相机标定工具箱的使用(未涉及原理公式推导)...

    一.相机标定的目的 确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数. 二.通用摄像机模型 世界坐标系.摄像机坐标系和像平面 ...

  9. python定义多项式除法_多项式长除法

    我被困在一个问题上,尽管如此,我还是找不到比较是怎么出错的.我试着做多项式长除模2.在while len(binCrcGen) <= len(binPayload) and binPayload ...

最新文章

  1. 前端应该了解的颜色的寓意
  2. Linux chgrp chown chmod 基础知识
  3. Android 源码解析之AsyncTask
  4. 2021年福安民族中学高考成绩查询,福安民族中学2019年录取分数线
  5. 格式化输出字符串变量
  6. springboot入门_模板
  7. 杭电1072 猜数字
  8. 数据结构严蔚敏 #二叉树 代码复现
  9. 饥荒dns服务器未响应,DNS服务器未响应怎么办
  10. 《看清你的思维图谱》读书笔记
  11. 星起航:亚马逊卖家利用一件代发模式实现跨境电商飞速发展
  12. RFSoC应用笔记 - RF数据转换器 -10- RFSoC关键配置之其他功能(一)
  13. Excel怎样按行排序,干货经验!如何将行数据进行降序排序详细讲解
  14. RK3399适配OV8858摄像头
  15. uni-app实现尺子效果
  16. 让电脑注销的c语言程序,C语言实现系统关机注销功能
  17. Prometheus(三)Grafana部署及部署告警
  18. Zemax学习笔记(2)- 镜头数据编辑器及快速编辑器的使用方法介绍
  19. OSEA中QRS波检测算法代码分析-未完待续
  20. metro-GettingStarted

热门文章

  1. RocketMQ-创建MappedFile本地文件
  2. infer构建项目失败
  3. VMware虚拟机文件夹中各文件作用详解
  4. Java语言的基础知识9
  5. vector与结构体联合使用 在磁盘中生成.txt 文件
  6. Windows Vista正版光碟上面的隐藏人像
  7. 瑞星杀毒软件所有监控已禁用!
  8. devops和docker_通过免费的2小时Docker课程学习DevOps基础知识
  9. Hadoop集群的基本操作(二:HBase的基本操作)
  10. 1013 Battle Over Cities(并查集解法)