2椭圆曲线密码学:有限域和离散对数

原文链接:https://andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete-logarithms/

这篇文章是ECC系列的第二篇。

在前一篇文章中,我们已经看到了如何基于实数域上的椭圆曲线来定义一个群。具体如下,我们定义了点的加法规则:给定三个共线的点,它们的和是零(P+Q+R=0)然后推导出计算机中点的加法的一个几何方法和一个代数方法(几何加法和代数加法)。

接着我们介绍了标量乘法(

),并发现了一个计算标量乘法的“易解”算法:“加倍(double)和相加(add)”。

现在我们将椭圆曲线限制在有限域内,而不是实数域,看看情况如何变化。

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

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

,我们将使用最后一种符号。

在域中,我们有两种二元运算:加法(+)和乘法(·)。它们都具有封闭性,结合律和交换律。对于这两种运算,每个元素都存在一个唯一的单位元,并且每个元素都存在一个唯一的逆元。最后,乘法是对加法的分配:

整数模p的集合由整数0到p-1组成。加法和乘法在运算(也称为“时钟运算”)中工作。这里有一些

运算的例子:
  • 加法:(18+9)mod23=4
  • 减法:(7-14)mod23=16
  • 乘法:4·7mod23=5
  • 加法逆元:-5mod23=18  实际:(5+(-5))mod23=(5+18)mod23=0
  • 乘法逆元:9-1mod23=18  实际:9·9-1mod23=9·18mod23=1

如果这些方程看起来不熟悉,你需要一个模块化的运算入门,看看 Khan Academy

正如我们已经说过的,模p的整数集是一个域,因此上面列出的所有属性都成立。注意,p是素数的要求是很重要的!(p=4)对4取模的整数集不是一个域:2没有乘法逆元(如:等式2·xmod4=1没有结果)

 模p除法(Division modulo p)

 我们将定义在

上的椭圆曲线,但是在这之前我们需要弄清楚
的含义。简单说,
,即,x/y等于x乘以y的乘法逆元。这个事实并不意外,它给了我们一个基本的除法:找到该数的乘法逆元,然后进行乘法运算。

用扩展的欧几里德算法(extended Euclidean algorithm)可以“轻松”计算乘法逆元,其中,最坏的情况下时间复杂度为

(或者如果我们考虑p的比特长度的话,最坏的情况则是
)。

我们不讨论扩展的欧几里得算法的细节,因为它离题了,但是这里有一个有效的的Python实现:

 1 def extended_euclidean_algorithm(a, b):
 2     """
 3     Returns a three-tuple (gcd, x, y) such that
 4     a * x + b * y == gcd, where gcd is the greatest
 5     common divisor of a and b.
 6 
 7     This function implements the extended Euclidean
 8     algorithm and runs in O(log b) in the worst case.
 9     """
10     s, old_s = 0, 1
11     t, old_t = 1, 0
12     r, old_r = b, a
13 
14     while r != 0:
15         quotient = old_r // r
16         old_r, r = r, old_r - quotient * r
17         old_s, s = s, old_s - quotient * s
18         old_t, t = t, old_t - quotient * t
19 
20     return old_r, old_s, old_t
21 
22 
23 def inverse_of(n, p):
24     """
25     Returns the multiplicative inverse of
26     n modulo p.
27 
28     This function returns an integer m such that
29     (n * m) % p == 1.
30     """
31     gcd, x, y = extended_euclidean_algorithm(n, p)
32     assert (n * x + p * y) % p == gcd
33 
34     if gcd != 1:
35         # Either n is 0, or p is not a prime number.
36         raise ValueError(
37             '{} has no multiplicative inverse '
38             'modulo {}'.format(n, p))
39     else:
40         return
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值