r 保留之前曲线_【译】椭圆曲线密码学介绍之二:有限域和离散对数问题

本文介绍了椭圆曲线密码学在有限域上的应用,包括模p的整数域、点加法、代数和、椭圆曲线群的阶、子群的阶及基点寻找,重点讨论了离散对数问题及其在椭圆曲线加密算法中的重要性。
摘要由CSDN通过智能技术生成

56fc91ccf75503c045a00fe7488923d9.png
原文:
Elliptic Curve Cryptography: finite fields and discrete logarithms​andrea.corbellini.name

译者注

本文承接上文所讨论的椭圆曲线,主要区别在于将曲线的定义域从实数域缩小到了有限域。
作者首先介绍了有限域的数学定义,并介绍了一种基于模运算的有限域

作者介绍了如何在
上的椭圆曲线上的点集上建立一个群,即如何计算点加法和乘法。

作者介绍了群的阶数的概念,介绍了计算椭圆曲线上的群的阶数的算法,并讨论群和子群的阶数的联系。
作者展示了如何用椭圆曲线上的任意一点,通过计算点的倍数的方法,构造一个循环子群。
作者介绍了一种算法,可以在椭圆曲线上找到一个基点,并通过该基点生成一个阶数为大质数的循环子群。

前文我们介绍了如何在实数域上的椭圆曲线中定义一个群。现在,我们将把椭圆曲线限制在有限域,而不是实数集,看看情况如何变化。

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

有限域,顾名思义,首先必须是一个包含有限数量元素的集合。有限域的一个例子是模p的整数集,其中p是素数。它通常表示为

等。本文使用最后一种符号

在域中,我们需要定义两个二元运算:加法

和乘法
。两者都满足封闭性、结合律和交换律。对于这两个操作,每个元素都有一个唯一的单位元,一个唯一的逆元。
加法单位元没有对应的乘法逆元

最后,有限域还满足分配律:

注意:实际上域(field)的数学严格定义与上面描述的稍有不同,但是这并不影响我们后续的讨论,有兴趣的读者可以参考这篇文章

有限域的一个实例就是模质数

的整数集
,它是定义整数集
上。
的加法和乘法与分别是模加法和模乘法。以下是
中的一些操作示例:
  • 加法:
  • 减法(加逆元):
  • 乘法:
  • 加法逆元:

    并且有:
  • 乘法逆元:

    并且有:

如果这些方程式看起来很陌生,那么你可能需要阅读关于模运算的介绍 Khan Academy.

请注意,这里的

必须是一个质数!模4整数集就不是一个域: 因为2没有乘法逆(即等式
没有解)。

模p除法(Division modulo p)

我们马上就要完成对

的完整定义了,但在这之前,我们首先要对
中的除法运算
有一个明确的定义。本质上我们可以认为
,即把x除以y看成是x乘上y的乘法逆元。

利用扩展欧几里德算法可以“轻松”地计算乘法逆元,在最坏的情况下,算法的时间复杂度是

(或者
,如果我们考虑p的比特长度的话)。

本文不讨论扩展欧几里德算法的细节,因为它已经脱离了主题,但是这里提供了一个有效的Python实现:

def extended_euclidean_algorithm(a, b):
    """
    Returns a three-tuple (gcd, x, y) such that
    a * x + b * y == gcd, where gcd is the greatest
    common divisor of a and b.

    This function implements the extended Euclidean
    algorithm and runs in O(log b) in the worst case.
    """
    s, old_s = 0, 1
    t, old_t = 1, 0
    r, old_r = b, a

    while r != 0:
        quotient = old_r // r
        old_r, r = r, old_r - quotient * r
        old_s, s = s, old_s - quotient * s
        old_t, t = t, old_t - quotient * t

    return old_r, old_s, old_t


def inverse_of(n, p):
    """
    Returns the multiplicative inverse of
    n 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 == gcd

    if 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

中的椭圆曲线

我们现在已经可以把椭圆曲线的定义到

上了 。前一篇文章中,我们定义了实数域上的椭圆曲线:

现在转变为:

这里的0依代表无穷远处的点,a和b是

中的两个元素。

3ebe6558b4f55750e1c698fbfdad9b9c.png
曲线y^2≡x^3−7x+10(mod p) ,p=19,97,127,487。每个横坐标x,最多有两个对应点。还要注意y=p/2处的对称性。

fceb037c5da6e82df2961509dec24c45.png
曲线y^2≡x^3(mod 29)是奇异的,在( 0,0 ) 中有一个三重点。它不是有效的椭圆曲线。

换句话说,我们完成了从实数域上的连续曲线转变为xy平面上的不相交点的集合的过程。但是可以证明的是,即使限制了我们的定义域,

中的椭圆曲线仍然组成了一个交换群。接下来我们将看到,如何在
上的椭圆曲线中定义
符合群定义二元运算子,也就是点加法

点加法(Point addition)

我们依旧保留前一篇文章中的点对齐(aligned,即共线)概念。在实数域中,三个对齐的点

满足
,但是如果三个点在
中对齐,这意味着什么?

我们将扩展一下三点对齐,也就是三点共线的概念。现在

中的直线与
中的直线不同。我们可以非正式地说,
中的直线是满足方程
的一组点

845d7cc089b7d4cb74e7ee0a7826cf9b.png

上图展示了如何在曲线

上计算点加法,其中
。注意连接点的线
是如何在平面内“重复”出现的,这是
中的直线区别于实数域直线的一个重要特征

有了新的对齐后,我们就有了计算点加法的方法,这样定义的点加法还需要满足群的几个性质:

  • (根据单位元的定义).
  • 给定非零点
    的逆元是横坐标相同但纵坐标相反的点。或者说
    。例如,如果
    中的曲线有一个点
    ,则逆元是
  • 此外,
    (根据逆元的定义)。

代数和(Algebraic sum)

除了我们需要在每个表达式的末尾添加“

”之外,计算点相加的公式与上一篇文章完全相同。因此,给定
,我们可以按如下方式计算

如果

, 我们可以计算斜率:

如果

, 我们有:

在实数域上计算代数和的公式和 在

上的惊人的一致,这其实并非巧合。事实上,这些方程适用于所有的域,无论是有限的还是无限的(除了特殊情况下的
)。这一事实的证明涉及复杂的数学概念。作者在这里提供了一个简单的证明。

区别于实数域上的讨论,我们不再尝试定义一个计算

点加法的几何方法。事实上这种尝试也十分困难,之前我们提到,用几何方法计算
时,我们需要找椭圆曲线上过P点的切线,但是在离散的情况下,切线的定义是不成立的。我们当然也可以通过扩展切线定义的方法来重新定义几何加法,但这样就太复杂了。

作者提供了为计算点加法而编写的交互式工具。

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

在有限域上定义的椭圆曲线包含的点的数量是有限的。那么一个重要问题是:到底有几个点?

首先,我们给出一个定义:一个群中的元素数量称为这个群的阶(order)

一个简单的想法就是,我们尝试把0到p-1的所有整数x代入方程,然后对于每个x都找到所有满足方程的解,这样我们就找到了曲线上所有的点。但是这样的算时间复杂度为

,当我们的p数值很大时,算法的性能通常是不能接受的。

幸运的是,有一个更快的计算阶的算法:Schoof's algorithm。本文不讨论算法的细节——重要的是它能在多项式时间内运行完毕。

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

与实数一样,乘法可以定义为:

我们称nP这样的结果为P的倍数。同样,我们可以用到上一篇中提到的算法进行优化。作者也提供了一个标量乘法的交互式工具。

中椭圆曲线的点乘法有一个有趣的性质。取
曲线上的点
。现在我们计算出所有P的点乘倍数:

3f858054525b4bde788252ad31bccbc1.png
  • ...

在这里,我们可以立即发现:P的倍数只有5个点,椭圆曲线的其他点从未出现过。其次,它们是循环重复的。我们可以写作:

这五个方程可以被“压缩”成一个方程:

不仅如此,我们还可以立即验证这五个点是否在加法下闭合。这意味着:无论对这五个点进行多少次相加,结果总是这五点之一。同样,椭圆曲线的其他点永远不会出现在结果中。

对任意一点都有相同的结论,不仅仅是

。事实上,如果我们取一个普通的点P:

上式描述了一个简单的事实:如果我们把两个P的倍数相加,结果将是另一个P的倍数。换句话说,P的倍数在点加法下是封闭的。这就可以推导出一个重要的结论:

取椭圆曲线上任意一点P,所有P的倍数构成的集合是”定义在

上的椭圆曲线群“的一个循环子群。(这里有两个数学概念,子群和循环群)

“子群”首先是一个群,并且它的所有元素是另一个群的非空子集。“循环子群”是元素循环重复的子群,循环群中的每个元素都可以写成是一个基本元素的倍数,就像我们在前面的例子中展示的那样。我们把点P这样的基本元素称为循环子组的生成器或基点。

循环子群是ECC和其他密码系统的基础。我们将在下一篇文章中讨论详细的原因。

子群的阶(Subgroup order)

为基点所产生的子群(下文用子群P代称)的阶是多少?我们不能使用上文提到的Schoof算法来计算,因为该算法只适用于整个椭圆曲线,而不适用于子群。为了解决这个问题,我们还需要更多的信息:
  • 我们已经将阶定义为一个群的元素数量。这个定义仍然有效,但是在循环子组中,我们可以给出一个新的等价定义: 子群P的阶是使得
    的最小的正整数
  • 子群P的阶可以通过拉格朗日定理与椭圆曲线群的阶相联系,拉格朗日定理指出子群的阶是父群阶的除数。换句话说,如果椭圆曲线包含
    个点,并且它的一个子群包含
    点,那么
    是的
    的除数。

这两个信息组合在一起就给我们提供了一种找出一个基点为

的子群的阶的思路:
  1. 使用Schoof算法计算椭圆曲线群的阶数
  2. 找到
    的所有除数;
  3. 对每个
    的除数
    ,计算
  4. 使
    成立的最小
    就是子群P的阶。

此时我们考虑一种特殊情况:假设一个椭圆曲线群的阶数

是质数,那么这个椭圆曲线的子群的阶就只有两种情况:
  1. 子群的阶是1,此时的子群只包含一个点0;
  2. 子群的阶是N,此时的子群包含椭圆曲线上的所有点

找到基点(Finding a base point)

对于我们的ECC算法,我们需要的是高阶的子群。所以一般来说,我们会选择一条椭圆曲线,计算它的阶数

,选择一个较大的除数作为子群阶数
,最终找到一个合适的基点。也就是说:我们不会选择一个基点然后计算它的阶,相反,我们会首先选择一个看起来足够好的阶(也就是足够大),然后我们会寻找一个合适的基点。下面详细讨论这一过程:

首先,我们要再引入一个术语:余因子(cofactor)。通过前文提到的拉格朗日定理推导出群与子群的阶的关系

一定是一个整数,这里的
就是余因子。

我们还有一个结论:对椭圆曲线上任意一点

。原因很简单,因为
是所有子群的阶的倍数,我们用余因子的定义,可以把这个结论写作:

现在假设

是一个质数(我们将在下一篇文章讨论,为什么要选一个阶数为质数的子群),那么上面这个等式实际上就告诉我们点
可以生成一个
阶子群(除非点
,这种情况下生成的子群的阶是1)

有鉴于此,我们的算法概述如下:

  1. 计算椭圆曲线的阶数
  2. 选择子群的阶数
    。为了使算法有效,这个数字必须是质数,并且必须是
    的除数。
  3. 计算余因子
  4. 选择椭圆曲线上的一个随机点
  5. 计算
  6. , 就回到步骤4, 否则,我们就找到了一个子群的基点,阶数为
    和余因子为

请注意,此算法仅在

是质数时有效。如果
不是质数,那么
的阶数可能是
的除数之一。

对数问题(Discrete logarithm)

正如我们在处理实数域上的椭圆曲线时所做的那样,我们现在将在

讨论这个问题:已知
,如何求解
,使得

这个问题被称为椭圆曲线的离散对数问题,它被认为是一个“难”的问题,因为没有已知的多项式时间算法可以在经典架构的计算机上求解这个问题。一个微妙的事实是,并没有一个严格的数学证明可以确认离散对数问题没有多项式时间算法(感兴趣的同学可以搜索一下NP完全问题)。

椭圆曲线上的离散对数问题也可以类比其他密码系统使用的离散对数问题,例如数字签名算法( DSA )、Diffie-Hellman密钥交换( D-H )和ElGamal算法。不同之处在于,对于这些算法,我们使用模幂运算而不是标量乘法。它们的离散对数问题可以表述如下:已知

,如何求解
,使得

这两个问题都是“离散的”,因为它们涉及有限域(更准确地说是循环子群)。它们是“对数”问题,因为它们涉及的运算类似于算术意义上的求对数

ECC的有趣之处在于,与基于模幂的密码学中使用的其他类似问题相比,到今天为止,椭圆曲线的离散对数问题似乎更加“困难”。这意味着,我们可以用更小的整数

,就可以达到与其他密码系统相同的安全级别,这将在本系列的第四篇和最后一篇文章中详细介绍。

下一篇文章将是这个系列的第三篇,关于ECC算法:密钥对生成、ECDH和ECDSA。这将是这个系列中最有趣的部分之一。不要错过它!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值