Расширенный ключ представляет собой линейный массив 4-байтовых слов и обозначается как W[Nb * (Nr + 1)]. Функция расширения ключа зависит от Nk. Существует две версии - для Nk < 6 и для Nk > 6. Для Nk < 6:
KeyExpansion(byte Key[4*Nk], word W[Nb*(Nr+l)]) {
for(i = 0;i
W[i] = (Key[4*i],Key[4*i+l],Key[4*i+2],Key[4*i+3]);
for(i = Nk; i < Nb * (Nr + 1); i++) {
temp = W[i- 1];
if(i%Nk == 0)
temp = SubByte(RotByte(temp)) ^ Rcon[i / Nk]; W[i] = W[i - Nk] ^ temp;
}
}
Здесь SubByte(W) - функция, возвращающая слово, в котором каждый байт является результатом применения блока замены шифра к байту, находящемуся на соответствующей позиции во входном слове. Функция RotByte(W) - циклический сдвиг байтов в слове, так что входное слово (а, b, с, d) преобразуется в слово (b, с, d, a).
Для Nk > 6 алгоритм выглядит так:
KeyExpansion(byte Key[4*Nk], word W[Nb*(Nr+l)]) {
for(i = 0; i < Nk; i++)
W[i] = (key[4*i],key[4*i+l],key[4*i+2],key[4*i+3]);
for(i = Nk; i < Nb * (Nr + 1); i++) {
temp = W[i - 1];
if(i%Nk == 0)
temp = SubByte(RotByte(temp)) ^ Rcon[i / Nk];
else if(i%Nk == 4)
temp = SubByte(temp); W[i] = W[i - Nk] ^ temp;
}
}
Константы итерации Rcon не зависят от Nk и определяются как
Rcon[i] = (RC[i], '00', '00', '00'),
где RC[i] являются представлениями элементов поля GF(28) со значениями х j-1 , т.е. RC[1] = 1 (т.е. '01'), и RC[i] = х (т.е. '02')*RC[i-1].
Не плохой подарок на новый год будет http://duhi.ua/shop/escentric-molecule/.
|