Современные системы шифрования (Лабораторная работа № 1), страница 9

Это преобразование может быть записано в матричном виде: :

 для .                                (9)

На рисунке показано преобразование MixColumns().

Операция MixColumns

Рисунок –  Преобразование MixColumns производит операции столбец за столбцом

В результате умножения четыре байта столбца замещаются следующим образом:

;

;

;

.

Преобразование AddRoundKey(). В преобразовании AddRoundKey() раундовый ключ добавляется к состоянию с использованием операции «исключающего или». Преобразование может быть записано как

, ,                                (10)

где  – ключевые слова, а  – значение в диапазоне . Для шифрования, начальный ключ используется когда , перед применением раундовой функции.

Действие преобразования показано на рисунке, где .

Операция AddRoundKey

Рисунок – Применение операции «исключающее или» для каждого столбца состояния и ключевого слова

Генерация раундовых ключей. Алгоритм AES использует ключ шифрования,  и производит генерацию раундовых ключей. Всего генерируется  слов: алгоритм требует начальное множество из  слов, и каждый из  раундов требует  слов ключевых данных. Результирующий массив ключей состоит из линейного массива 4-байтовых слов, обозначаемых как , где  принадлежит диапазону . Псевдокод генерации ключей показан на рисунке.

KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)

begin

word temp

i = 0

while (i < Nk)

w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3])

i = i+1

end while

i = Nk

while (i < Nb * (Nr+1)]

temp = w[i-1]

if (i mod Nk = 0)

temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]

else if (Nk > 6 and i mod Nk = 4)

temp = SubWord(temp)

end if

w[i] = w[i-Nk] xor temp

i = i + 1

end while

  end

Рисунок –  Псевдокод генерации раундовых ключей

SubWord() является функцией, на вход которой подается четырехбайтовое слово и применяется S-box подстановка. Результатом являются 4 байта выходного результата. Функция RotWord() получает слово , производит циклическую перестановку и возвращает слово . Раундовый массив констант Rcon[i] содержит значения , где  – степени  ( определен как  в поле ).

Важным моментом является то, что процедура генерации раундовых ключей для 256-битовых ключей () сильно отличается от процедур для 128- и 192-битовых ключей. Если  и  является множителем , тогда SubWord() применяется к  перед операцией «исключающее или».

Инверсное шифрование. Порядок шагов в шифрующем преобразовании может быть заменен на обратный для формирования процедуры расшифрования в алгоритме AES. На рисунке показан псевдокод инверсного шифрования.

InvCipher(bytein[4*Nb], byteout[4*Nb], wordw[Nb*(Nr+1)])

begin

byte state[4,Nb]

state = in

AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])

for round = Nr-1 step -1 downto 1

InvShiftRows(state)

InvSubBytes(state)

AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])

InvMixColumns(state)

    end for

InvShiftRows(state)

InvSubBytes(state)

AddRoundKey(state, w[0, Nb-1])

out = state

  end

Рисунок –  Псевдокод инверсного шифрования

Преобразование InvShiftRows(). Преобразование InvShiftRows() является обратным для ShiftRows(). Байты последних трех рядов состояния циклически сдвигаются на различное количество байт. Первый ряд  не сдвигается. Нижние три ряда циклически сдвигаются на  байт,  где  значение  смещения  рассчитывается по (7).

Преобразование InvShiftRows() может быть представлено как

, ,                                              (11)

Операция InvShiftRows

Рисунок – Преобразование InvShiftRows() смещает последние три ряда состояния

Преобразование InvSubBytes(). Преобразование InvSubBytes() является обратным к замене байтов,  т.е.  обратной подстановкой (inverse S-box). Таблица этого преобразования показана на рисунке.

InverseSbox

Рисунок – Таблица обратной подстановки S-box: подставляемые значения для байта xy