pyfinite дает неправильный результат для умножения в поле GF (2 ^ 8) - PullRequest
0 голосов
/ 04 января 2019

Я использую pyfinte для вычисления умножения для AES для поля, которое оно использует, которое равно F (2 ^ 8), но когда я делаю следующее:

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

вот лучший формат решения моей руки:

enter image description here

так где же не так? это на моем решении вручную? или в пифините? как решить это?

1 Ответ

0 голосов
/ 04 января 2019

Я не очень хорошо знаком с 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'
...