Блочные шифры работают с данными фиксированного размера, преобразуя открытый текст в зашифрованный блок одинаковой длины при помощи секретного ключа. В случае AES (Advanced Encryption Standard) размер блока строго фиксирован и составляет 128 бит, что эквивалентно 16 байтам. Любое сообщение перед обработкой разбивается на такие блоки, после чего каждый блок проходит серию преобразований, называемых раундами.
Основная модель AES основана на сети подстановок и перестановок (Substitution-Permutation Network, SPN). Эта структура обеспечивает сочетание двух ключевых криптографических принципов: запутывания (confusion) и рассеивания (diffusion). Запутывание достигается нелинейными заменами байтов, а рассеивание — перемешиванием данных внутри блока.
В AES входной 128-битный блок рассматривается не как одномерная последовательность, а как матрица размером 4×4 байта:
[ ]
Эта структура называется state (состояние). Все операции AES применяются именно к этой матрице, а не к линейному массиву байтов.
Все байтовые операции AES выполняются в конечном поле Галуа ( GF(2^8) ). Каждый байт интерпретируется как многочлен степени не выше 7 с коэффициентами в ( {0,1} ).
Например, байт 0x57 соответствует многочлену:
[ x^6 + x^4 + x^2 + x + 1]
Умножение в этом поле производится по модулю неприводимого многочлена:
[ x^8 + x^4 + x^3 + x + 1]
Эта алгебраическая структура обеспечивает устойчивость к линейному анализу и является основой операции MixColumns.
Каждый раунд AES (кроме последнего) состоит из четырёх ключевых этапов:
Каждый байт состояния заменяется через нелинейную таблицу подстановок S-box. S-box построен на основе:
Эта комбинация обеспечивает сильную нелинейность и устойчивость к линейному и дифференциальному криптоанализу.
Строки матрицы состояния циклически сдвигаются:
Это создаёт межколоночное рассеивание данных.
Каждый столбец матрицы рассматривается как вектор и умножается на фиксированную матрицу в ( GF(2^8) ):
[ ]
Эта операция обеспечивает сильное перемешивание байтов внутри столбца. Умножение на числа 2 и 3 выполняется через сдвиги и XOR в поле Галуа, а не как обычная арифметика.
На каждом раунде состояние XOR-ится с раундовым ключом:
[ state = state roundKey]
Это единственный этап, зависящий от секретного ключа, и он вводит криптографическую зависимость между ключом и состоянием.
Исходный ключ AES расширяется в набор раундовых ключей. Количество раундов зависит от длины ключа:
Процесс расширения включает:
Каждый новый 32-битный блок ключа зависит от предыдущих, что создаёт цепную зависимость и предотвращает простую структуру ключей.
Для расшифрования используются обратные операции:
Структура AES симметрична: расшифрование выполняет обратные преобразования в обратном порядке раундов.
Сильные стороны AES как блочного шифра:
Комбинация подстановок и линейных преобразований формирует сложную систему, в которой изменение одного бита входа влияет на множество битов выхода уже через несколько раундов.
В реализациях криптографии на JavaScript, включая Stanford JavaScript Crypto Library, AES обычно реализуется максимально близко к спецификации FIPS-197. Основные особенности практической реализации:
В таких библиотеках, как SJCL, AES интегрирован как базовый примитив для режимов шифрования (CBC, CTR), где сам блочный шифр выступает ядром, а режимы обеспечивают обработку сообщений произвольной длины.
Без SubBytes шифр превращался бы в линейную систему, поддающуюся решению через линейную алгебру. Без MixColumns и ShiftRows влияние одного байта оставалось бы локальным, что делало бы анализ структуры тривиальным.
Совместное действие всех четырёх операций формирует эффект лавины: изменение одного бита входа приводит к изменению значительной части выходного блока после нескольких раундов.