
3.1.2.Генерация ключевой последовательности
Ключ шифрования выбирается из случайной последовательности бит и его размер равен 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.