1

我将如何在 Python 3 的 GF2^8 中实现乘法逆?我当前的功能如下所示:

def gf_add(a, b):
    return a ^ b

def gf_mul(a, b, mod=0x1B):
    p = bytes(hex(0x00))
    for i in range(8):
        if (b & 1) != 0:
            p ^= a
        high_bit_set = bytes(a & 0x80)
        a <<= 1
        if high_bit_set != 0:
            a ^= mod
        b >>= 1
    return p
4

2 回答 2

3

这是我的做法:

def gf_degree(a) :
  res = 0
  a >>= 1
  while (a != 0) :
    a >>= 1;
    res += 1;
  return res

def gf_invert(a, mod=0x1B) :
  v = mod
  g1 = 1
  g2 = 0
  j = gf_degree(a) - 8

  while (a != 1) :
    if (j < 0) :
      a, v = v, a
      g1, g2 = g2, g1
      j = -j

    a ^= v << j
    g1 ^= g2 << j

    a %= 256  # Emulating 8-bit overflow
    g1 %= 256 # Emulating 8-bit overflow

    j = gf_degree(a) - gf_degree(v)

  return g1

该函数gf_degree计算多项式的次数,并且gf_invert自然地反转 GF(2^8) 的任何元素,当然除了 0。的实现gf_invert遵循关于找到有限域元素的乘法逆的“教科书”算法。

例子

print(gf_invert(5))   # 82
print(gf_invert(1))   #  1
print(gf_invert(255)) # 28

这是一个现场演示

正如评论中提到的,您也可以使用对数方法,或者简单地使用蛮力(尝试每种乘法组合)。

于 2017-08-01T17:46:02.320 回答
2

您可能会查看我的libgf2 模块(没有其他人实际使用过)并使用GF2Element

from libgf2 import GF2Element

x = GF2Element(0x8, 0x11B)
x.inv 
# find the inverse of x^3 in the quotient ring GF(2)[x]/p(x)
# where p(x) = x^8 + x^4 + x^3 + x + 1 (0x11B in bit vector format)

有关更多详细信息,请参阅此博客文章


注意:libgf2 在 Python 2.7 中,因此您必须移植到 Python 3,但它是一个相当小的库。

于 2017-08-15T22:56:53.947 回答