Публикация федеральных стандартов обработки информации
Категория: компьютерная безопасность Подкатегория: криптография
Лаборатория информационных технологий
Национальный институт стандартов и технологий
Гейтерсберг, MD 20899-8900
Эта публикация доступна бесплатно по адресу:
https://doi.org/10.6028/NIST.FIPS.197-upd1
Опубликовано 26 ноября 2001 г.; обновлено 9 мая 2023 г.
Министерство торговли США
Дональд Л. Эванс, Секретарь
Управление технологий
Филлип Дж. Бонд, заместитель Секретаря по технологиям
Национальный институт стандартов и технологий
Карен Х. Браун, исполняющая обязанности директора
Серия публикаций федеральных стандартов обработки информации Национального института стандартов и технологий является официальной серией публикаций, относящихся к стандартам и руководствам, разработанным в соответствии с 15 U.S.C. 278g-3 и изданным Секретарём по торговле в соответствии с 40 U.S.C. 11331.
Комментарии относительно этой публикации Федерального стандарта обработки информации приветствуются, и их следует направлять с использованием контактной информации, указанной в пункте «Запросы и комментарии» раздела объявления.
Джеймс А. Сент-Пьер, исполняющий обязанности директора
Лаборатория информационных технологий
В 2000 году NIST объявил о выборе семейства блочных шифров Rijndael победителем конкурса Advanced Encryption Standard (AES). Блочные шифры являются основой для многих криптографических служб, особенно обеспечивающих гарантии конфиденциальности данных.
В настоящем Стандарте определены три представителя семейства Rijndael: AES-128, AES-192 и AES-256. Каждый из них преобразует данные блоками по 128 бит, а числовой суффикс указывает битовую длину соответствующих криптографических ключей.
Ключевые слова: AES; блочный шифр; конфиденциальность; криптография; шифрование; Rijndael.
Опубликовано: 26 ноября 2001 г.
Обновлено: 9 мая 2023 г.
Публикации федеральных стандартов обработки информации (FIPS) разрабатываются NIST в соответствии с 15 U.S.C. 278g-3 и издаются Секретарём по торговле в соответствии с 40 U.S.C. 11331.
| 1 | Введение | 1 |
| 2 | Определения | 2 |
| 2.1 | Термины и сокращения | 2 |
| 2.2 | Список функций | 3 |
| 2.3 | Параметры и символы алгоритма | 4 |
| 3 | Обозначения и соглашения | 5 |
| 3.1 | Входы и выходы | 5 |
| 3.2 | Байты | 5 |
| 3.3 | Индексирование последовательностей байтов | 5 |
| 3.4 | Состояние | 6 |
| 3.5 | Массивы слов | 7 |
| 4 | Математические основы | 8 |
| 4.1 | Сложение в GF(28) | 8 |
| 4.2 | Умножение в GF(28) | 8 |
| 4.3 | Умножение слов на фиксированную матрицу | 9 |
| 4.4 | Мультипликативные обратные в GF(28) | 10 |
| 5 | Спецификации алгоритма | 11 |
| 5.1 | CIPHER() | 12 |
| 5.1.1 | SUBBYTES() | 13 |
| 5.1.2 | SHIFTROWS() | 14 |
| 5.1.3 | MIXCOLUMNS() | 15 |
| 5.1.4 | ADDROUNDKEY() | 16 |
| 5.2 | KEYEXPANSION() | 17 |
FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)
| 5.3 | INVCIPHER() | 18 |
| 5.3.1 | INVSHIFTROWS() | 22 |
| 5.3.2 | INVSUBBYTES() | 23 |
| 5.3.3 | INVMIXCOLUMNS() | 24 |
| 5.3.4 | Обратное преобразование ADDROUNDKEY() | 24 |
| 5.3.5 | EQINVCIPHER() | 24 |
| 6 | Соображения по реализации | 26 |
| 6.1 | Требования к длине ключа | 26 |
| 6.2 | Ограничения на ключи | 26 |
| 6.3 | Расширения параметров | 26 |
| 6.4 | Рекомендации по реализации для различных платформ | 26 |
| 6.5 | Режимы работы | 27 |
| Ссылки | 28 | |
| Приложение A — Примеры расширения ключа | 29 | |
| A.1 | Расширение 128-битного ключа | 29 |
| A.2 | Расширение 192-битного ключа | 30 |
| A.3 | Расширение 256-битного ключа | 32 |
| Приложение B — Пример шифрования | 34 | |
| Приложение C — Примеры векторов | 36 | |
| Приложение D — Журнал изменений (информативный) | 37 |
vi
FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)
| Таблица 1 | Шестнадцатеричное представление 4-битных последовательностей | 5 |
| Таблица 2 | Индексы байтов и битов | 6 |
| Таблица 3 | Сочетания ключа, блока и числа раундов | 11 |
| Таблица 4 | SBOX(): значения подстановки для байта xy (в шестнадцатеричном формате) | 14 |
| Таблица 5 | Константы раундов | 17 |
| Таблица 6 | INVSBOX(): значения подстановки для байта xy (в шестнадцатеричном формате) | 23 |
| Рисунок 1 | Вход и выход массива состояния | 7 |
| Рисунок 2 | Иллюстрация SUBBYTES() | 13 |
| Рисунок 3 | Иллюстрация SHIFTROWS() | 15 |
| Рисунок 4 | Иллюстрация MIXCOLUMNS() | 16 |
| Рисунок 5 | Иллюстрация ADDROUNDKEY() | 16 |
| Рисунок 6 | KEYEXPANSION() AES-128 для генерации слов w[i] при 4 ≤ i < 44, где l принимает значения, кратные 4, от 0 до 36 | 19 |
| Рисунок 7 | KEYEXPANSION() AES-192 для генерации слов w[i] при 6 ≤ i < 52, где l принимает значения, кратные 6, от 0 до 42 | 20 |
| Рисунок 8 | KEYEXPANSION() AES-256 для генерации слов w[i] при 8 ≤ i < 60, где l принимает значения, кратные 8, от 0 до 48 | 21 |
| Рисунок 9 | Иллюстрация INVSHIFTROWS() | 23 |
| Алгоритм 1 | Псевдокод CIPHER() | 12 |
| Алгоритм 2 | Псевдокод KEYEXPANSION() | 18 |
| Алгоритм 3 | Псевдокод INVCIPHER() | 22 |
| Алгоритм 4 | Псевдокод EQINVCIPHER() | 25 |
| Алгоритм 5 | Псевдокод KEYEXPANSIONEIC() | 25 |
vii
Блок — это последовательность битов заданной фиксированной длины. Блочный шифр — это семейство перестановок блоков, параметризуемое последовательностью битов, называемой ключом.
В 1997 году NIST начал работу по разработке Advanced Encryption Standard (AES) [1] и призвал общественность представить кандидатные алгоритмы блочных шифров. Блочные шифры являются основой многих криптографических служб, особенно тех, которые обеспечивают гарантии конфиденциальности данных. В 2000 году NIST объявил о выборе Rijndael [2, 3] для AES.
Этот Стандарт определяет три реализации Rijndael: AES-128, AES-192 и AES-256, где суффикс указывает битовую длину ключа. Размер блока (то есть длина входных и выходных данных) в каждом случае составляет 128 битов. Rijndael поддерживает дополнительные размеры блоков и длины ключей, которые не приняты в этом Стандарте.
Этот Стандарт организован следующим образом:
1
В этом Стандарте используются следующие определения:
2
В этом Стандарте определены следующие функции:
3
4
FIPS 197 — ADVANCED ENCRYPTION STANDARD (AES)
Бит — это двоичная цифра: 0 или 1. Блок — это последовательность из 128 бит; входные и выходные данные для блочных шифров AES являются блоками. Другой входной величиной для блочных шифров AES, называемой ключом, является битовая последовательность, которая обычно устанавливается заранее и сохраняется при многих вызовах блочного шифра. Длины ключей для AES-128, AES-192 и AES-256 составляют 128 бит, 192 бита и 256 бит соответственно.
Основной единицей обработки в алгоритмах AES является байт — последовательность из восьми бит.
Значение байта обозначается конкатенацией восьми битов, заключённой в фигурные скобки (например, {10100011}). Когда биты байта обозначаются индексированной переменной, в настоящем Стандарте принято, что индексы убывают слева направо (то есть {b7 b6 b5 b4 b3 b2 b1 b0}).
Также удобно обозначать значения байтов шестнадцатеричной записью. Шестнадцать шестнадцатеричных символов представляют последовательности из четырёх битов, как указано в Таблице 1. Байт представляется упорядоченной парой шестнадцатеричных символов, где левый символ пары представляет четыре самых левых бита (то есть b7, b6, b5, b4), а правый символ пары представляет четыре самых правых бита (то есть b3, b2, b1, b0). Например, шестнадцатеричная форма байта {10100011} — {a3}.
| Последовательность | 0 0 0 0 | 0 0 0 1 | 0 0 1 0 | 0 0 1 1 | 0 1 0 0 | 0 1 0 1 | 0 1 1 0 | 0 1 1 1 |
|---|---|---|---|---|---|---|---|---|
| Символ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Последовательность | 1 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 1 1 0 0 | 1 1 0 1 | 1 1 1 0 | 1 1 1 1 |
| Символ | 8 | 9 | a | b | c | d | e | f |
Чтобы однозначно представлять входные данные и ключ как последовательности байтов, в настоящем Стандарте принято следующее соглашение об индексировании. Пусть задана последовательность из 8k битов:
r₀ r₁ r₂ … r₍₈ₖ₋₃₎ r₍₈ₖ₋₂₎ r₍₈ₖ₋₁₎ (3.1)
(для некоторого положительного целого числа k); байты aj для 0 ≤ j ≤ k − 1 определяются следующим образом:
aⱼ = {r₈ⱼ r₍₈ⱼ₊₁₎ … r₍₈ⱼ₊₇₎}. (3.2)
Так, например, блок данных
r₀ r₁ r₂ … r₁₂₅ r₁₂₆ r₁₂₇ (3.3)
представляется последовательностью байтов
a₀ a₁ a₂ … a₁₃ a₁₄ a₁₅, (3.4)
где
Как описано в разделе 3.2, биты внутри любого отдельного байта индексируются в убывающем порядке слева направо. Такой порядок более естественен для арифметики конечного поля над байтами, описанной в разделе 4. Два вида битовых индексов для последовательностей байтов показаны в Таблице 2.
| Битовый индекс в последовательности | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | … |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Байтовый индекс | 0 | 1 | … | ||||||||||||||
| Битовый индекс в байте | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | … |
Внутри алгоритмы для блочных шифров AES выполняются над двумерным массивом байтов (четыре на четыре), называемым состоянием. В массиве состояния, обозначаемом s, каждый отдельный байт имеет два индекса: индекс строки r в диапазоне 0 ≤ r < 4 и индекс столбца c в диапазоне 0 ≤ c < 4. Отдельный байт состояния обозначается либо sr,c, либо s[r,c].
В спецификациях алгоритмов блочного шифра AES в разделе 5 первым шагом является копирование входного массива байтов in0, in1, …, in15 в массив состояния s следующим образом:
s[r,c] = in[r + 4c] для 0 ≤ r < 4 и 0 ≤ c < 4. (3.6)
Затем к массиву состояния применяется последовательность преобразований, после чего его конечное значение копируется в выходной массив байтов out0, out1, …, out15 следующим образом:
out[r + 4c] = s[r,c] для 0 ≤ r < 4 и 0 ≤ c < 4. (3.7)
Соответствие между индексами входа и выхода и индексами массива состояния показано на Рисунке 1.

Слово — это последовательность из четырёх байтов; блок состоит из четырёх слов. Четыре столбца массива состояния s интерпретируются как массив v из четырёх слов следующим образом, в обозначениях Рисунка 1:
Таким образом, индекс столбца c массива s становится индексом для v, а индекс строки r массива s становится индексом для четырёх байтов в каждом слове.
Для одномерного массива слов u запись u[i] обозначает слово с индексом i, а последовательность из четырёх слов u[i], u[i + 1], u[i + 2], u[i + 3] обозначается u[i..i + 3].
Для некоторых преобразований алгоритмов AES, указанных в разделе 5, каждый байт в массиве состояния интерпретируется как один из 256 элементов конечного поля, также известного как поле Галуа, обозначаемого GF(28).1
Чтобы определить сложение и умножение в GF(28), каждый байт {b7 b6 b5 b4 b3 b2 b1 b0} интерпретируется как многочлен, обозначаемый b(x), следующим образом:
b(x) = b₇x⁷ + b₆x⁶ + b₅x⁵ + b₄x⁴ + b₃x³ + b₂x² + b₁x + b₀. (4.1)
Например, {01100011} представляется многочленом x6 + x5 + x + 1.
Чтобы сложить два элемента в конечном поле GF(28), коэффициенты многочленов, представляющих эти элементы, складываются по модулю 2 (то есть с операцией исключающего ИЛИ, обозначаемой ⊕), так что 1 ⊕ 1 = 0, 1 ⊕ 0 = 1 и 0 ⊕ 0 = 0.
Эквивалентно два байта можно сложить, применив операцию исключающего ИЛИ к каждой паре соответствующих битов в байтах. Таким образом, суммой {a7 a6 a5 a4 a3 a2 a1 a0} и {b7 b6 b5 b4 b3 b2 b1 b0} является {a7⊕b7 a6⊕b6 a5⊕b5 a4⊕b4 a3⊕b3 a2⊕b2 a1⊕b1 a0⊕b0}. (В разделе 5.1.4 это определение распространяется на слова.)
Например, следующие три представления сложения эквивалентны:
(x⁶ + x⁴ + x² + x + 1) + (x⁷ + x + 1) = x⁷ + x⁶ + x⁴ + x² (многочлен)
{01010111} ⊕ {10000011} = {11010100} (двоичное представление) (4.2)
{57} ⊕ {83} = {d4} (шестнадцатеричное представление).
Поскольку коэффициенты многочленов приводятся по модулю 2, коэффициент 1 эквивалентен коэффициенту −1, поэтому сложение эквивалентно вычитанию. Например, x4 + x2 представляет тот же элемент конечного поля, что и x4 − x2, −x4 + x2 и −x4 − x2. Аналогично, сумма любого элемента с самим собой является нулевым элементом.
Символ • обозначает умножение в GF(28). Концептуально это умножение определяется для двух байтов в два шага: 1) два многочлена, представляющие байты, перемножаются как многочлены и 2) результирующий многочлен приводится по модулю следующего фиксированного многочлена:
m(x) = x⁸ + x⁴ + x³ + x + 1. (4.3)
На обоих шагах отдельные коэффициенты многочленов приводятся по модулю 2.
Таким образом, если b(x) и c(x) представляют байты b и c, то b • c представляется следующим приведением по модулю их произведения как многочленов:
b(x)c(x) mod m(x). (4.4)
Приведение по модулю m(x) может применяться к промежуточным шагам при вычислении b(x)c(x); следовательно, полезно рассмотреть частный случай c(x) = x (то есть c = {02}). В частности, произведение b • {02} может быть выражено как функция от b, обозначаемая XTIMES(b), следующим образом:

Условия в формуле (4.5): первая строка — если b7 = 0; вторая строка — если b7 = 1.
Умножение на более высокие степени x (такие как {04}, {08} и {10}) может быть реализовано повторным применением XTIMES(). Например, пусть b = {57}:
Эти произведения облегчают вычисление любого кратного {57}. Например, поскольку {13} = {10}⊕{02}⊕{01}, следует, что
Два преобразования — MIXCOLUMNS() и INVMIXCOLUMNS() — в алгоритмах для блочных шифров AES могут быть выражены через умножение матриц. В частности, для каждого преобразования задаётся отдельная фиксированная матрица. Для обеих матриц каждая из 16 записей матрицы является байтом одного заданного слова, обозначаемого здесь [a0, a1, a2, a3].
Для входного слова [b0, b1, b2, b3] преобразования выходное слово [d0, d1, d2, d3] определяется арифметикой конечного поля следующим образом:
Матричная форма уравнения (4.8) имеет вид
Для байта b ≠ {00} его мультипликативным обратным является единственный байт, обозначаемый b−1, такой что
b • b⁻¹ = {01}. (4.10)
Определение преобразования SUBBYTES() в спецификациях блочного шифра AES включает мультипликативные обратные элементы в GF(28), которые можно вычислить следующим образом:
b⁻¹ = b²⁵⁴. (4.11)
В качестве альтернативы, пусть b(x) будет многочленом, представляющим b. Расширенный алгоритм Евклида [5] может быть применён к b(x) и m(x), чтобы найти многочлены a(x) и c(x), такие что
b(x)a(x) + m(x)c(x) = 1. (4.12)
Отсюда следует, что a(x) является многочленом, представляющим b−1.
1Сведения о свойствах конечных полей можно найти в учебниках, например в Algebra Майкла Артина [4].
FIPS 197 — УСОВЕРШЕНСТВОВАННЫЙ СТАНДАРТ ШИФРОВАНИЯ (AES)
Общая функция для выполнения AES-128, AES-192 или AES-256 обозначается как CIPHER(); её обратная функция обозначается как INVCIPHER().2
Ядром алгоритмов для CIPHER() и INVCIPHER() является последовательность фиксированных преобразований состояния, называемая раундом. Каждый раунд требует дополнительного входного значения, называемого раундовым ключом; раундовый ключ — это блок, обычно представляемый как последовательность из четырёх слов (т. е. 16 байтов).
Процедура развёртывания, обозначаемая KEYEXPANSION(), принимает в качестве входа ключ блочного шифра и формирует раундовые ключи в качестве выхода. В частности, вход KEYEXPANSION() представляется как массив слов, обозначаемый key, а выход — как расширенный массив слов, обозначаемый w, называемый расписанием ключа.
Блочные шифры AES-128, AES-192 и AES-256 различаются в трёх отношениях: 1) длиной ключа; 2) числом раундов, определяющим размер требуемого расписания ключа; и 3) спецификацией рекурсии внутри KEYEXPANSION(). Для каждого алгоритма число раундов обозначается Nr, а число слов ключа — Nk. (Число слов в состоянии в общем случае для Rijndael обозначается Nb; в настоящем Стандарте Nb = 4.) Конкретные значения Nk, Nb и Nr приведены в таблице 3. Никакие другие конфигурации Rijndael не соответствуют настоящему Стандарту.
Вопросы реализации, относящиеся к длине ключа, размеру блока и числу раундов, см. в разделе 6.3.
| Длина ключа | Размер блока | Число раундов | |||
|---|---|---|---|---|---|
| Nk | (в битах) | Nb | (в битах) | Nr | |
| AES-128 | 4 | 128 | 4 | 128 | 10 |
| AES-192 | 6 | 192 | 4 | 128 | 12 |
| AES-256 | 8 | 256 | 4 | 128 | 14 |
Тремя входными значениями CIPHER() являются: 1) вход данных in, то есть блок, представленный как линейный массив из 16 байтов; 2) число раундов Nr для экземпляра; и 3) раундовые ключи. Таким образом,
AES-128(in,key) = CIPHER(in,10, KEYEXPANSION(key)) AES-192(in,key) = CIPHER(in,12, KEYEXPANSION(key)) (5.1) AES-256(in,key) = CIPHER(in,14, KEYEXPANSION(key)).
Обратные перестановки определяются заменой CIPHER() на INVCIPHER() в уравнении (5.1).
2 Неформально эти функции иногда называют «шифрованием» и «расшифрованием», однако нейтральная терминология уместна, поскольку существуют и другие применения блочных шифров помимо шифрования.
Спецификации CIPHER(), KEYEXPANSION() и INVCIPHER() приведены в разделах 5.1, 5.2 и 5.3 соответственно.
Раунды в спецификации CIPHER() состоят из следующих четырёх байт-ориентированных преобразований состояния:
Четыре преобразования определены в разделах 5.1.1–5.1.4. В этих спецификациях преобразованный бит, байт или блок обозначается добавлением символа ′ в качестве верхнего индекса к исходной переменной (т. е. как b′, b′i, s′i,j или s′).
Раундовые ключи для ADDROUNDKEY() формируются KEYEXPANSION(), которая определена в разделе 5.2. В частности, расписание ключа представляется как массив w из 4 ∗ (Nr + 1) слов.
CIPHER() определена псевдокодом в алгоритме 1.
1: procedure CIPHER(in, Nr, w) 2: state ← in ▹ См. разд. 3.4 3: state ← ADDROUNDKEY(state,w[0..3]) ▹ См. разд. 5.1.4 4: for round from 1 to Nr − 1 do 5: state ← SUBBYTES(state) ▹ См. разд. 5.1.1 6: state ← SHIFTROWS(state) ▹ См. разд. 5.1.2 7: state ← MIXCOLUMNS(state) ▹ См. разд. 5.1.3 8: state ← ADDROUNDKEY(state,w[4 ∗ round..4 ∗ round + 3]) 9: end for 10: state ← SUBBYTES(state) 11: state ← SHIFTROWS(state) 12: state ← ADDROUNDKEY(state,w[4 ∗ Nr..4 ∗ Nr + 3]) 13: return state ▹ См. разд. 3.4 14: end procedure
Первый шаг (строка 2) состоит в копировании входных данных в массив состояния с использованием соглашений из раздела 3.4. После начального добавления раундового ключа (строка 3) массив состояния преобразуется Nr применениями раундовой функции (строки 4–12); заключительный раунд (строки 10–12) отличается тем, что преобразование MIXCOLUMNS() опускается. Затем заключительное состояние возвращается как выход (строка 13), как описано в разделе 3.4.
SUBBYTES() — обратимое нелинейное преобразование состояния, при котором таблица подстановки, называемая S-box, применяется независимо к каждому байту состояния. S-box AES обозначается SBOX().
Пусть b обозначает входной байт SBOX(), а c обозначает постоянный байт {01100011}. Выходной байт b′ = SBOX(b) строится композицией следующих двух преобразований:
b′i = b̃i ⊕ b̃(i+4) mod 8 ⊕ b̃(i+5) mod 8 ⊕ b̃(i+6) mod 8 ⊕ b̃(i+7) mod 8 ⊕ ci. (5.3)
Матричная форма уравнения (5.3) приведена ниже в уравнении (5.4):
На рисунке 2 показано, как SUBBYTES() преобразует состояние.

S-box AES представлена в шестнадцатеричной форме в таблице 4. Например, если sr,c = {53}, то
| y | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
| 0 | 63 | 7c | 77 | 7b | f2 | 6b | 6f | c5 | 30 | 01 | 67 | 2b | fe | d7 | ab | 76 |
| 1 | ca | 82 | c9 | 7d | fa | 59 | 47 | f0 | ad | d4 | a2 | af | 9c | a4 | 72 | c0 |
| 2 | b7 | fd | 93 | 26 | 36 | 3f | f7 | cc | 34 | a5 | e5 | f1 | 71 | d8 | 31 | 15 |
| 3 | 04 | c7 | 23 | c3 | 18 | 96 | 05 | 9a | 07 | 12 | 80 | e2 | eb | 27 | b2 | 75 |
| 4 | 09 | 83 | 2c | 1a | 1b | 6e | 5a | a0 | 52 | 3b | d6 | b3 | 29 | e3 | 2f | 84 |
| 5 | 53 | d1 | 00 | ed | 20 | fc | b1 | 5b | 6a | cb | be | 39 | 4a | 4c | 58 | cf |
| 6 | d0 | ef | aa | fb | 43 | 4d | 33 | 85 | 45 | f9 | 02 | 7f | 50 | 3c | 9f | a8 |
| 7 | 51 | a3 | 40 | 8f | 92 | 9d | 38 | f5 | bc | b6 | da | 21 | 10 | ff | f3 | d2 |
| 8 | cd | 0c | 13 | ec | 5f | 97 | 44 | 17 | c4 | a7 | 7e | 3d | 64 | 5d | 19 | 73 |
| 9 | 60 | 81 | 4f | dc | 22 | 2a | 90 | 88 | 46 | ee | b8 | 14 | de | 5e | 0b | db |
| a | e0 | 32 | 3a | 0a | 49 | 06 | 24 | 5c | c2 | d3 | ac | 62 | 91 | 95 | e4 | 79 |
| b | e7 | c8 | 37 | 6d | 8d | d5 | 4e | a9 | 6c | 56 | f4 | ea | 65 | 7a | ae | 08 |
| c | ba | 78 | 25 | 2e | 1c | a6 | b4 | c6 | e8 | dd | 74 | 1f | 4b | bd | 8b | 8a |
| d | 70 | 3e | b5 | 66 | 48 | 03 | f6 | 0e | 61 | 35 | 57 | b9 | 86 | c1 | 1d | 9e |
| e | e1 | f8 | 98 | 11 | 69 | d9 | 8e | 94 | 9b | 1e | 87 | e9 | ce | 55 | 28 | df |
| f | 8c | a1 | 89 | 0d | bf | e6 | 42 | 68 | 41 | 99 | 2d | 0f | b0 | 54 | bb | 16 |
значение подстановки определяется пересечением строки с индексом «5» и столбца с индексом «3» в таблице 4, так что s′r,c = {ed}.
SHIFTROWS() — преобразование состояния, при котором байты в последних трёх строках состояния циклически сдвигаются. Число позиций, на которое сдвигаются байты, зависит от индекса строки r следующим образом:
s′r,c = sr,(c+r) mod 4 for 0 ≤ r < 4 and 0 ≤ c < 4. (5.5)
SHIFTROWS() показано на рисунке 3. В этом представлении состояния эффект состоит в перемещении каждого байта на r позиций влево в строке с циклическим переносом крайних левых r байтов к правому концу строки. Первая строка, для которой r = 0, не изменяется.

MIXCOLUMNS() — преобразование состояния, которое умножает каждый из четырёх столбцов состояния на одну фиксированную матрицу, как описано в разделе 4.3, с элементами, взятыми из следующего слова:
[a0,a1,a2,a3] = [{02},{01},{01},{03}]. (5.6)
Таким образом,
так что отдельные выходные байты определяются следующим образом:
На рисунке 4 показано MIXCOLUMNS().

ADDROUNDKEY() — преобразование состояния, при котором раундовый ключ объединяется с состоянием посредством применения побитовой операции XOR. В частности, каждый раундовый ключ состоит из четырёх слов расписания ключа (описанного в разделе 5.2), каждое из которых объединяется со столбцом состояния следующим образом:
[s′0,c,s′1,c,s′2,c,s′3,c] = [s0,c,s1,c,s2,c,s3,c] ⊕ [w(4∗round+c)] for 0 ≤ c < 4 (5.9)
где round — значение в диапазоне 0 ≤ round ≤ Nr, а w[i] — массив слов расписания ключа, описанный в разделе 5.2. В спецификации CIPHER() ADDROUNDKEY() вызывается Nr + 1 раз — один раз до первого применения раундовой функции (см. алгоритм 1) и один раз внутри каждого из Nr раундов, когда 1 ≤ round ≤ Nr.
Действие этого преобразования показано на рисунке 5, где l = 4 ∗ round. Адрес байта внутри слов расписания ключа был описан в разделе 3.5.

FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)
KEYEXPANSION() — это процедура, применяемая к ключу для формирования 4 ∗ (Nr + 1) слов. Таким образом, для каждого из Nr + 1 применений ADDROUNDKEY() в спецификации CIPHER(), как описано в разделе 5.1.4, формируются четыре слова. Результат процедуры состоит из линейного массива слов, обозначаемого w[i], где i находится в диапазоне 0 ≤ i < 4 ∗ (Nr + 1).
KEYEXPANSION() использует 10 фиксированных слов, обозначаемых Rcon[j], для 1 ≤ j ≤ 10. Эти 10 слов называются константами раунда. Для AES-128 при формировании каждого из 10 раундовых ключей используется отдельная константа раунда. Для AES-192 и AES-256 процедура расширения ключа использует соответственно первые восемь и семь из этих же констант. Значения Rcon[j] приведены в шестнадцатеричной нотации в таблице 5:
| j | Rcon[j] | j | Rcon[j] |
|---|---|---|---|
| 1 | [01,00,00,00] | 6 | [20,00,00,00] |
| 2 | [02,00,00,00] | 7 | [40,00,00,00] |
| 3 | [04,00,00,00] | 8 | [80,00,00,00] |
| 4 | [08,00,00,00] | 9 | [1b,00,00,00] |
| 5 | [10,00,00,00] | 10 | [36,00,00,00] |
Значение самого левого байта Rcon[j] в полиномиальной форме равно xj−1. Обратите внимание, что при j > 0 эти байты могут быть сформированы последовательным применением XTIMES() к байту, представленному xj−1 (см. уравнение 4.5).
В KEYEXPANSION() вызываются два преобразования слов: ROTWORD() и SUBWORD(). Для входного слова, представленного последовательностью [a0, a1, a2, a3] из четырёх байтов,
ROTWORD([a₀,a₁,a₂,a₃]) = [a₁,a₂,a₃,a₀], (5.10)
и
SUBWORD([a₀,...,a₃]) = [SBOX(a₀), SBOX(a₁), SBOX(a₂), SBOX(a₃)]. (5.11)
Расширение ключа выполняется согласно псевдокоду в алгоритме 2. Первые Nk слов расширенного ключа являются самим ключом. Каждое последующее слово w[i] формируется рекурсивно из предшествующего слова w[i − 1] и слова на Nk позиций ранее, w[i − Nk], следующим образом:
FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)
Алгоритм 2 Псевдокод для KEYEXPANSION() 1: procedure KEYEXPANSION(key) 2: i ← 0 3: while i ≤ Nk − 1 do 4: w[i] ← key[4 ∗ i..4 ∗ i + 3] 5: i ← i + 1 6: end while ▹ По завершении цикла i = Nk. 7: while i ≤ 4 ∗ Nr + 3 do 8: temp ← w[i − 1] 9: if i mod Nk = 0 then 10: temp ← SUBWORD(ROTWORD(temp)) ⊕ Rcon[i/Nk] 11: else if Nk > 6 and i mod Nk = 4 then 12: temp ← SUBWORD(temp) 13: end if 14: w[i] ← w[i − Nk] ⊕temp 15: i ← i + 1 16: end while 17: return w 18: end procedure
На рисунках 6, 7 и 8 показана KEYEXPANSION() для AES-128, AES-192 и AES-256.
Для реализации INVCIPHER() преобразования в спецификации CIPHER() (раздел 5.1) инвертируются и выполняются в обратном порядке. Инвертированные преобразования состояния — обозначаемые INVSHIFTROWS(), INVSUBBYTES(), INVMIXCOLUMNS() и ADDROUNDKEY() — описаны в разделах 5.3.1–5.3.4.
INVCIPHER() описывается в псевдокоде алгоритма 3, где массив w обозначает расписание ключа, как описано в разделе 5.2.
FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)

FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)

FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)

FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)
Алгоритм 3 Псевдокод для INVCIPHER() 1: procedure INVCIPHER(in, Nr, w) 2: state ← in ▹ См. разд. 3.4 3: state ← ADDROUNDKEY(state,w[4 ∗ Nr..4 ∗ Nr + 3]) ▹ См. разд. 5.1.4 4: for round from Nr − 1 downto 1 do 5: state ← INVSHIFTROWS(state) ▹ См. разд. 5.3.1 6: state ← INVSUBBYTES(state) ▹ См. разд. 5.3.2 7: state ← ADDROUNDKEY(state,w[4 ∗ round..4 ∗ round + 3]) 8: state ← INVMIXCOLUMNS(state) ▹ См. разд. 5.3.3 9: end for 10: state ← INVSHIFTROWS(state) 11: state ← INVSUBBYTES(state) 12: state ← ADDROUNDKEY(state,w[0..3]) 13: return state 14: end procedure
INVSHIFTROWS() является обратным преобразованием SHIFTROWS(). В частности, байты в последних трёх строках состояния циклически сдвигаются следующим образом:
s′r,c = sr,(c−r) mod 4 для 0 ≤ r < 4 и 0 ≤ c < 4. (5.12)
INVSHIFTROWS() проиллюстрировано на рисунке 9. В таком представлении состояния эффект заключается в перемещении каждого байта на r позиций вправо в строке, при этом крайние правые r байтов циклически переносятся в левый конец строки. Первая строка, для которой r = 0, не изменяется.

INVSUBBYTES() является обратной операцией к SUBBYTES(), при которой к каждому байту состояния применяется обратная к SBOX(), обозначаемая INVSBOX(). INVSBOX() получается из таблицы 4 перестановкой ролей входов и выходов, как показано в таблице 6:
| y | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
| 0 | 52 | 09 | 6a | d5 | 30 | 36 | a5 | 38 | bf | 40 | a3 | 9e | 81 | f3 | d7 | fb |
| 1 | 7c | e3 | 39 | 82 | 9b | 2f | ff | 87 | 34 | 8e | 43 | 44 | c4 | de | e9 | cb |
| 2 | 54 | 7b | 94 | 32 | a6 | c2 | 23 | 3d | ee | 4c | 95 | 0b | 42 | fa | c3 | 4e |
| 3 | 08 | 2e | a1 | 66 | 28 | d9 | 24 | b2 | 76 | 5b | a2 | 49 | 6d | 8b | d1 | 25 |
| 4 | 72 | f8 | f6 | 64 | 86 | 68 | 98 | 16 | d4 | a4 | 5c | cc | 5d | 65 | b6 | 92 |
| 5 | 6c | 70 | 48 | 50 | fd | ed | b9 | da | 5e | 15 | 46 | 57 | a7 | 8d | 9d | 84 |
| 6 | 90 | d8 | ab | 00 | 8c | bc | d3 | 0a | f7 | e4 | 58 | 05 | b8 | b3 | 45 | 06 |
| 7 | d0 | 2c | 1e | 8f | ca | 3f | 0f | 02 | c1 | af | bd | 03 | 01 | 13 | 8a | 6b |
| 8 | 3a | 91 | 11 | 41 | 4f | 67 | dc | ea | 97 | f2 | cf | ce | f0 | b4 | e6 | 73 |
| 9 | 96 | ac | 74 | 22 | e7 | ad | 35 | 85 | e2 | f9 | 37 | e8 | 1c | 75 | df | 6e |
| a | 47 | f1 | 1a | 71 | 1d | 29 | c5 | 89 | 6f | b7 | 62 | 0e | aa | 18 | be | 1b |
| b | fc | 56 | 3e | 4b | c6 | d2 | 79 | 20 | 9a | db | c0 | fe | 78 | cd | 5a | f4 |
| c | 1f | dd | a8 | 33 | 88 | 07 | c7 | 31 | b1 | 12 | 10 | 59 | 27 | 80 | ec | 5f |
| d | 60 | 51 | 7f | a9 | 19 | b5 | 4a | 0d | 2d | e5 | 7a | 9f | 93 | c9 | 9c | ef |
| e | a0 | e0 | 3b | 4d | ae | 2a | f5 | b0 | c8 | eb | bb | 3c | 83 | 53 | 99 | 61 |
| f | 17 | 2b | 04 | 7e | ba | 77 | d6 | 26 | e1 | 69 | 14 | 63 | 55 | 21 | 0c | 7d |
INVMIXCOLUMNS() является обратной операцией к MIXCOLUMNS(). В частности, INVMIXCOLUMNS() умножает каждый из четырёх столбцов состояния на одну фиксированную матрицу, как описано в разделе 4.3, элементы которой берутся из следующего слова:
[a₀, a₁, a₂, a₃] = [{0e}, {09}, {0d}, {0b}]. (5.13)
Таким образом,

В результате этого умножения матриц четыре байта в столбце заменяются следующими:

ADDROUNDKEY(), описанная в разделе 5.1.4, является собственной обратной операцией.
Несколько свойств алгоритма AES допускают альтернативное описание обратной операции к CIPHER(), называемое эквивалентным обратным шифром и обозначаемое EQINVCIPHER(). В описании EQINVCIPHER() преобразования раундовой функции шифра в алг. 1 непосредственно заменяются их обратными преобразованиями в EQINVCIPHER() в том же порядке. Эффективность этой структуры по сравнению с описанием INVCIPHER() в алг. 3 объясняется в документе с предложением Rijndael [2].
Псевдокод эквивалентного обратного шифра, приведённый в алг. 4, использует модифицированное расписание ключей, обозначаемое массивом слов dw. Процедура формирования dw является расширением KEYEXPANSION(), обозначаемым KEYEXPANSIONEIC(); её псевдокод приведён в алг. 5.
1: procedure EQINVCIPHER(in, Nr, dw) 2: state ← in 3: state ← ADDROUNDKEY(state,dw[4 ∗ Nr..4 ∗ Nr + 3]) 4: for round from Nr − 1 downto 1 do 5: state ← INVSUBBYTES(state) 6: state ← INVSHIFTROWS(state) 7: state ← INVMIXCOLUMNS(state) 8: state ← ADDROUNDKEY(state,dw[4 ∗ round..4 ∗ round + 3]) 9: end for 10: state ← INVSUBBYTES(state) 11: state ← INVSHIFTROWS(state) 12: state ← ADDROUNDKEY(state,dw[0..3]) 13: return state 14: end procedure
1: procedure KEYEXPANSIONEIC(key) 2: i ← 0 3: while i ≤ Nk − 1 do 4: w[i] ← key[4i..4i + 3] 5: dw[i] ← w[i] 6: i ← i + 1 7: end while ▷ По завершении цикла i = Nk. 8: while i ≤ 4 ∗ Nr + 3 do 9: temp ← w[i − 1] 10: if i mod Nk = 0 then 11: temp ← SUBWORD(ROTWORD(temp)) ⊕ Rcon[i/Nk] 12: else if Nk > 6 and i mod Nk = 4 then 13: temp ← SUBWORD(temp) 14: end if 15: w[i] ← w[i − Nk] ⊕temp 16: dw[i] ← w[i] 17: i ← i + 1 18: end while 19: for round from 1 to Nr − 1 do 20: i ← 4 ∗ round 21: dw[i..i + 3] ← INVMIXCOLUMNS(dw[i..i + 3]) ▷ Обратите внимание на изменение типа. 22: end for 23: return dw 24: end procedure
Первый и последний раундовые ключи в dw совпадают с ключами в w; модификация остальных раундовых ключей описана в строках 19–22. Комментарий в строке 21 относится ко входу INVMIXCOLUMNS(): одномерный массив слов преобразуется в двумерный массив байтов, как на рис. 1.
Реализация алгоритма AES ДОЛЖНА (shall) поддерживать по меньшей мере одну из трёх длин ключа, указанных в разд. 5: 128, 192 или 256 битов (то есть Nk = 4, 6 или 8 соответственно). Реализации могут дополнительно поддерживать две или три длины ключа, что может способствовать взаимодействию реализаций алгоритма.
Если криптографический ключ был сгенерирован надлежащим образом (рекомендации см. в NIST Special Publication 800-133, Rev. 2 [6]), при использовании полученного ключа для алгоритма AES никаких ограничений не налагается.
В таблице 3 настоящий Стандарт явно определяет допустимые значения длины ключа (Nk), размера блока (Nb) и числа раундов (Nr). Однако будущие редакции настоящего Стандарта могут включать изменения или дополнения допустимых значений этих параметров. Поэтому разработчики реализации могут выбрать проектирование своих реализаций AES с учётом будущей гибкости.
Возможны варианты реализации, которые во многих случаях могут предоставлять преимущества в производительности или иные преимущества. При одинаковых входных ключе и данных (открытом тексте или шифртексте) любая реализация, которая производит тот же выход (шифртекст или открытый текст), что и алгоритм, определённый в настоящем Стандарте, является эквивалентной реализацией алгоритма AES.
Документ с предложением AES [2] и другие ресурсы, расположенные на странице AES [7], содержат рекомендации по эффективной реализации алгоритма AES на различных платформах. Предлагаемые реализации предназначены для объяснения внутренней работы алгоритма AES, но не обеспечивают защиты от различных атак на реализацию.
Физическая реализация может раскрывать зависящую от ключа информацию по побочным каналам, например через время, затрачиваемое на вычисление, или при внесении сбоев в вычисление. Если такие атаки являются неинвазивными, они могут быть эффективными даже при наличии механизмов обнаружения физического вмешательства в устройство. Например, атаки по времени доступа к кэшу могут влиять на реализации AES на программных платформах, использующих кэш для ускорения доступа к данным из основной памяти.
Следует рассматривать защиту реализаций алгоритма AES от атак на реализацию там, где это применимо. Такие соображения выходят за рамки настоящего документа, но учитываются при тестировании на соответствие алгоритму, определённому в настоящем Стандарте, согласно программе валидации, разработанной NIST (см. https://nist.gov/cmvp).
Режимы работы блочного шифра — это криптографические функции, использующие блочный шифр для предоставления информационных услуг, таких как конфиденциальность и аутентификация. Рекомендованные NIST режимы работы определены в серии публикаций NIST Special Publications 800-38. Дополнительная информация доступна по адресу https://csrc.nist.gov/Projects/block-cipher-techniques/BCM.
FIPS 197
ADVANCED ENCRYPTION STANDARD (AES)
В этом приложении показано построение расписания ключа для каждого размера ключа. Обратите внимание, что многобайтные значения представлены с использованием обозначений, описанных в разд. 3. Промежуточные значения, получаемые при построении расписания ключа (см. разд. 5.2), приведены в следующей таблице (все значения представлены в шестнадцатеричном формате, за исключением столбца индекса (i)).
В этом разделе приведено развёртывание следующего ключа:
Key = 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
для Nk = 4, в результате чего получаем
w₀ = 2b7e1516 w₁ = 28aed2a6 w₂ = abf71588 w₃ = 09cf4f3c
| i (десятичн.) | temp | ПослеROTWORD() | ПослеSUBWORD() | Rcon[i/Nk] | После XOR с Rcon | w[i − Nk] | w[i] = temp ⊕ w[i − Nk] |
|---|---|---|---|---|---|---|---|
| 4 | 09cf4f3c | cf4f3c09 | 8a84eb01 | 01000000 | 8b84eb01 | 2b7e1516 | a0fafe17 |
| 5 | a0fafe17 | 28aed2a6 | 88542cb1 | ||||
| 6 | 88542cb1 | abf71588 | 23a33939 | ||||
| 7 | 23a33939 | 09cf4f3c | 2a6c7605 | ||||
| 8 | 2a6c7605 | 6c76052a | 50386be5 | 02000000 | 52386be5 | a0fafe17 | f2c295f2 |
| 9 | f2c295f2 | 88542cb1 | 7a96b943 | ||||
| 10 | 7a96b943 | 23a33939 | 5935807a | ||||
| 11 | 5935807a | 2a6c7605 | 7359f67f | ||||
| 12 | 7359f67f | 59f67f73 | cb42d28f | 04000000 | cf42d28f | f2c295f2 | 3d80477d |
| 13 | 3d80477d | 7a96b943 | 4716fe3e | ||||
| 14 | 4716fe3e | 5935807a | 1e237e44 | ||||
| 15 | 1e237e44 | 7359f67f | 6d7a883b | ||||
| 16 | 6d7a883b | 7a883b6d | dac4e23c | 08000000 | d2c4e23c | 3d80477d | ef44a541 |
| 17 | ef44a541 | 4716fe3e | a8525b7f | ||||
| 18 | a8525b7f | 1e237e44 | b671253b | ||||
| 19 | b671253b | 6d7a883b | db0bad00 | ||||
| 20 | db0bad00 | 0bad00db | 2b9563b9 | 10000000 | 3b9563b9 | ef44a541 | d4d1c6f8 |
| 21 | d4d1c6f8 | a8525b7f | 7c839d87 | ||||
| 22 | 7c839d87 | b671253b | caf2b8bc | ||||
| 23 | caf2b8bc | db0bad00 | 11f915bc | ||||
| 24 | 11f915bc | f915bc11 | 99596582 | 20000000 | b9596582 | d4d1c6f8 | 6d88a37a |
| 25 | 6d88a37a | 7c839d87 | 110b3efd | ||||
| 26 | 110b3efd | caf2b8bc | dbf98641 | ||||
| 27 | dbf98641 | 11f915bc | ca0093fd | ||||
| 28 | ca0093fd | 0093fdca | 63dc5474 | 40000000 | 23dc5474 | 6d88a37a | 4e54f70e |
| 29 | 4e54f70e | 110b3efd | 5f5fc9f3 | ||||
| 30 | 5f5fc9f3 | dbf98641 | 84a64fb2 | ||||
| 31 | 84a64fb2 | ca0093fd | 4ea6dc4f | ||||
| 32 | 4ea6dc4f | a6dc4f4e | 2486842f | 80000000 | a486842f | 4e54f70e | ead27321 |
| 33 | ead27321 | 5f5fc9f3 | b58dbad2 | ||||
| 34 | b58dbad2 | 84a64fb2 | 312bf560 | ||||
| 35 | 312bf560 | 4ea6dc4f | 7f8d292f | ||||
| 36 | 7f8d292f | 8d292f7f | 5da515d2 | 1b000000 | 46a515d2 | ead27321 | ac7766f3 |
| 37 | ac7766f3 | b58dbad2 | 19fadc21 | ||||
| 38 | 19fadc21 | 312bf560 | 28d12941 | ||||
| 39 | 28d12941 | 7f8d292f | 575c006e | ||||
| 40 | 575c006e | 5c006e57 | 4a639f5b | 36000000 | 7c639f5b | ac7766f3 | d014f9a8 |
| 41 | d014f9a8 | 19fadc21 | c9ee2589 | ||||
| 42 | c9ee2589 | 28d12941 | e13f0cc8 | ||||
| 43 | e13f0cc8 | 575c006e | b6630ca6 |
В этом разделе приведено развёртывание следующего ключа:
Key = 8e 73 b0 f7 da 0e 64 52 c8 10 f3 2b
80 90 79 e5 62 f8 ea d2 52 2c 6b 7bдля Nk = 6, в результате чего получаем
w₀ = 8e73b0f7 w₁ = da0e6452 w₂ = c810f32b w₃ = 809079e5 w₄ = 62f8ead2 w₅ = 522c6b7b
| i (десятичн.) | temp | ПослеROTWORD() | ПослеSUBWORD() | Rcon[i/Nk] | После XOR с Rcon | w[i − Nk] | w[i] = temp ⊕ w[i − Nk] |
|---|---|---|---|---|---|---|---|
| 6 | 522c6b7b | 2c6b7b52 | 717f2100 | 01000000 | 707f2100 | 8e73b0f7 | fe0c91f7 |
| 7 | fe0c91f7 | da0e6452 | 2402f5a5 | ||||
| 8 | 2402f5a5 | c810f32b | ec12068e | ||||
| 9 | ec12068e | 809079e5 | 6c827f6b | ||||
| 10 | 6c827f6b | 62f8ead2 | 0e7a95b9 | ||||
| 11 | 0e7a95b9 | 522c6b7b | 5c56fec2 | ||||
| 12 | 5c56fec2 | 56fec25c | b1bb254a | 02000000 | b3bb254a | fe0c91f7 | 4db7b4bd |
| 13 | 4db7b4bd | 2402f5a5 | 69b54118 | ||||
| 14 | 69b54118 | ec12068e | 85a74796 | ||||
| 15 | 85a74796 | 6c827f6b | e92538fd | ||||
| 16 | e92538fd | 0e7a95b9 | e75fad44 | ||||
| 17 | e75fad44 | 5c56fec2 | bb095386 | ||||
| 18 | bb095386 | 095386bb | 01ed44ea | 04000000 | 05ed44ea | 4db7b4bd | 485af057 |
| 19 | 485af057 | 69b54118 | 21efb14f | ||||
| 20 | 21efb14f | 85a74796 | a448f6d9 | ||||
| 21 | a448f6d9 | e92538fd | 4d6dce24 | ||||
| 22 | 4d6dce24 | e75fad44 | aa326360 | ||||
| 23 | aa326360 | bb095386 | 113b30e6 | ||||
| 24 | 113b30e6 | 3b30e611 | e2048e82 | 08000000 | ea048e82 | 485af057 | a25e7ed5 |
| 25 | a25e7ed5 | 21efb14f | 83b1cf9a | ||||
| 26 | 83b1cf9a | a448f6d9 | 27f93943 | ||||
| 27 | 27f93943 | 4d6dce24 | 6a94f767 | ||||
| 28 | 6a94f767 | aa326360 | c0a69407 | ||||
| 29 | c0a69407 | 113b30e6 | d19da4e1 | ||||
| 30 | d19da4e1 | 9da4e1d1 | 5e49f83e | 10000000 | 4e49f83e | a25e7ed5 | ec1786eb |
| 31 | ec1786eb | 83b1cf9a | 6fa64971 | ||||
| 32 | 6fa64971 | 27f93943 | 485f7032 | ||||
| 33 | 485f7032 | 6a94f767 | 22cb8755 | ||||
| 34 | 22cb8755 | c0a69407 | e26d1352 | ||||
| 35 | e26d1352 | d19da4e1 | 33f0b7b3 | ||||
| 36 | 33f0b7b3 | f0b7b333 | 8ca96dc3 | 20000000 | aca96dc3 | ec1786eb | 40beeb28 |
| 37 | 40beeb28 | 6fa64971 | 2f18a259 | ||||
| 38 | 2f18a259 | 485f7032 | 6747d26b | ||||
| 39 | 6747d26b | 22cb8755 | 458c553e | ||||
| 40 | 458c553e | e26d1352 | a7e1466c | ||||
| 41 | a7e1466c | 33f0b7b3 | 9411f1df | ||||
| 42 | 9411f1df | 11f1df94 | 82a19e22 | 40000000 | c2a19e22 | 40beeb28 | 821f750a |
| 43 | 821f750a | 2f18a259 | ad07d753 | ||||
| 44 | ad07d753 | 6747d26b | ca400538 | ||||
| 45 | ca400538 | 458c553e | 8fcc5006 | ||||
| 46 | 8fcc5006 | a7e1466c | 282d166a | ||||
| 47 | 282d166a | 9411f1df | bc3ce7b5 | ||||
| 48 | bc3ce7b5 | 3ce7b5bc | eb94d565 | 80000000 | 6b94d565 | 821f750a | e98ba06f |
| 49 | e98ba06f | ad07d753 | 448c773c | ||||
| 50 | 448c773c | ca400538 | 8ecc7204 | ||||
| 51 | 8ecc7204 | 8fcc5006 | 01002202 |
В этом разделе приведено развёртывание следующего ключа:
Key = 60 3d eb 10 15 ca 71 be 2b 73 ae f0 85 7d 77 81
1f 35 2c 07 3b 61 08 d7 2d 98 10 a3 09 14 df f4для Nk = 8, в результате чего получаем
w₀ = 603deb10 w₁ = 15ca71be w₂ = 2b73aef0 w₃ = 857d7781 w₄ = 1f352c07 w₅ = 3b6108d7 w₆ = 2d9810a3 w₇ = 0914dff4
| i (десятичн.) | temp | ПослеROTWORD() | ПослеSUBWORD() | Rcon[i/Nk] | После XOR с Rcon | w[i − Nk] | w[i] = temp ⊕ w[i − Nk] |
|---|---|---|---|---|---|---|---|
| 8 | 0914dff4 | 14dff409 | fa9ebf01 | 01000000 | fb9ebf01 | 603deb10 | 9ba35411 |
| 9 | 9ba35411 | 15ca71be | 8e6925af | ||||
| 10 | 8e6925af | 2b73aef0 | a51a8b5f | ||||
| 11 | a51a8b5f | 857d7781 | 2067fcde | ||||
| 12 | 2067fcde | b785b01d | 1f352c07 | a8b09c1a | |||
| 13 | a8b09c1a | 3b6108d7 | 93d194cd | ||||
| 14 | 93d194cd | 2d9810a3 | be49846e | ||||
| 15 | be49846e | 0914dff4 | b75d5b9a | ||||
| 16 | b75d5b9a | 5d5b9ab7 | 4c39b8a9 | 02000000 | 4e39b8a9 | 9ba35411 | d59aecb8 |
| 17 | d59aecb8 | 8e6925af | 5bf3c917 | ||||
| 18 | 5bf3c917 | a51a8b5f | fee94248 | ||||
| 19 | fee94248 | 2067fcde | de8ebe96 | ||||
| 20 | de8ebe96 | 1d19ae90 | a8b09c1a | b5a9328a | |||
| 21 | b5a9328a | 93d194cd | 2678a647 | ||||
| 22 | 2678a647 | be49846e | 98312229 | ||||
| 23 | 98312229 | b75d5b9a | 2f6c79b3 | ||||
| 24 | 2f6c79b3 | 6c79b32f | 50b66d15 | 04000000 | 54b66d15 | d59aecb8 | 812c81ad |
| 25 | 812c81ad | 5bf3c917 | dadf48ba | ||||
| 26 | dadf48ba | fee94248 | 24360af2 | ||||
| 27 | 24360af2 | de8ebe96 | fab8b464 | ||||
| 28 | fab8b464 | 2d6c8d43 | b5a9328a | 98c5bfc9 | |||
| 29 | 98c5bfc9 | 2678a647 | bebd198e | ||||
| 30 | bebd198e | 98312229 | 268c3ba7 | ||||
| 31 | 268c3ba7 | 2f6c79b3 | 09e04214 | ||||
| 32 | 09e04214 | e0421409 | e12cfa01 | 08000000 | e92cfa01 | 812c81ad | 68007bac |
| 33 | 68007bac | dadf48ba | b2df3316 | ||||
| 34 | b2df3316 | 24360af2 | 96e939e4 | ||||
| 35 | 96e939e4 | fab8b464 | 6c518d80 | ||||
| 36 | 6c518d80 | 50d15dcd | 98c5bfc9 | c814e204 | |||
| 37 | c814e204 | bebd198e | 76a9fb8a | ||||
| 38 | 76a9fb8a | 268c3ba7 | 5025c02d | ||||
| 39 | 5025c02d | 09e04214 | 59c58239 | ||||
| 40 | 59c58239 | c5823959 | a61312cb | 10000000 | b61312cb | 68007bac | de136967 |
| 41 | de136967 | b2df3316 | 6ccc5a71 | ||||
| 42 | 6ccc5a71 | 96e939e4 | fa256395 | ||||
| 43 | fa256395 | 6c518d80 | 9674ee15 | ||||
| 44 | 9674ee15 | 90922859 | c814e204 | 5886ca5d | |||
| 45 | 5886ca5d | 76a9fb8a | 2e2f31d7 | ||||
| 46 | 2e2f31d7 | 5025c02d | 7e0af1fa | ||||
| 47 | 7e0af1fa | 59c58239 | 27cf73c3 | ||||
| 48 | 27cf73c3 | cf73c327 | 8a8f2ecc | 20000000 | aa8f2ecc | de136967 | 749c47ab |
| 49 | 749c47ab | 6ccc5a71 | 18501dda | ||||
| 50 | 18501dda | fa256395 | e2757e4f | ||||
| 51 | e2757e4f | 9674ee15 | 7401905a | ||||
| 52 | 7401905a | 927c60be | 5886ca5d | cafaaae3 | |||
| 53 | cafaaae3 | 2e2f31d7 | e4d59b34 | ||||
| 54 | e4d59b34 | 7e0af1fa | 9adf6ace | ||||
| 55 | 9adf6ace | 27cf73c3 | bd10190d | ||||
| 56 | bd10190d | 10190dbd | cad4d77a | 40000000 | 8ad4d77a | 749c47ab | fe4890d1 |
| 57 | fe4890d1 | 18501dda | e6188d0b | ||||
| 58 | e6188d0b | e2757e4f | 046df344 | ||||
| 59 | 046df344 | 7401905a | 706c631e |
Следующая схема показывает значения в массиве состояния по мере выполнения шифрования для длины блока и длины ключа по 16 байтов каждая (то есть Nb = 4 и Nk = 4).
Input = 32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34 Key = 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
Значения раундового ключа взяты из примера развёртывания ключа в приложении A.1.
| Номер раунда | Начало раунда | После SubBytes | После ShiftRows | После MixColumns | Значение раундового ключа |
|---|---|---|---|---|---|
| входные данные | 32 88 31 e0 43 5a 31 37 f6 30 98 07 a8 8d a2 34 | 2b 28 ab 09 7e ae f7 cf 15 d2 15 4f 16 a6 88 3c | |||
| 1 | 19 a0 9a e9 3d f4 c6 f8 e3 e2 8d 48 be 2b 2a 08 | d4 e0 b8 1e 27 bf b4 41 11 98 5d 52 ae f1 e5 30 | d4 e0 b8 1e bf b4 41 27 5d 52 11 98 30 ae f1 e5 | 04 e0 48 28 66 cb f8 06 81 19 d3 26 e5 9a 7a 4c | a0 88 23 2a fa 54 a3 6c fe 2c 39 76 17 b1 39 05 |
| 2 | a4 68 6b 02 9c 9f 5b 6a 7f 35 ea 50 f2 2b 43 49 | 49 45 7f 77 de db 39 02 d2 96 87 53 89 f1 1a 3b | 49 45 7f 77 db 39 02 de 87 53 d2 96 3b 89 f1 1a | 58 1b db 1b 4d 4b e7 6b ca 5a ca b0 f1 ac a8 e5 | f2 7a 59 73 c2 96 35 59 95 b9 80 f6 f2 43 7a 7f |
| 3 | aa 61 82 68 8f dd d2 32 5f e3 4a 46 03 ef d2 9a | ac ef 13 45 73 c1 b5 23 cf 11 d6 5a 7b df b5 b8 | ac ef 13 45 c1 b5 23 73 cf 11 d6 5a b8 7b df b5 | 75 20 53 bb ec 0b c0 25 09 63 cf d0 93 33 7c dc | 3d 47 1e 6d 80 16 23 7a 47 fe 7e 88 7d 3e 44 3b |
| 4 | 48 67 4d d6 6c 1d e3 5f 4e 9d b1 58 ee 0d 38 e7 | 52 85 e3 f6 50 a4 11 cf 2f 5e c8 6a 28 d7 07 94 | 52 85 e3 f6 a4 11 cf 50 c8 6a 2f 5e 94 28 d7 07 | 0f 60 6f 5e d6 31 c0 b3 da 38 10 13 a9 bf 6b 01 | ef a8 b6 db 44 52 71 0b a5 5b 25 ad 41 7f 3b 00 |
| 5 | e0 c8 d9 85 92 63 b1 b8 7f 63 35 be e8 c0 50 01 | e1 e8 35 97 4f fb c8 6c d2 fb 96 ae 9b ba 53 7c | e1 e8 35 97 fb c8 6c 4f 96 ae d2 fb 7c 9b ba 53 | 25 bd b6 4c d1 11 3a 4c a9 d1 33 c0 ad 68 8e b0 | d4 7c ca 11 d1 83 f2 f9 c6 9d b8 15 f8 87 bc bc |
FIPS 197
СТАНДАРТ УСОВЕРШЕНСТВОВАННОГО ШИФРОВАНИЯ (AES)
| 6 | f1 c1 7c 5d 00 92 c8 b5 6f 4c 8b d5 55 ef 32 0c | a1 78 10 4c 63 4f e8 d5 a8 29 3d 03 fc df 23 fe | a1 78 10 4c 4f e8 d5 63 3d 03 a8 29 fe fc df 23 | 4b 2c 33 37 86 4a 9d d2 8d 89 f4 18 6d 80 e8 d8 | 6d 11 db ca 88 0b f9 00 a3 3e 86 93 7a fd 41 fd |
|---|---|---|---|---|---|
| 7 | 26 3d e8 fd 0e 41 64 d2 2e b7 72 8b 17 7d a9 25 | f7 27 9b 54 ab 83 43 b5 31 a9 40 3d f0 ff d3 3f | f7 27 9b 54 83 43 b5 ab 40 3d 31 a9 3f f0 ff d3 | 14 46 27 34 15 16 46 2a b5 15 56 d8 bf ec d7 43 | 4e 5f 84 4e 54 5f a6 a6 f7 c9 4f dc 0e f3 b2 4f |
| 8 | 5a 19 a3 7a 41 49 e0 8c 42 dc 19 04 b1 1f 65 0c | be d4 0a da 83 3b e1 64 2c 86 d4 f2 c8 c0 4d fe | be d4 0a da 3b e1 64 83 d4 f2 2c 86 fe c8 c0 4d | 00 b1 54 fa 51 c8 76 1b 2f 89 6d 99 d1 ff cd ea | ea b5 31 7f d2 8d 2b 8d 73 ba f5 29 21 d2 60 2f |
| 9 | ea 04 65 85 83 45 5d 96 5c 33 98 b0 f0 2d ad c5 | 87 f2 4d 97 ec 6e 4c 90 4a c3 46 e7 8c d8 95 a6 | 87 f2 4d 97 6e 4c 90 ec 46 e7 4a c3 a6 8c d8 95 | 47 40 a3 4c 37 d4 70 9f 94 e4 3a 42 ed a5 a6 bc | ac 19 28 57 77 fa d1 5c 66 dc 29 00 f3 21 41 6e |
| 10 | eb 59 8b 1b 40 2e a1 c3 f2 38 13 42 1e 84 e7 d2 | e9 cb 3d af 09 31 32 2e 89 07 7d 2c 72 5f 94 b5 | e9 cb 3d af 31 32 2e 09 7d 2c 89 07 b5 72 5f 94 | d0 c9 e1 b6 14 ee 3f 63 f9 25 0c 0c a8 89 c8 a6 | |
| выход | 39 02 dc 19 25 dc 11 6a 84 09 85 0b 1d fb 97 32 |
NIST Computer Security Resource Center предоставляет веб-сайт с «примерами с промежуточными значениями» для AES [8].
Исходный FIPS 197 (26 ноября 2001 г.) был рассмотрен и обновлён под эгидой Совета NIST по обзору криптографических публикаций [9]. Публичные комментарии и анализы безопасности AES, описанные в NIST IR 8319 [10], послужили основой для решения сохранить технические спецификации Стандарта.
Ниже приведено краткое изложение редакционных изменений исходного FIPS 197 в обновлении от 9 мая 2023 г., NIST FIPS 197-upd1:
xtime.MIXCOLUMNS() и INVMIXCOLUMNS() в разделах 5.1.3 и 5.3.3 были соответственно пересмотрены, чтобы отсылать к этой конструкции.SHIFTROWS() в разделе 5.1.2 и INVSHIFTROWS() в разделе 5.3.2 были улучшены, а ошибка в последнем была исправлена.KEYEXPANSION() на новых рис. 6, 7 и 8 были добавлены в раздел 5.2. Текст раздела также был пересмотрен, включая явное отображение констант раунда на новом рис. 5.