Лабораторная работа: Методы и средства защиты компьютерной информации
{
KeyExpansion (CipherKey, ExpandedKey);
AddRoundKey (State, ExpandedKey);
for (i = 1; i < Nr; i++)
Round (State, ExpandedKey + Nb*i);
FinalRound (State, ExpandedKey + Nb*Nr);
}
Раундовый ключ можно заготовить и вне функции Rijndael, a вместо ключа пользователя CipherKey использовать развертку ключей ExpandedKey. Преимущества такого варианта очевидны, когда для зашифрования текста длиной более одного блока нужно несколько раз вызывать функцию Rijndael с одним и тем же ключом пользователя.
Rijndael (byteState, byteExpandedKey)
{
AddRoundKey (State, ExpandedKey);
for (i = 1; i < Nr; i++) Round (State, ExpandedKey + Nb*i);
FinalRound (State, ExpandedKey + Nb*Nr);
}
Для 32-разрядных процессоров раундовое преобразование лучше вычислять заранее и хранить результаты в виде таблиц. Заменяя операции перестановки и умножения на матрицу обращением к таблице, мы значительно сокращаем время работы как при зашифровании, так и (как будет видно позже) при расшифровании. С помощью таблиц вида
каждая из которых содержит по 256 четырехбайтовых слов (здесь w = 0,...,255; S (w) - S -блок подстановки), преобразование блока j = 0,..., Lb - 1, можно быстро выполнить как
,
где (см. ShiftRow) и - j-йстолбец раундового ключа.
На последнем раунде преобразование MixColumn не выполняется, поэтому результат получается как
Конечно, можно воспользоваться таблицей из 256 четырехбайтовых слов, тогда
где r (a,b,c,d) = (d,a,b, с) - циклический сдвиг вправо на один байт.д.ля приложений с ограниченной памятью этот вариант чрезвычайно удобен, немного увеличится лишь время вычислений, необходимое для выполнения трех сдвигов.
2.7 РАСШИФРОВАНИЕ
При расшифровании алгоритмом Rijndael процесс зашифрования выполняется в обратном порядке с обратными преобразованиями. Вотэтиобратныефункции:
InvFinalRound (word State, word RoundKey)
{
AddRoundKey (State, RoundKey);
InvShiftRow (State);