2

我正在使用pyfinte在它使用的 F(2^8) 字段上计算 AES 的乘法,但是当我执行以下操作时:

from pyfinite import ffield

a = 0xbf
b = 0x03
F = ffield.FField(8)
c = F.Multiply(a, b)
print(hex(c))

实际结果是 0xdc 但它应该是 0xda 这是我手动解决的方法:

0xbf*0x03 = 0xbf * 0x02 + 0xbf * 0x01 = 0b10111111 * 0x02 + 0xbf = 0b01111110 + 0x1B + 0xbf = 0b11011010 = 0xda

这是我手独奏的更好格式:

在此处输入图像描述

那么哪里错了?是我手动解决的吗?还是在pyfinite?如何解决这个问题?

4

2 回答 2

3

我对 AES 并不十分熟悉,但从您提供的链接看来,该字段的生成多项式似乎是 0x11b。默认情况下,pyfinite 使用不同的生成器,这将产生不同的乘法结果:

>>> f = ffield.FField(8)
>>> hex(f.generator)
'0x11d'

如果您在创建字段对象时指定生成器,则会得到您期望的结果:

>>> f = ffield.FField(8, gen=0x11b, useLUT=0)
>>> hex(f.Multiply(0xbf, 0x03))
'0xda'
于 2019-01-04T15:45:11.450 回答
0

问题是 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
于 2021-08-11T17:07:39.947 回答