问题是 AES 对其扩展域使用不可约但不是原始的多项式。大多数扩展字段使用原始多项式,因此这x
是该字段的原始元素。我想这就是 pyfinite 的默认设置。
相反,AESx^8 + x^4 + x^3 + x + 1
用作其不可约多项式,并x + 1
用作原始元素(或乘法群的生成器)。
虽然我不知道 pyfinite 的详细信息,但我创建了一个类似的库 galois,它扩展了 NumPy 数组以对 Galois 字段进行操作。它支持任意大小的数组算术、伽罗瓦域矩阵上的线性代数、伽罗瓦域上的多项式等。该库是用 Python 编写的,但使用 Numba 进行 JIT 编译,因此数组算法与本机 NumPy 一样快。
这是一个做你想做的事的例子。
In [1]: import galois
In [2]: GF = galois.GF(2**8, irreducible_poly=0x11b)
In [3]: print(GF.properties)
GF(2^8):
characteristic: 2
degree: 8
order: 256
irreducible_poly: x^8 + x^4 + x^3 + x + 1
is_primitive_poly: False
primitive_element: x + 1
In [4]: a = GF(0xbf); a
Out[4]: GF(191, order=2^8)
In [5]: b = GF(0x03); b
Out[5]: GF(3, order=2^8)
In [6]: a * b
Out[6]: GF(218, order=2^8)
In [7]: 0xda
Out[7]: 218