Раздел: Документация
0 ... 96 97 98 99 100 101 102 ... 169 Применение этой операции ко всем четырем столбцам состояния обозначено как MixColumn(State). Рисунок 4 демонстрирует применение MixColumn к состоянию.
вс(х)
Рисунок 4. MixColumn действует на столбцы состояния Добавление циклового ключе В данной операции цикловой ключ добавляется к состоянию посредством простого EXOR. Цикловой ключ вырабатывается из ключа шифрования посредством алгоритма выработки ключей (key schedule). Длина циклового ключа равна длине блока Nb. Преобразование, содержащее добавление посредством EXOR циклового ключа к состоянию, обозначено как RoundKey). Оно проиллюстрировано на рисунке 5. 299
Рисунок 5. При добавлении ключа цикловой ключ складывается посредством EXOR с состоянием Алгоритм выработки ключей (Key Schedule) Цикловые ключи получаются из ключа шифрования посредством алгоритма выработки ключей. Он содержит два компонента: расширение ключа (Key Expansion) и выбор циклового ключа (Round Key Selection). Основополагающие принципы алгоритма выглядят следующим образом: ♦ Общее число бит цикловых ключей равно длине блока, умноженной на число циклов плюс 1 (например, для длины блока 128 бит и 10 циклов требуется 1408 бит циклового ключа). ♦Ключ шифрования расширяется в Расширенный Ключ (Expanded Key). ♦Цикловые ключи берутся из Расширенного ключа следующим образом: первый цикловой ключ содержит первые Nb слов, второй - следующие Nb слов и т. д. Расширение ключа (Key Expansion) Расширенный ключ представляет собой линейный массив 4-байтовых слов и обозначен как W[Nb*(Nr+l)]. Первые Nk слов содержат ключ шифрования. Все остальные слова определяются рекурсивно из слов с меньшими индексами. Алгоритм выработки 300 ключей зависит от величины Nk: ниже приведена версия для Nk, равного или меньшего 6, и версия для Nk, большего 6. Для Nk<6 или Nk=6 мы имеем: KeyExpansion(CipherKey,W) { for (i = 0; i < Nk;W[i] = CipherKey [i] ; for (j = Nk; j <Nb*(Nk+l); j+=Nk) I W[j] = W[j-Nk] Л SubByte( Rotl ( W[j-1] ) ) Rcon[j/Nk]; for (i = 1; i < Nk && i+j < Nb* (Nr+1) ; W[i+j] = W[i+j-Nk] Л W[i+j-l]; 1 Как можно заметить, первые Nk слов заполняются ключом шифрования. Каждое последующее слово W[i] получается посредством EXOR предыдущего слова W[i-11 и слова на Nk позиций ранее W[i-Nk]. Для слов, позиция которых кратна Nk, перед EXOR применяется преобразование к W[i-l], а затем еще прибавляется цикловая константа. Преобразование содержит циклический сдвиг байтов в слове, обозначенный как Rotl, затем следует SubByte - применение замены байт. Для Nk>6 мы имеем: KeyExpansion(CipherKey,W) { for (i=0; i.<Nk;W [1]-CipherKey [i] ; for .U-Nk-; j,<Nb* (Nk+1) ; j + = Nk) { W[j] = W[j-Nk] Л SubByte(Rotl(W[j-l] ) ) Rcon[j/Nk]; for (i=l; i<4; i++) W[i+j] = W[i+j-Nk] Л W[i+j- 1] ; W[j+4] = W[j+4-Nk] Л SubByte (W[j+3]) ; for (i=5; i<Nk; i++) W[i+j] = H[i+j-Nk] л W[i+j- 1]; } } 301 0 ... 96 97 98 99 100 101 102 ... 169
|