Нелинейное преобразование.
Нелинейное преобразование F матрицы данных состоит из трех шагов: замены байтов матрицы на новые значения (S[]), циклического сдвига строк матрицы влево (), умножения матрицы данных слева на постоянную матрицу-циркулянт M:
X' = F(X) = M(S(X)). 
Схема преобразования данных показана на рисунке 3, схема соответствующего алгоритма - на рисунке 4.

Рис. 3. Схема нелинейного преобразования блока данных.	 	
Рис. 4. Схема алгоритма нелинейного преобразования.	
Все входные (X), выходные (X') и промежуточные (Y, Z) значения преобразования являются матрицами байтов одинакового размера 4n. Функция преобразования последнего раунда 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], 1i4, 1jn,
где 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). Тильдой (знаком "~") обозначена операция побитового дополнения своего аргумента.
Естественно, указанная выше формула для построения узла замен не предназначена для использования непосредственно во время шифрования - гораздо эффективнее использовать уже готовый узел замен, приведенный в следующей таблице:
 	x0	x1	x2	x3	x4	x5	x6	x7	x8	x9	xA	xB	xC	xD	xE	xF	
0x	63	7c	77	7b	f2	6b	6f	c5	30	01	67	2b	fe	d7	ab	76	
1x	ca	82	c9	7d	fa	59	47	f0	ad	d4	a2	af	9c	a4	72	c0	
2x	b7	fd	93	26	36	3f	f7	cc	34	a5	e5	f1	71	d8	31	15	
3x	04	c7	23	c3	18	96	05	9a	07	12	80	e2	eb	27	b2	75	
4x	09	83	2c	1a	1b	6e	5a	a0	52	3b	d6	b3	29	e3	2f	84	
5x	53	d1	00	ed	20	fc	b1	5b	6a	cb	be	39	4a	4c	58	cf	
6x	d0	ef	aa	fb	43	4d	33	85	45	f9	02	7f	50	3c	9f	a8	
7x	51	a3	40	8f	92	9d	38	f5	bc	b6	da	21	10	ff	f3	d2	
8x	cd	0c	13	ec	5f	97	44	17	c4	a7	7e	3d	64	5d	19	73	
9x	60	81	4f	dc	22	2a	90	88	46	ee	b8	14	de	5e	0b	db	
Ax	e0	32	3a	0a	49	06	24	5c	c2	d3	ac	62	91	95	e4	79	
Bx	e7	c8	37	6d	8d	d5	4e	a9	6c	56	f4	ea	65	7a	ae	08	
Cx	ba	78	25	2e	1c	a6	b4	c6	e8	dd	74	1f	4b	bd	8b	8a	
Dx	70	3e	b5	66	48	03	f6	0e	61	35	57	b9	86	c1	1d	9e	
Ex	e1	f8	98	11	69	d9	8e	94	9b	1e	87	e9	ce	55	28	df	
Fx	8c	a1	89	0d	bf	e6	42	68	41	99	2d	0f	b0	54	bb	16	
Заменяющее значение выбирается на пересечении строки, определяемой старшей 16-ричной цифрой заменяемого значения, и столбца, определяемого его младшей цифрой.
Построчное вращение матрицы.
В ходе данной операции каждая строка матрицы данных, кроме первой, вращается (циклически сдвигается) влево на определенное число позиций, зависящее от номера строки и от размера блока данных:
,   1i4, 1jn. 
Первая строка всегда остается на месте: С1 = 0, для нее приведенная выше формула существенно упрощается: z1j = y1j. Ниже в таблице приведены величины сдвига для строк матрицы со второй по четвертую в зависимости от числа столбцов n в матрице:
n	4	6	8	
С2	1	1	1	
С3	2	2	3	
С4	3	3	4	
Умножение на постоянную матрицу.
На этом шаге матрица данных слева умножается на постоянную матрицу-циркулянт M:
X = MX,
.
При выполнении матричного умножения операции сложения и умножения элементов обеих матриц выполняются в конечном поле GF(28). Матрица M является циркулянтом: каждая ее строка получается циклическим сдвигом предыдущей строки вправо на один элемент. Элементы матрицы выбраны таким образом, чтобы свести к минимуму трудоемкость операции умножения: в ней присутствуют лишь небольшие по значению числа 01, 02 и 03, половина элементов - единичные, т.е. реального умножения выполнять для них не требуется. Этим самым обеспечивается высокая эффективность возможных реализаций этой операции.
Следует добавить, что операция умножения в конечном поле GF(28) является достаточно трудоемкой в программной реализации и никаким образом не сводится к обычному арифметическому умножению. Если умножение двоичных чисел реализуется сдвигами и обычным арифметическим суммированием, то умножение полиномов над полем GF(2) - теми же сдвигами и побитовым суммированием по модулю 2. Однако в шифре Rijndael одним из множителей всегда является константа и размер операндов невелик - один байт. Это позволяет реализовать умножение на константу в поле GF(28) как замену, что существенно повышает эффективность программной реализации. Для каждого множителя-константы при этом требуется свой отдельный узел замен. Напротив, наиболее эффективной аппаратной реализацией этой операции является реализация в виде серии сдвигов и побитовых сложений по модулю два в соответствие с ее непосредственным определением.