【发布时间】:2019-01-04 13:19:20
【问题描述】:
我正在使用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
这是我手独奏的更好格式:
那么哪里错了?是我手动解决的吗?还是在pyfinite?如何解决?
【问题讨论】:
-
您能否再格式化和/或注释您的手工数学?我很难跟上它。已经有一段时间了,但我遵循了Wikipedia's 的指导并像 pyfinite 一样得到了 0xdc。 (编辑:我猜这更像是一个数学问题而不是编程问题。)
-
@glibdud 只需一分钟,让我的手解决得更好
-
@glibdud 我按照你的要求做了并更新了我的问题,包括手动解决乳胶详细格式
-
怎么知道模数是0x11B?
-
@MattTimmermans 这是我们几天前在大学学习的方式,但我不知道我是否误解了这里的总结:在 AES 的 MixColumns 阶段将任何数字 X 乘以 03 时,我们将 X 乘以 02然后用 X 异或。将 X 乘以 2 如下:我们将 X 转换为二进制表示,如果它是 1 或 0,我们查看最左边的位,然后将 X 向左移动 1,如果最左边的位是 1,则将其与 0x1B 进行异或运算。我不知道我是否将我们所学的内容与我在网上阅读的关于 AES 的内容混淆了我认为我们所学的是乘以 GF(2^8) 的快捷方式
标签: python aes finite-field