Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
16.04.2013
Размер:
286.21 Кб
Скачать

Приложение b. Спецификация алгоритма Rijndael.

Rijndael представляет собой итеративный блочный шифр, имеющий переменную длину блоков и различные длины ключей. Длина ключа и длина блока могут быть независимо друг от друга 128, 192 или 256 бит.

Замечание: в данном разделе объясняется структура шифра и он не является руководством для реализации. Об аспектах реализации мы говорим отдельно в соответствующем разделе.

1 "Состояние", Ключ шифрования и Число Циклов.

Разнообразные преобразования работают с промежуточным результатом, называемым Состоянием (State).

Определение: промежуточный результат шифрования назовем Состоянием (State)

Состояние можно представить в виде прямоугольного массива байтов. Этот массив имеет 4 строки, а число столбцов обозначено как Nb и равно длине блока, деленной на 32.

Ключ шифрования также представлен в виде прямоугольного массива с четырьмя строками. Число столбцов обозначено как Nk и равно длине ключа, деленной на 32. Это показано на рисунке 1.

Внекоторых случаях ключ шифрования показан как линейный массив 4-байтовых слов. Слова состоят из 4 байтов, которые находятся в одном столбце (при представлении в виде прямоугольного массива).

Рисунок1. Пример представления Состояния (Nb=6) и Ключа шифрования (Nk=4)

Входные данные для шифра ( "открытый текст", если используется режим шифрования ECB) обозначаются как байты состояния в порядке a0,0, a1,0, a3,0, a0,1, a1,1, a3,1 ,a4,1 ... После завершения действия шифра выходные данные получаются из байтов состояния в том же порядке.

Число циклов обозначено какNr и зависит от значений Nb и Nk. Оно приведено в Таблице 1.

Таблица 1: Число циклов (Nr) как функция от длины ключа и длины блока.

2 Цикловое преобразование

Цикловое преобразование состоит из четырех различных преобразований. На псевдо-Си это выглядит следующим образом:

Round (State, RoundKey)

{

ByteSub(State); // замена байт

ShiftRow(State); // сдвиг строк

MixColumn(State); // замешивание столбцов

AddRoundKey(State, RoundKey); // добавление циклового ключа

}

Последний цикл шифра немного отличается. Вот как он выглядит:

FinalRound(State, RoundKey)

{

ByteSub(State); // замена байт

ShiftRow(State); // сдвиг строк

AddRoundKey(State, RoundKey); // добавление циклового ключа

}

В приведенной записи, "функции" - Round, ByteSub и т.д. выполняют свои действия над массивами, указатели (т.е. State, RoundKey) на которые им передаются.

Как можно заметить, последний цикл отличается от простого цикла только отсутствием замешивания столбцов. Каждое из приведенных преобразований разобрано далее.

2.1 Замена байт (ByteSub)

Преобразование ByteSub представляет собой нелинейную замену байт, выполняемуюю независимо с каждым байтом состояния. Таблицы замены (или S-блоки) являются инвертируемыми и построены из композиции двух преобразований:

1. Первое - получение обратного элемента относительно умножения в поле GF(28), описанного в разделе 2.1. '00' переходит сам в себя.

2. Применение афинного преобразования (над GF(2)), определнного как:

y0

=

1

1

1

1

1

0

0

0

*

x0

+

0

y1

0

1

1

1

1

1

0

0

x1

1

y2

0

0

1

1

1

1

1

0

x2

1

y3

0

0

0

1

1

1

1

1

x3

0

y4

1

0

0

0

1

1

1

1

x4

0

y5

1

1

0

0

0

1

1

1

x5

0

y6

1

1

1

0

0

0

1

1

x6

1

y7

1

1

1

1

0

0

0

1

x7

1

Применение описанного S-блока ко всем байтам состояния обозначено как ByteSub(State). Рисунок 2 иллюстрирует применение преобразования ByteSub к состоянию.

Рисунок 2: ByteSub действует на каждый байт состояния.