在发布的代码中,乘法执行错误。乘法是伽罗瓦域中的模不可约多项式 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。