Лабораторная работа: Методы и средства защиты компьютерной информации
}
Если порядок функций не менять, то их можно переопределить:
AddRoundKey (State, RoundKey);
InvRound (word State, word RoundKey)
{
InvByteSub (State);
InvShiftRow (State);
InvMixColumn (State);
AddRoundKey (State, InvMixColumn (RoundKey));
}
InvFinalRound (word State, word RoundKey)
{
InvByteSub (State);
InvShiftRow (State);
AddRoundKey (State, RoundKey);
}
Отсюда получаем структуру, аналогичную зашифрованию. Из соображений эффективности в процедуре lnvRound () отложим применение функции InvMixColumn к раундовому ключу до вычисления развертки, в которой первый и последний раундовые ключи из InvMixColumn оставим без изменений. "Обратные" раундовые ключи генерируются процедурой
InvKeyExpansion (byteCipherKey, wordInvEpandedKey)
{
KeyExpansion (CipherKey, InvExpandedKey);
for (i = 1; i < Nr; i++)
InvMixColumn (InvExpandedKey + Nb*i);
}
Теперьполнаяпроцедурарасшифрованиявыглядиттак:
InvRijndael (byte State, byte CipherKey)
{
InvKeyExpansion (CipherKey, InvExpandedKey);
AddRoundKey (State, InvExpandedKey + Nb*Nr);
for (i = Nr-1; i>0; i--)