Генерация ключевой последовательности
Ключ шифрования выбирается из случайной последовательности бит и его размер равен 128, 192 или 256 бит. Размеры блока данных и ключа шифрования могут быть выбраны независимо. Их соотношение определяется в соответствии с таблицей «число раундов шифрования». В каждом раунде используется свой раундовый ключ Кr и их массив генерируется из ключа шифрования пользователя с использованием описанной ниже процедуры "развертывания" ключа.
Как и блок данных и ключ может быть представлен в виде массива байтов:
K = (k1, k 2, ... , k nk ), nk - размер ключа в байтах, nkÎ {16, 24, 32}.
Алгоритм развертывания ключа оперирует 32-битовыми ключевыми словами Ki, интерпретируя их как четырехбайтовые массивы:
Ki = (ki0, ki1, ki2, ki3), | kij | = 8 бит.
Первые q = nK /4 ключевых слов получаются простым разделением ключа K на 4-байтовые фрагменты аналогично тому, как байтами шифруемого блока заполняются столбцы матрицы данных:
K 0 = (k 0, k 1, k 2, k 3),
K 1 = (k 4, k 5, k 6, k 7),
..................................
K q-1 = (k nk -4, k nk -3, k nk -2, k nk -1),
Необходимое число ключевых элементов на 1 больше числа раундов r, каждый ключевой элемент по размеру равен блоку данных (nB байт) и содержит qk = nk/4 ключевых слов. Таким образом, всего необходимо Q = (r+1)*qk ключевых слов. Например, для длины блока 128 бит и 10 раундов требуется 1408 бит ключа. Первые q ключевых слов составлены из байтов ключа пользователя как показано выше, остальные Q - q вырабатываются по следующему алгоритму:
При размере ключа 16 или 24 байта (qÎ{4,6}) используется следующая итерационная формула:
а при размере ключа 32 байта (q = 8) следующая формула:
В приведенных выше формулах использованы следующие обозначения:
· S(K) - побайтовая замена 32-битового слова, т.е. замена всех четырех входящих в него байтов с использованием штатного узла замен S шифра:
если K = (k0, k1, k2, k3), то S(K) = (S[k0], S[k1], S[k2], S[k3]);
· R - циклический сдвиг 4-байтового вектора на один элемент влево:
если K = (k0, k1, k2, k3), то Rß (K) = (k1, k2, k3, k0);
· Pj - 4-байтовый вектор (раундовая константа), задаваемый следующей формулой:
Pj = (02 j-1, 00, 00, 00), где возведение в степень выполняется в ранее описанном конечном поле GF(28).
Pj-1 = (00, 02 j-2, 00, 00), j = i/q.
Таким образом, все усложняющее преобразование может быть представлено в следующей форме:
S(Rß (K)) Å Pj = (S[k1] Å 02 j-1, S[k2], S[k3], S[k0]).
Как видно из приведенных выше соотношений, ключевые слова вырабатываются порциями, по размеру равными ключу, причем первое слово каждой порции вырабатывается по усложненной схеме с использованием приведенного выше нелинейного преобразования, а остальные - простым побитовым суммированием непосредственно предшествующего элемента с элементом, имеющим тот же порядковый номер в предыдущей порции ключевых слов. При размере ключа 256 бит (32 байта) усложнение используется также и при выработке каждого пятого элемента порции - при нумерации с нуля он имеет индекс 4 в группе из q слов.
Каждые последовательно выработанные qB ключевых слов, включая те, что получены непосредственно из ключа, объединяются в раундовые ключи:
Kr0 = (K0, K1,…, Kqb-1),
Kr1 = (K qb, K qb+1,…, K2qb-1),
..........................................
Krr = (K rqb, K rqb+1,…, KQ).
Алгоритм выработки ключей и выбор раундовых ключей показан
на рис. 3.5.
Рис.3.5. Развертывание ключа и выбор раундовых ключей для Nb = 6 и Nk = 4.
Дешифрование
Дешифрование в Rijndael алгоритмически эквивалентно шифрованию, однако между этими двумя процедурами имеются определенные различия, гораздо более существенные, чем в стандарте DES, где все сводится к порядку использования ключевых элементов. Дешифрование отличается от шифрования по следующим четырем пунктам:
1. Ключевые элементы используются в порядке, обратном тому, в котором они используются при шифровании. Кроме того, все ключевые элементы, кроме первого и последнего, должны быть умножены слева на матрицу, обратную матрице M. Таким образом, если при шифровании используется следующая последовательность ключевых элементов
Kr0, Kr1, Kr2, ... , Krr-1, Krr,
то при дешифровании должна быть использована следующая последовательность элементов:
Krr, M -1× Krr-1, ... , M -1× Krr-2, M -1× Krr-1, Kr0.
2. На шаге побайтовой замены используется узел замен S-1 обратный тому, что применяется в процедуре шифрования S. Таблица узла замен S-1 приведена в приложении 5, таблица 2. Это означает, что каково бы ни было байтовое значение b, всегда справедливо следующее соотношение:
S -1[S[b]] = b.
3. На шаге построчного вращения матрицы данных осуществляется циклический сдвиг строк на то же самое количество элементов, что и при шифровании, но в обратную сторону - вправо. Либо, в силу свойств операции циклического сдвига, можно осуществить вращение строк матрицы в ту же сторону, что и при шифровании, т.е. влево, но на другое количество элементов, вычисляемое по следующей формуле:
Сi' = n - Ci,i = 2¸4.
Константы циклического сдвига влево строк матрицы в процедуре дешифрования в зависимости от числа столбцов матрицы данных приведены
в следующей ниже таблице:
Nb | |||
С2' | |||
С3' | |||
С4' |
4. На шаге умножения слева на постоянную матрицу используется матрица M -1, обратная используемой при шифровании матрице M:
М -1 = | 0E | 0B | 0D | |
0E | 0B | 0D | ||
0D | 0E | 0B | ||
0B | 0D | 0E |
Для выработки ключевой последовательности используется такая же схема, что и при шифровании. При дешифровании необходимо выработать ту же самую последовательность элементов, переставить их в обратном порядке, и все элементы, кроме крайних, умножить слева на матрицу M -1, как это указано в соответствующем разделе.
Процесс дешифрования по стандарту AES показан в приложении 6.
Ключевая последовательность K длиной 128 (192, 256) бит данных поступает на блок расширения ключа БРК, где формируется ключевая последовательность из 4-х байтовых слов, из которой в дальнейшем берутся раундовые ключи. Исходный массив зашифрованного блока данных С длиной 128 (192, 256) бит, поступает на схему сложения по модулю 2, где производится сложение по модулю 2 с раундовым ключом блока Krr . Над данными в блоке S -1 осуществляется преобразование нелинейной замены байт, результат которого поступает на блок циклического сдвига вправо, где осуществляется построчное вращение матрицы данных (сдвиг строк вправо). Результат данной операции заносится в блок памяти БП. С выхода блока БП массив данных складывается по модулю 2 в соответствующем блоке с последующим раундовым ключом Krr-1 блока БРК. В блоке *M -1 производится умножение массива данных предшествующего блока на постоянную матрицу М-1. После преобразований в блоках S -1 и циклического сдвига вправо результат заносится опять в БП. Данное преобразование повторяется (r-1) раз, где r – число раундов. Результат дешифрования блока C формируется на входе схемы сложения по модулю 2, где производится сложение результата (r -1) – числа преобразований с последним раундовым ключом блока БРК. После схемы сложения по модулю 2 будет получен открытый текст М.