【问题标题】:AES MixColumns with PythonAES MixColumns 与 Python
【发布时间】:2021-02-10 20:42:17
【问题描述】:

我正在尝试在 python 中创建一个 aes 混合列函数。但结果并不如预期。我做错了什么?

我在这里测试第一列。

[2, 3, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 3, 1, 1, 2]
[0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255]

print((0*2)^(17*3)^(34*1)^(51*1))
print((0*1)^(17*2)^(34*3)^(51*1))
print((0*1)^(17*1)^(34*2)^(51*3))
print((0*3)^(17*1)^(34*1)^(51*2))

结果如下:

34
119
204
85

我认为预期的结果是:

34
119
0
85

是预期的结果错了还是我做错了?

【问题讨论】:

  • 0 确实正确,而不是 204,因为这不是普通的乘法,而是模不可约多项式 x^8 + x^4 + x^3 + x + 1, s。 herehere。后一个链接还包含您可以移植的实现。
  • 我很难理解这种情况下的计算结果。你能告诉我如何改变我的计算得到0而不是204吗? @Topaco
  • 我已经发布了所需乘法的可能实现,请参阅我的回答。

标签: python aes


【解决方案1】:

在发布的代码中,乘法执行错误。乘法是伽罗瓦域中的模不可约多项式 x8 + x4 + x3 + x + 1 GF (28)。这在 Wikipedia 文章 Rijndael MixColumns 中有详细描述。在这里您还可以找到各种实现。另一个更容易理解的描述可以在How to solve MixColumns?帖子的接受答案中找到。

在下面的实现中,乘法(1、2和3)在函数gmul()中实现:

def mixColumns(a, b, c, d):
    printHex(gmul(a, 2) ^ gmul(b, 3) ^ gmul(c, 1) ^ gmul(d, 1))
    printHex(gmul(a, 1) ^ gmul(b, 2) ^ gmul(c, 3) ^ gmul(d, 1))
    printHex(gmul(a, 1) ^ gmul(b, 1) ^ gmul(c, 2) ^ gmul(d, 3))
    printHex(gmul(a, 3) ^ gmul(b, 1) ^ gmul(c, 1) ^ gmul(d, 2))
    print()

def gmul(a, b):
    if b == 1:
        return a
    tmp = (a << 1) & 0xff
    if b == 2:
        return tmp if a < 128 else tmp ^ 0x1b
    if b == 3:
        return gmul(a, 2) ^ a

def printHex(val):
    return print('{:02x}'.format(val), end=' ')

# test vectors from https://en.wikipedia.org/wiki/Rijndael_MixColumns#Test_vectors_for_MixColumn()
mixColumns(0xdb, 0x13, 0x53, 0x45) # 0x8e 0x4d 0xa1 0xbc
mixColumns(0xf2, 0x0a, 0x22, 0x5c) # 0x9f 0xdc 0x58 0x9d
mixColumns(0x01, 0x01, 0x01, 0x01) # 0x01 0x01 0x01 0x01 
mixColumns(0xc6, 0xc6, 0xc6, 0xc6) # 0xc6 0xc6 0xc6 0xc6 
mixColumns(0xd4, 0xd4, 0xd4, 0xd5) # 0xd5 0xd5 0xd7 0xd6 
mixColumns(0x2d, 0x26, 0x31, 0x4c) # 0x4d 0x7e 0xbd 0xf8

# example from question
mixColumns(0, 17, 34, 51) # 0x22 0x77 0x00 0x55 = 34 119 0 85

输出:

8e 4d a1 bc 
9f dc 58 9d 
01 01 01 01 
c6 c6 c6 c6 
d5 d5 d7 d6 
4d 7e bd f8 
22 77 00 55 

前 6 行是来自维基百科文章的test vectors 的结果。最后一行对应于已发布问题的示例:0x22、0x77、0x00、0x55 或 34、119、0、85 十进制。如您所见,第三个值是 0 而不是 204。

【讨论】:

    【解决方案2】:

    看来你做错了:(0*1)^(17*1)^(34*2)^(51*3) 的答案是204

    • (0*1) = 00000000
    • (17*1) = 00010001
    • (34*2) = 01000100
    • (51*3) = 10011001

    然后在这些行上应用 XOR 运算符会导致:11001100

    如果两个位中只有一个为 1,则 XOR 运算符将每个位设置为 1。这意味着对于每个位,如果有奇数个 1,则结果位将设置为 1。

    如果这个答案不能帮助您理解为什么答案是204,请解释您是如何计算 0 的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2013-11-06
      • 2020-12-31
      • 1970-01-01
      相关资源
      最近更新 更多