matlab有限域多项式除法_ECC椭圆曲线加密算法:有限域和离散对数

本文介绍了如何在MATLAB中进行有限域(整数模p)上的椭圆曲线操作,包括点的加法、乘法、模p的除法,以及椭圆曲线的阶、子群的阶和离散对数问题。讨论了ECC加密算法的基础,强调了离散对数问题在椭圆曲线密码学中的重要性和难度。
摘要由CSDN通过智能技术生成

f78c69ce4868da2a6b342fe39b82ac4e.png

Hi all,我来翻译第二篇啦。若大家发现那些翻译的不够准确还望指出,不胜感激。首先放上原文链接:

http://andrea.corbellini.name/2015/05/23/elliptic-curve-cryptography-finite-fields-and-discrete-logarithms/​andrea.corbellini.name

在上一篇文章里,我们已经展示了在实数域上的椭圆曲线在“群”上是如何使用的。尤其是,我们还针对“加”(point addition) 定义了一个规则:对于在一条线上的三个点,他们的和是0(P+Q+R=0). 我们也推出了一个几何方法和代数方法去计算这些点的加法。

然后呢,我们介绍了标量积(scalar multiplication) (nP=P+P+...+P),我们还发现了一个“简单的”算法去计算这些标量积。double and add

整数域模p

首先,有限域是一个带有有限元素的集合。比如,有一个有限域是整数模p的集合(integers mod p,p是素数),可表示为

,我们一般用后者。

在这个有限域中,我们有两个二元操作:加(+)和乘( * )。这两种操作都是封闭的,满足结合律和交换律,[这块的封闭应当这样理解:在有限域中,两个数的加和乘的结果仍然在这个有限域中。--译者注] 且含有一个独一无二的单位元,对于所有的有限域里的元素,都有一个独一无二的相反数。最后,乘法还满足分配律:

整数模p的集合包含所有从0到

的整数。加法和乘法都按模数运算规则去计算。这里有一些
的例子:
  • 加:
  • 减:
  • 乘:
  • 加法逆元:
    的确:
  • 乘法逆元:
    的确:

如果这些式子你觉得不太能理解,那么你可能需要一些关于模运算的入门指导,请参考:Khan Academy.

就如我前面提到的,整数模p是一个域,因此上面列的所有属性都是满足的。请注意p是素数这个条件很重要!比如 整数模4的集合就不是域:2没有乘法逆元(

无解)。

模p的除法

我们即将定义在

上的椭圆曲线,但是在这之前我们需要弄清在
代表什么?可以简单表示为:
等于x 乘上 y的逆元。这个解释给了我们基本的做除法的方法:1.求逆元,2.做乘法。

用欧几里得拓展算法来计算乘法逆元非常的“简单易做”,它的时间复杂度是

(或者是
如果考虑bit长度的话) 在最坏的情况下。 这里不会给出欧几里得拓展算法的细节,但是放上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(
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值