在 Python 中实施 Rijndael MixColums 时遇到问题
Trouble Implementing Rijndael MixColums in Python
我正在尝试在 python 中为 AES 实现 MixColumns 算法,但我遇到了一些麻烦。这是我的代码:
def multiply(b,a):
if b == 1:
return a
if b == 2:
return ((a<<1)&0xff)^0x1b
if b == 3:
return (((a<<1)&0xff)^0x1b)^a
s_mat1 = [np.copy(s) for s in s_mat]
for i in range(len(s_mat)):
for j in range(len(s_mat[i])):
s_mat[i][j] = multiply(mx_col[i][0],s_mat1[0][j])^multiply(mx_col[i][1],s_mat1[1][j])^multiply(mx_col[i][2],s_mat1[2][j])^multiply(mx_col[i][3],s_mat1[3][j])
这里s_mat
是state矩阵,mx_col
是mixcolumn矩阵。我为这个例子试过这段代码:
但是我的代码给出的答案与给定的不同。这是我的代码给出的答案:
[['ba', '84', 'e8', '1b'], ['6e', 'a4', '8d', '5b'], ['f4', '96', '6', '7d'], ['61', '29', 'e', '46']]
第一行正确。但为什么其他行出错了?我做错了什么?
为了
代码中没有考虑大小写区分:XOR
和 0x1b
仅针对 a > 127
、here 执行。这改变了案例 b == 2
和 b == 3
:
def multiply(b,a):
if b == 1:
return a
tmp = (a<<1) & 0xff
if b == 2:
return tmp if a < 128 else tmp^0x1b
if b == 3:
return tmp^a if a < 128 else (tmp^0x1b)^a
通过此更改,获得了预期的结果。
为了解密,我们可以使用这个代码,它使用topaco的代码并使用永久乘法计算9、11、13和14,
我们可以将 14 重写为 ((2+1)*2+1)*2 所以它的等效代码是 (multiply(2,multiply(2,multiply(2,a)^a)^a)):
def multiply(b,a):
if b == 1:
return a
tmp = (a<<1) & 0xff
if b == 2:
return tmp if a <= 127 else tmp^0x1b
if b == 3:
return tmp^a if a <= 127 else (tmp^0x1b)^a
if b== 9:
return multiply(2,multiply(2,multiply(2,a)))^a
if b== 11:
return multiply(2,multiply(2,multiply(2,a))^a)^a
if b==13:
return multiply(2,multiply(2,(multiply(2,a)^a)))^a
if b==14:
return multiply(2,multiply(2,multiply(2,a)^a)^a)
我正在尝试在 python 中为 AES 实现 MixColumns 算法,但我遇到了一些麻烦。这是我的代码:
def multiply(b,a):
if b == 1:
return a
if b == 2:
return ((a<<1)&0xff)^0x1b
if b == 3:
return (((a<<1)&0xff)^0x1b)^a
s_mat1 = [np.copy(s) for s in s_mat]
for i in range(len(s_mat)):
for j in range(len(s_mat[i])):
s_mat[i][j] = multiply(mx_col[i][0],s_mat1[0][j])^multiply(mx_col[i][1],s_mat1[1][j])^multiply(mx_col[i][2],s_mat1[2][j])^multiply(mx_col[i][3],s_mat1[3][j])
这里s_mat
是state矩阵,mx_col
是mixcolumn矩阵。我为这个例子试过这段代码:
[['ba', '84', 'e8', '1b'], ['6e', 'a4', '8d', '5b'], ['f4', '96', '6', '7d'], ['61', '29', 'e', '46']]
第一行正确。但为什么其他行出错了?我做错了什么?
为了
代码中没有考虑大小写区分:XOR
和 0x1b
仅针对 a > 127
、here 执行。这改变了案例 b == 2
和 b == 3
:
def multiply(b,a):
if b == 1:
return a
tmp = (a<<1) & 0xff
if b == 2:
return tmp if a < 128 else tmp^0x1b
if b == 3:
return tmp^a if a < 128 else (tmp^0x1b)^a
通过此更改,获得了预期的结果。
为了解密,我们可以使用这个代码,它使用topaco的代码并使用永久乘法计算9、11、13和14, 我们可以将 14 重写为 ((2+1)*2+1)*2 所以它的等效代码是 (multiply(2,multiply(2,multiply(2,a)^a)^a)):
def multiply(b,a):
if b == 1:
return a
tmp = (a<<1) & 0xff
if b == 2:
return tmp if a <= 127 else tmp^0x1b
if b == 3:
return tmp^a if a <= 127 else (tmp^0x1b)^a
if b== 9:
return multiply(2,multiply(2,multiply(2,a)))^a
if b== 11:
return multiply(2,multiply(2,multiply(2,a))^a)^a
if b==13:
return multiply(2,multiply(2,(multiply(2,a)^a)))^a
if b==14:
return multiply(2,multiply(2,multiply(2,a)^a)^a)