Key Selection). Основоположні принципи алгоритму виглядають таким чином:
· Загальне число біт циклових ключів дорівнює довжині блоку, помноженої на число циклів плюс 1 (наприклад, для довжини блоку 128 біт і 10 циклів потрібно 1408 біт циклового ключа).
· Ключ шифрування розширюється в Розширений Ключ (Expanded Key).
· Циклові ключі беруться з Розширеного ключа таким чином: перший циклової ключ містить перші Nb слів, другий - наступні Nb слів і т.д.
Розширення ключа (Key Expansion).
Розширений ключ являє собою лінійний масив 4-ех байтових слів і позначений як W [Nb * (Nr +1)]. Перші Nk слів містять ключ шифрування. Всі інші слова визначаються рекурсивно із слів з меншими індексами. Алгоритм вироблення ключів залежить від величини Nk: нижче наведена версія для Nk рівного або меншого 6 і версія для Nk більшого 6.Для Nk <6 або Nk=6 ми маємо:
KeyExpansion (CipherKey, W
{(i=0; i
{[j]=W [j-Nk] ^ SubByte (Rotl (W [j - 1])) ^ Rcon [j / Nk]; (i=1; i
}
}
Як можна помітити, перші Nk слів заповнюються ключем шифрування. Кожне наступне слово W [i] виходить за допомогою EXOR попереднього слова W [i - 1] і слова на Nk позицій раніше W [i-Nk]. Для слів, позиція яких кратна Nk, перед EXOR застосовується перетворення до W [i - 1], а потім ще додається циклова константа. Перетворення містить циклічний зсув байтів в слові, позначений як Rotl, потім слід SubByte - застосування заміни байт. Для Nk> 6 ми маємо:
(CipherKey, W)
{(i=0; i
for (j=Nk; j
{[j]=W [j-Nk] ^ SubByte (Rotl (W [j - 1])) ^ Rcon [j / Nk]; (i=1; i <4; i + + ) W [i + j]=W [i + j-Nk] ^ W [i + j - 1]; [j +4]=W [j +4- Nk] ^ SubByte (W [j +3]) ; (i=5; i
}
}
Відмінність для схеми при Nk> 6 полягає у застосуванні SubByte для кожного 4-го байта з Nk. Циклова константа незалежить від Nk і визначається наступним чином:
Rcon [i]=(RC [i], «00», «00», «00») (2.4)
де: RC [0]=«01» [i]=xtime (Rcon [i - 1])
Вибір циклового ключа.ий циклової ключ виходить із слів масиву циклового ключа від W [Nb * i] і доW [Nb (i +1)]. Це показано на малюнку 2.12.
Рис 2.12: Розширення ключа і вибір циклового ключа для Nb=6 і Nk=4.
Зауваження: Алгоритм вироблення ключів можна здійснювати і без використання масиву W [Nb * (Nr +1)]. Для реалізацій, в яких істотно вимога до займаної пам'яті, циклові ключі можуть обчислюватися на льоту за допомогою використання буфера з Nk слів.
Шифр ??Rijndael складається з:
· початкового додавання циклового ключа;
· Nr - 1 циклів;
· заключного циклу.
На псевдо-Сі це виглядає наступним чином:
Rijndael (State, CipherKey)