Методы и средства защиты компьютерной информации
Все нулевые строки остаются без изменений. В строках i = 1,2,3 байты циклически сдвигаются влево на cLb, i позиций: с позиции с номером j на позицию с номером j - cLb, i mod Lb, где значение cLb, i определяется по таблице 10.
Таблица 10. Размер сдвига строк в операции ShiftRow
Lb | <
cLb,2 |
cLb,3 | |
4 |
1 |
2 |
3 |
6 |
1 |
2 |
3 |
8 |
1 |
3 |
4 |
При обратном преобразовании позиция с номером j в строках i = 1,2,3 сдвигается на позицию с номером j + cLb, i mod Lb.
2.4 ПРЕОБРАЗОВАНИЕ MixColumn
После того как выполнена последняя построчная перестановка, на следующем шаге каждый столбец (bi,j) блока текста, где i = 0, .,3, j = 0, .,Lb, представляется в виде полинома над полем F28 и умножается на фиксированный полином a (x) = а3x3 + а2x2 + а1x + a0 с коэффициентами a0 (x) =x, a1 (x) = 1, a2 (x) = 1, a3 (x) = х + 1. Затем вычисляется остаток от деления полученного произведения на модуль М (х) = х4 + 1. Таким образом, каждый байт столбца взаимодействует со всеми остальными байтами столбца. При построковом преобразовании ShiftRow на каждом раунде байты взаимодействуют друг с другом в других комбинациях. То есть эти две операции дают сильное перемешивание.
Этот шаг можно свести к умножению на матрицу:
Умножение на '02' (соответственно на х) мы уже реализовали в виде функции xtime (см. таблицу 3). Умножение на '03' (соответственно на х + 1) тоже сделано по аналогии.
Для обращения преобразования MixColumn умножаем каждый столбец (bi,j) блока текста на полином г (х) = r3х3 + r2х2 + r1х + r0 с коэффициентами r0 (х) =х3 + х2 + х, r1 (х) = х3 + 1, r2 (х) = х3 + х2 + 1, r3 (х) = х3 + х + 1 и приводим результат по модулю М (х) = х4 + 1. Соответствующая матрица имеет вид:
2.5 СЛОЖЕНИЕ С КЛЮЧОМ РАУНДА
На последнем шаге цикла раундовый ключ складывается по модулю 2 с блоком текста:
2.6 ПОЛНАЯ ПРОЦЕДУРА ЗАШИФРОВАНИЯ БЛОКА
Зашифрование по алгоритму Rijndael реализуется в виде следующего псевдокода. Аргументы обрабатываются как указатели на поля байтов или четырехбайтовых слов. Интерпретация полей, переменных и функций дана в таблицах 11-13.
Таблица 11
Интерпретация переменных
Переменные |
Интерпретация |
Nk |
Длина Lk секретного ключа пользователя в четырехбайтовых словах |
Nb |
Длина Lb блока в четырехбайтовых словах |
Nr |
Число раундов Lr в соответствии с таблицами выше |
Таблица 12
Интерпретация полей
Переменные |
Размер в байтах |
Интерпретация |
CipherKey |
4*Nk |
Секретный ключ пользователя |
ExpandedKey |
4*Nb* (Nr+1) |
Поле четырехбайтовых слов под развертку ключа |
Rcon |
é4*Nb* (Nr+1) /Nkù |
Поле четырехбайтовых слов под константы c (j) = (rc (j), 0, 0, 0) |
State |
4*Nb |
Поле ввода открытого текста и вывода зашифрованного текста |
RoundKey |
4*Nb |
Раундовый ключ, фрагмент ExpandedKey |
Таблица 13
Интерпретация функций
Функция |
Интерпретация |
KeyExpansion |
Генерация раундового ключа |
RotByte |
Сдвиг четырехбайтового слова влево на 1 байт: (abcd) ® (bcda) |
ByteSub |
Подстановка в S-блоке всех байтов поля |
Round |
Обычный раунд |
FinalRound |
Последний раунд без преобразования MixColumn |
ShiftRow |
Преобразование ShiftRow |
MixColumn |
Преобразование MixColumn |
AddRoundKey |
Сложение с ключом раунда |
Генерация ключа при Lk < 8:
KeyExpansion (byte CipherKey, word ExpandedKey)
{
for (i = 0; i < Nk; i++)
ExpandedKey [i] = (CipherKey [4*i], CipherKey [4*i + 1], CipherKey [4*i + 2], CipherKey [4*i + 3]);
for (i = Nk; i<Nb* (Nr+1); i++)
{
temp = ExpandedKey [i - 1] ; if (i% Nk == 0)
temp = ByteSub (RotByte (temp)) ^Rcon [i/Nk] ; ExpandedKeyp] = ExpandedKey [i - Nk] ^temp;
}
}
Генерация ключа при Lk = 8:
KeyExpansion (byte CipherKey, word ExpandedKey)
{
for (i = 0; i < Nk; i++)
ExpandedKey [i] = (CipherKey [4*i], CipherKey [4*i + 1], CipherKey [4*i + 2], CipherKey [4*i + 3]);
for (i = Nk; i < Nb * (Nr + 1); i++)
{
temp = ExpandedKey [i - 1] ; if (i% Nk == 0)
temp = ByteSub (RotByte (temp)) ^Rcon [i/Nk] ; else if (i% Nk == 4)
temp = ByteSub (temp); ExpandedKey [i] = ExpandedKey [i - Nk] ^temp;
}
}
Раундовые функции:
Round (word State, word RoundKey)
{
ByteSub (State);
ShiftRow (State); MixColumn (State); AddRoundKey (State, RoundKey)
FinalRound (word State, word RoundKey) {
ByteSub (State);
ShiftRow (State);
AddRoundKey (State, RoundKey)
}
Полная процедура зашифрования блока текста:
Rijndael (byte State, byte CipherKey)
{
KeyExpansion (CipherKey, ExpandedKey);
Другие рефераты на тему «Программирование, компьютеры и кибернетика»:
Поиск рефератов
Последние рефераты раздела
- Основные этапы объектно-ориентированного проектирования
- Основные структуры языка Java
- Основные принципы разработки графического пользовательского интерфейса
- Основы дискретной математики
- Программное обеспечение системы принятия решений адаптивного робота
- Программное обеспечение
- Проблемы сохранности информации в процессе предпринимательской деятельности