Дипломная работа: Интегральная атака против блочного симметричного шифра Crypton
{
W[j] = W[j-Nk] ^ SubByte(Rotl(W[j-1])) ^ Rcon[j/Nk];
for (i=1; 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] = W[i+j-Nk] ^ W[i+j-1];
}
}
Отличие для схемы при Nk>6 состоит в применении SubByte для каждого 4-го байта из Nk.
Цикловая константа независит от Nk и определяется следующим образом:
Rcon[i] = ( RC[i], '00' , '00' , '00' ),
ГдеRC[0]='01', RC[i]=xtime(Rcon[i-1])
i-ый цикловой ключ получается из слов массива циклового ключа от W[Nb*i] и доW[Nb(i+1)]. Это показано на рисунке 1.9
Рисунок 1.9 Расширение ключа и выбор циклового ключа для Nb=6 и Nk=4.
Алгоритм выработки ключей можно осуществлять и без использования массива W[Nb*(Nr+1)]. Для реализаций, в которых существенно требование к занимаемой памяти, цикловые ключи могут вычисляться на лету посредством использования буфера из Nk слов. Шифр Rijndael состоит из:
- Начального добавления циклового ключа;
- Nr-1 циклов;
- заключительного цикла.
На псевдо-Си это выглядит следующим образом:
Rijndael (State, CipherKey)
{
KeyExpansion(CipherKey, ExpandedKey); // Расширениеключа
AddRoundKey(State, ExpandedKey); // Добавлениецикловогоключа
For ( i=1 ; i<Nr ; i++) Round(State,ExpandedKey+Nb*i); // циклы
FinalRound(State, ExpandedKey+Nb*Nr); // заключительныйцикл
}
Если предварительно выполнена процедура расширения ключа, то Rijndael будет выглядеть следующим образом:
Rijndael (State, CipherKey)
{