А.Винокуров. Серия "Энциклопедия блочных шифров".


Rijndael. Нелинейное преобразование.

На домашнюю страничку Список алгоритмов Основные параметры Основные параметры


Нелинейное преобразование F матрицы данных состоит из трех шагов: замены байтов матрицы на новые значения (S[]), циклического сдвига строк матрицы влево (<i><b>R</b></i><sub>--></sub>), умножения матрицы данных слева на постоянную матрицу-циркулянт M:

X' = F(X) = M*<i><b>R</b></i><sub>--></sub>(S(X)).

Схема преобразования данных показана на рисунке 3, схема соответствующего алгоритма - на рисунке 4.

[схема преобразования данных]

Рис. 3. Схема нелинейного преобразования блока данных.

  [схема алгоритма]

Рис. 4. Схема алгоритма нелинейного преобразования.

Все входные (X), выходные (X') и промежуточные (Y, Z) значения преобразования являются матрицами байтов одинакового размера 4*n. Функция преобразования последнего раунда F' отличается от регулярной функции преобразования F отсутствием шага умножения матрицы данных слева на постоянную матрицу, схема преобразования блока данных на последнем раунде и схема соответсвующего алгоритма приведены на рисунках 5 и 6 соответственно:

[схема преобразования данных]

Рис. 5. Схема нелинейного преобразования последнего раунда.

  [схема алгоритма]

Рис. 6. Схема алгоритма нелинейного преобразования последнего раунда.

Вся нелинейность преобразования сосредоточена в его первом шаге - замене, второй и третий шаги являются линейными. Первый шаг служит для перемешивания информации внутри байтов, второй обепечивает "экспорт" изменений в другие столбцы, третий осуществляет диффузию изменений в одном элементе матрицы на весь соответсвующий столбец. Таким образом, за два раунда достигается диффузия изменений в одном единственном бите на весь блок данных. Ниже каждый из указанных шагов рассмотрен подробно, при этом некоторые преобразования байтов определены в терминах операций в конечном поле GF(28), порожденном неприводимым полиномом m(x) над полем GF(2): m(x) = x8+x4+x3+x+1. Операция сложения в этом поле является ни чем иным, как побитовым суммированием по модулю 2, умножение в соответствие с определением поля выполняется как обычное умножение полиномов над GF(2) по модулю полинома m(x). При манипулировании с байтами данных как с элементами поля GF(28) каждый бит соответсвует слагаемому вида xi в соответсвии со старшинством бита в байте. Можно сказать, что если байт с целочисленным значением b представлен в виде полинома B(x), то справедливо b = B(2).

Побайтовая замена.

В ходе побайтовой замены каждый байт матрицы данных заменяется на новое значение того же размера, индексируя общий для всех байтов вектор замен S 8-в-8 бит:

yij = S[xij], 1 <= i <= 4, 1 <= j <= n,

где n - число столбцов матрицы данных - 4,6 или 8. Единственный узел замен в шифре Rijndael конструируется с помощью следующего алгебраического соотношения:

S[y] = (x4+x3+x2+x+1) + y-1*(x7+x6+x5+x4+1) mod (x8+1).

При этом обращение ненулевых байтов осуществляется в описанном выше конечном поле GF(28), для нулевого байта полагают 0-1 = 0. Таким образом, байтовая замена определяется как обращение элемента-байта в конечном поле GF(28), доопределенное для нулевого элемента поля, с последующим аффинным преобразованием результата. Коэффициенты этого преобразования выбраны таким образом, чтоб у полученного узла замен отсутсвовали точки неподвижности (S[y] = y), и "антинеподвижности" (S[y] = ~y). Тильдой (знаком "~") обозначена операция побитового дополнения своего аргумента.

Естественно, указанная выше формула для построения узла замен не предназначена для использования непосредственно во время шифрования - гораздо эффективнее использовать уже готовый узел замен, приведенный в следующей таблице:

 x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF
0x637c777bf26b6fc53001672bfed7ab76
1xca82c97dfa5947f0add4a2af9ca472c0
2xb7fd9326363ff7cc34a5e5f171d83115
3x04c723c31896059a071280e2eb27b275
4x09832c1a1b6e5aa0523bd6b329e32f84
5x53d100ed20fcb15b6acbbe394a4c58cf
6xd0efaafb434d338545f9027f503c9fa8
7x51a3408f929d38f5bcb6da2110fff3d2
8xcd0c13ec5f974417c4a77e3d645d1973
9x60814fdc222a908846eeb814de5e0bdb
Axe0323a0a4906245cc2d3ac629195e479
Bxe7c8376d8dd54ea96c56f4ea657aae08
Cxba78252e1ca6b4c6e8dd741f4bbd8b8a
Dx703eb5664803f60e613557b986c11d9e
Exe1f8981169d98e949b1e87e9ce5528df
Fx8ca1890dbfe6426841992d0fb054bb16

Заменяющее значение выбирается на пересечении строки, определяемой старшей 16-ричной цифрой заменяемого значения, и столбца, определяемого его младшей цифрой.

Построчное вращение матрицы.

В ходе данной операции каждая строка матрицы данных, кроме первой, вращается (циклически сдвигается) влево на определенное число позиций, зависящее от номера строки и от размера блока данных:

[формула],   1 <= i <= 4, 1 <= j <= n.

Первая строка всегда остается на месте: С1 = 0, для нее приведенная выше формула существенно упрощается: z1j = y1j. Ниже в таблице приведены величины сдвига для строк матрицы со второй по четвертую в зависимости от числа столбцов n в матрице:

n468
С2111
С3223
С4334

Умножение на постоянную матрицу.

На этом шаге матрица данных слева умножается на постоянную матрицу-циркулянт M:

X = M x X,

[матрица] .

При выполнении матричного умножения операции сложения и умножения элементов обеих матриц выполняются в конечном поле GF(28). Матрица M является циркулянтом: каждая ее строка получается циклическим сдвигом предыдущей строки вправо на один элемент. Элементы матрицы выбраны таким образом, чтобы свести к минимуму трудоемкость операции умножения: в ней присутствуют лишь небольшие по значению числа 01, 02 и 03, половина элементов - единичные, т.е. реального умножения выполнять для них не требуется. Этим самым обеспечивается высокая эффективность возможных реализаций этой операции.

Следует добавить, что операция умножения в конечном поле GF(28) является достаточно трудоемкой в программной реализации и никаким образом не сводится к обычному арифметическому умножению. Если умножение двоичных чисел реализуется сдвигами и обычным арифметическим суммированием, то умножение полиномов над полем GF(2) - теми же сдвигами и побитовым суммированием по модулю 2. Однако в шифре Rijndael одним из множителей всегда является константа и размер операндов невелик - один байт. Это позволяет реализовать умножение на константу в поле GF(28) как замену, что существенно повышает эффективность программной реализации. Для каждого множителя-константы при этом требуется свой отдельный узел замен. Напротив, наиболее эффективной аппаратной реализацией этой операции является реализация в виде серии сдвигов и побитовых сложений по модулю два в соответствие с ее непосредственным определением.

На домашнюю страничку Список алгоритмов Основные параметры Основные параметры


[Список алгоритмов] [Основные характеристики] [Общая схема] [Нелинейное преобразование] [Расшифрование] [Эквивалентность за- и расшифрования] [Выработка ключевых элементов]
 
[Начало осмотра] [Что нового] [Статьи] [Выпуски в "Байтах"] [Что скачать] [Криптоалгоритмы] [Глоссарий] [Ссылки] [Гостевая книга] [Форум] [Напиши мне]

Подготовлено 08.06.01. (c) 2001 Андрей Винокуров.