Проблемы с реализацией Rijndael MixColums в Python - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь реализовать алгоритм MixColumns для AES в python, но у меня возникли некоторые проблемы. Вот мой код:

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 - это матрица состояний, а mx_col - матрица миксколонн. Я попробовал этот код для этого примера: enter image description here Однако мой код дает ответ, отличный от данного. вот ответ, полученный моим кодом:

[['ba', '84', 'e8', '1b'], ['6e', 'a4', '8d', '5b'], ['f4', '96', '6', '7d'], ['61', '29', 'e', '46']]

Первый ряд корректен. Но почему другие строки идут не так? какую ошибку я делаю?

1 Ответ

1 голос
/ 30 марта 2020

Для есть различие в регистре, которое не было учтено в коде: XOR с 0x1b выполняется только для a >= 127, здесь . Это изменяет случаи b == 2 и b == 3:

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

С этим изменением получен ожидаемый результат.

...