【问题标题】:Generating reverse element in Galois Field在伽罗瓦域中生成反向元素
【发布时间】:2016-12-13 19:34:43
【问题描述】:

我有一个伽罗瓦域GF(2^409) 和不可约多项式 f(x) = x^409 + x^15 + x^6 + x + 1,其中系数只能为1或0

如果我有这个字段的一些元素a(x),我怎样才能找到反向元素a_1(x),这样

a(x) * a_1(x) = 1 (mod f(x))

使用扩展 Euklid 算法

  • 我正在使用多项式基础

  • 我知道用pow(a(x),2^409 - 2)可以找到a_1(x),但是我用的是Python,power操作太费时间了

  • 我在定义多项式下的除法运算时遇到了麻烦(没有它我无法使用扩展 Euklid 算法)

【问题讨论】:

标签: python algorithm math cryptography


【解决方案1】:

表示 GF(2k) 元素的一种常用方法是使用大整数(Python 2 中的long,Python 3 中的int)并让每一位代表一个系数。要执行多项式除法,您基本上可以按照使用笔和纸执行长除法的步骤进行操作。

让我们举一些更简单的例子。取模数为 x7 + x + 1 的 GF(27)。让我们试着找出 x6 + x 的倒数3 + x。所以你必须使用扩展欧几里得算法来计算这两个多项式的 GCD。第一步是计算彼此的商和余数。即度数大的除以度数小的。

x6 + x3 + x 是 1x6 + 0x5 + 0x4 + 1x3 + 0x2 + 1x1 + 0x0 或简称1 0 0 1 0 1 0 .按照相同的约定,模数为1 0 0 0 0 0 1 1。所以你分了

1 0 0 0 0 0 1 1 / 1 0 0 1 0 1 0 = 1 0 remainder 1 0 1 1 1
1 0 0 1 0 1 0
      1 0 1 1 1

那么我在这里做了什么?将 a 除以 b 我会在每一个中查找最高设置位,即多项式的次数。这些度数之间的差异有点我想在商中设置。在这种情况下,a 的次数为 7,而 b 的次数为 6。差为 1,因此商必须有项 x1。现在我写下 b 乘以该术语,在这种情况下,它只是 b 的二进制表示,左移了度数)。然后我从原始 a 中减去该移位值,但我在 ?2[x] 中进行减法,所以它实际上是一个 XOR 运算。结果是一个新数字,我在下一次迭代中将其用作 a 的值。我继续直到度数的差异变为负数,即我将一个较小的多项式除以一个较大的多项式。然后我就完成了,a 的最后一个值是我的余数。在上面的划分中,我一步完成了。

通过这个用余数除法的操作,你应该能够算出欧几里得算法。扩展版本将需要更多的工作,但试一试。最后,您应该能够发现,在上面给出的示例中,倒数是 x3 + x + 1(由 Sage 计算)。为了比较,原始字段 GF(2409) 中 x6 + x3 + x 的倒数将是

"+".join("x^{}".format(i) for i in range(409,-1,-1) if (1 << i) & 71418312917235914488287388787154746126088900129923309868417397199063993100653429184865046255190862140902867842544110449930)

我在 Sage 中计算的这个数字:

x = polygen(ZZ)
m = x^ 409 + x^15 + x^6 + x + 1
F409 = GF(2^409, name="z", modulus=p)
z = F409.gen()
(1/(z^6+z^3+z)).polynomial().change_ring(ZZ)(2)

【讨论】:

    【解决方案2】:

    您可以使用 SymPy 和 this awesome answer 处理有限域。

    您与n = 2 在环上Z/nZ,因此您想使用链接答案中的GF 类:

    >>> %time field = GF(2, 409)
    CPU times: user 1min 47s, sys: 6.64 ms, total: 1min 47s
    Wall time: 1min 47s
    

    如您所见,GF(2, 409) 的初始化相当长(~= 1-2 分钟)...
    ...但是乘法求逆的计算几乎是即时的:

    %%time
    
    import numpy as np
    
    # list of 410 coefficients regarding x^409 (left-most) up to x^0 (right-most)
    coeffs = [0] * 410 
    for idx in [0, 1, 6, 15, 409]: # exponents present in your polynome
        coeffs[409 - idx] = 1 # set to 1 to indicate existence
    
    li = []
    for i in range(4):
        '''
        To help SymPy make the polynome `x^409 + x^15 + x^6 + x + 1`,
        provide the `GF.inv()` method with its coefficients using `ZZ.map()`
        Actually, `inv()` will call `sympy.polys.galoistools.gf_gcdex()`
        '''
        coeffs = field.inv(ZZ.map(coeffs))
        li.append(np.array(coeffs))
    
    CPU times: user 37.3 ms, sys: 2 µs, total: 37.3 ms
    Wall time: 36 ms
    

    GF.inv() 返回的结果是反相系数的数组。 请注意,再次应用反演将恢复为原始多项式:

    >>> print(np.equal(li[0], li[2]).all() and np.equal(li[1], li[3]).all())
    True
    

    您还可以验证p(x) * p(x)^(-1) = 1

    >>> field.mul(li[0], li[1])
    [1] # Ok !
    

    以下是来自cited answer 的剥离代码,仅包含您需要的反转代码:

    import itertools
    from sympy.polys.domains import ZZ
    from sympy.polys.galoistools import (gf_irreducible_p, gf_gcdex)
    from sympy.ntheory.primetest import isprime
    
    class GF():
        def __init__(self, p, n=1):
            p, n = int(p), int(n)
            if not isprime(p):
                raise ValueError("p must be a prime number, not %s" % p)
            if n <= 0:
                raise ValueError("n must be a positive integer, not %s" % n)
            self.p = p
            self.n = n
            if n == 1:
                self.reducing = [1, 0]
            else:
                for c in itertools.product(range(p), repeat=n):
                  poly = (1, *c)
                  if gf_irreducible_p(poly, p, ZZ):
                      self.reducing = poly
                      break
    
        def inv(self, x):
            s, t, h = gf_gcdex(x, self.reducing, self.p, ZZ)
            return s
    
    
    GF(2, 409).inv(ZZ.map(coeffs))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-22
      • 2015-07-10
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多