⌕ Поиск по атласу

Неофициальный полный русский перевод · FIPS 197

FIPS 197 · Усовершенствованный стандарт шифрования (AES)

Advanced Encryption Standard (AES)

Карточка документа · Архив принятого перевода · Официальный источник

Содержание

FIPS 197

Публикация федеральных стандартов обработки информации

Усовершенствованный стандарт шифрования (AES)

Категория: компьютерная безопасность Подкатегория: криптография

Лаборатория информационных технологий
Национальный институт стандартов и технологий
Гейтерсберг, 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.

Комментарии относительно этой публикации Федерального стандарта обработки информации приветствуются, и их следует направлять с использованием контактной информации, указанной в пункте «Запросы и комментарии» раздела объявления.

Джеймс А. Сент-Пьер, исполняющий обязанности директора
Лаборатория информационных технологий

Усовершенствованный стандарт шифрования (AES)

Аннотация

В 2000 году NIST объявил о выборе семейства блочных шифров Rijndael победителем конкурса Advanced Encryption Standard (AES). Блочные шифры являются основой для многих криптографических служб, особенно обеспечивающих гарантии конфиденциальности данных.

В настоящем Стандарте определены три представителя семейства Rijndael: AES-128, AES-192 и AES-256. Каждый из них преобразует данные блоками по 128 бит, а числовой суффикс указывает битовую длину соответствующих криптографических ключей.

Ключевые слова: AES; блочный шифр; конфиденциальность; криптография; шифрование; Rijndael.

Публикация федеральных стандартов обработки информации 197

Опубликовано: 26 ноября 2001 г.
Обновлено: 9 мая 2023 г.

Объявление о
УСОВЕРШЕНСТВОВАННОМ СТАНДАРТЕ ШИФРОВАНИЯ (AES)

Публикации федеральных стандартов обработки информации (FIPS) разрабатываются NIST в соответствии с 15 U.S.C. 278g-3 и издаются Секретарём по торговле в соответствии с 40 U.S.C. 11331.

  1. Наименование стандарта. Advanced Encryption Standard (AES) (FIPS 197).
  2. Категория стандарта. Стандарт компьютерной безопасности, криптография.
  3. Пояснение. Advanced Encryption Standard (AES) определяет одобренный FIPS криптографический алгоритм, который может использоваться для защиты электронных данных. Алгоритм AES представляет собой симметричный блочный шифр, который может шифровать (encipher) и расшифровывать (decipher) цифровую информацию.

    Алгоритм AES способен использовать криптографические ключи длиной 128, 192 и 256 бит для шифрования и расшифровывания данных блоками по 128 бит.
  4. Утверждающий орган. Секретарь по торговле.
  5. Организация по сопровождению. Министерство торговли, Национальный институт стандартов и технологий, Лаборатория информационных технологий (ITL).
  6. Применимость. Федеральные стандарты обработки информации применяются к информационным системам, используемым или эксплуатируемым федеральными ведомствами, подрядчиком ведомства или иной организацией от имени ведомства. Они не применяются к системам национальной безопасности в значении, определённом в 44 U.S.C. 3552.

    Этот Стандарт может использоваться федеральными ведомствами для защиты информации, когда они определили, что шифрование является надлежащим, в соответствии с применимыми политиками Управления по управлению и бюджету и ведомств. Федеральные ведомства также могут использовать альтернативные методы, которые NIST указал как надлежащие для этой цели.

    Этот Стандарт может быть принят и использоваться нефедеральными правительственными организациями.
  7. Спецификации. Федеральный стандарт обработки информации (FIPS) 197, Advanced Encryption Standard (AES) (прилагается).
  8. Реализации. Алгоритм, определённый в настоящем Стандарте, может быть реализован в программном обеспечении, микропрограммном обеспечении, аппаратном обеспечении или любом их сочетании. Конкретная реализация может зависеть от нескольких факторов, таких как приложение, среда, используемая технология и т. д. Алгоритм ДОЛЖЕН (shall) использоваться совместно с одобренным FIPS или рекомендованным NIST режимом работы. Идентификаторы объектов (OIDs) и любые связанные параметры для AES, используемые в этих режимах, доступны в Реестре объектов компьютерной безопасности (CSOR), расположенном по адресу https://csrc.nist.gov/projects/csor.

    NIST разработал программу валидации для проверки реализаций на соответствие алгоритмам настоящего Стандарта. Информация о программе валидации доступна по адресу https://nist.gov/cmvp. Примеры для каждого размера ключа доступны по адресу https://csrc.nist.gov/projects/aes.
  9. График внедрения. Настоящий Стандарт вступил в силу 26 мая 2002 г.
  10. Патенты. Реализации алгоритма, определённого в настоящем Стандарте, могут быть охвачены патентами США и иностранных государств.
  11. Экспортный контроль. Некоторые криптографические устройства и технические данные о них подпадают под федеральный экспортный контроль. Экспорт криптографических модулей, реализующих настоящий Стандарт, и технических данных о них ДОЛЖЕН (must) соответствовать всем федеральным законам и нормативным актам и ДОЛЖЕН (must) быть лицензирован Бюро промышленности и безопасности Министерства торговли США. Информация об экспортных правилах доступна по адресу https://www.bis.doc.gov.
  12. Оговорки. NIST продолжит отслеживать развитие анализа алгоритма AES. Как и в случае с другими своими стандартами криптографических алгоритмов, NIST будет официально проводить повторную оценку настоящего Стандарта каждые пять лет.

    Как настоящий Стандарт, так и возможные угрозы, снижающие безопасность, обеспечиваемую посредством использования настоящего Стандарта, будут проходить проверку NIST по мере необходимости с учётом вновь доступных анализа и технологий. Кроме того, осведомлённость о любом технологическом прорыве или любой математической слабости алгоритма приведёт к тому, что NIST проведёт повторную оценку настоящего Стандарта и внесёт необходимые изменения.
  13. Где получить экземпляры. Эта публикация доступна по адресу https://csrc.nist.gov/publications. Другие публикации по компьютерной безопасности доступны на том же веб-сайте.
  14. Запросы и комментарии. Запросы и комментарии относительно этого FIPS могут быть направлены по адресу fips-197-comments@nist.gov.
  15. Как цитировать эту публикацию. NIST присвоил NIST FIPS 197-upd1 в качестве идентификатора публикации для данного FIPS в соответствии с NIST Technical Series Publication Identifier Syntax. NIST рекомендует цитировать её следующим образом:

    National Institute of Standards and Technology (2001) Advanced Encryption Standard (AES). (Department of Commerce, Washington, D.C.), Federal Information Processing Standards Publication (FIPS) NIST FIPS 197-upd1, updated May 9, 2023. https://doi.org/10.6028/NIST.FIPS.197-upd1

Публикация федеральных стандартов обработки информации 197

Спецификация для
УСОВЕРШЕНСТВОВАННОГО СТАНДАРТА ШИФРОВАНИЯ (AES)

Содержание

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.1CIPHER()12
5.1.1SUBBYTES()13
5.1.2SHIFTROWS()14
5.1.3MIXCOLUMNS()15
5.1.4ADDROUNDKEY()16
5.2KEYEXPANSION()17

FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)

5.3INVCIPHER()18
5.3.1INVSHIFTROWS()22
5.3.2INVSUBBYTES()23
5.3.3INVMIXCOLUMNS()24
5.3.4Обратное преобразование ADDROUNDKEY()24
5.3.5EQINVCIPHER()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
Таблица 4SBOX(): значения подстановки для байта xy (в шестнадцатеричном формате)14
Таблица 5Константы раундов17
Таблица 6INVSBOX(): значения подстановки для байта xy (в шестнадцатеричном формате)23

Список рисунков

Рисунок 1Вход и выход массива состояния7
Рисунок 2Иллюстрация SUBBYTES()13
Рисунок 3Иллюстрация SHIFTROWS()15
Рисунок 4Иллюстрация MIXCOLUMNS()16
Рисунок 5Иллюстрация ADDROUNDKEY()16
Рисунок 6KEYEXPANSION() AES-128 для генерации слов w[i] при 4 ≤ i < 44, где l принимает значения, кратные 4, от 0 до 3619
Рисунок 7KEYEXPANSION() AES-192 для генерации слов w[i] при 6 ≤ i < 52, где l принимает значения, кратные 6, от 0 до 4220
Рисунок 8KEYEXPANSION() AES-256 для генерации слов w[i] при 8 ≤ i < 60, где l принимает значения, кратные 8, от 0 до 4821
Рисунок 9Иллюстрация INVSHIFTROWS()23

Список алгоритмов

Алгоритм 1Псевдокод CIPHER()12
Алгоритм 2Псевдокод KEYEXPANSION()18
Алгоритм 3Псевдокод INVCIPHER()22
Алгоритм 4Псевдокод EQINVCIPHER()25
Алгоритм 5Псевдокод KEYEXPANSIONEIC()25

vii

1. Введение

Блок — это последовательность битов заданной фиксированной длины. Блочный шифр — это семейство перестановок блоков, параметризуемое последовательностью битов, называемой ключом.

В 1997 году NIST начал работу по разработке Advanced Encryption Standard (AES) [1] и призвал общественность представить кандидатные алгоритмы блочных шифров. Блочные шифры являются основой многих криптографических служб, особенно тех, которые обеспечивают гарантии конфиденциальности данных. В 2000 году NIST объявил о выборе Rijndael [2, 3] для AES.

Этот Стандарт определяет три реализации Rijndael: AES-128, AES-192 и AES-256, где суффикс указывает битовую длину ключа. Размер блока (то есть длина входных и выходных данных) в каждом случае составляет 128 битов. Rijndael поддерживает дополнительные размеры блоков и длины ключей, которые не приняты в этом Стандарте.

Этот Стандарт организован следующим образом:

  • Раздел 2 определяет термины, сокращения, параметры алгоритма, символы и функции, используемые в этом Стандарте.
  • Раздел 3 описывает обозначения и соглашения об упорядочении и индексировании битов, байтов и слов.
  • Раздел 4 поясняет некоторые математические компоненты спецификаций AES: арифметику конечных полей и умножение на фиксированную матрицу элементов конечного поля.
  • Раздел 5 определяет AES-128, AES-192 и AES-256.
  • Раздел 6 содержит рекомендации по реализации, касающиеся требований к длине ключа, ограничений на ключи, расширений параметров и рекомендаций по реализации для различных платформ.
  • Приложение A содержит примеры процедур расширения ключа для AES-128, AES-192 и AES-256.
  • Приложение B содержит пошаговый пример вызова AES-128.
  • Приложение C содержит ссылку на веб-сайт NIST с обширными примерами векторов для AES-128, AES-192 и AES-256.
  • Приложение D суммирует обновления исходной версии данной публикации.

1

2. Определения

2.1 Термины и сокращения

В этом Стандарте используются следующие определения:

AES
Advanced Encryption Standard.
Аффинное преобразование
Преобразование, состоящее из умножения на матрицу с последующим сложением вектора.
Массив
Структура данных фиксированного размера, хранящая совокупность элементов, каждый из которых идентифицируется своим целочисленным индексом или индексами.
Бит
Двоичная цифра: 0 или 1.
Блок
Последовательность битов заданной фиксированной длины. В этом Стандарте блоки состоят из 128 битов, иногда представляемых в виде массивов байтов или слов.
Блочный шифр
Семейство перестановок блоков, параметризуемое ключом.
Байт
Последовательность из восьми битов.
Эквивалентный обратный шифр
Альтернативная спецификация обратного преобразования CIPHER() со структурой, подобной структуре CIPHER(), и с модифицированным расписанием ключей в качестве входных данных.
Ключ
Параметр блочного шифра, определяющий выбор перестановки из семейства блочного шифра.
Расписание ключей
Последовательность раундовых ключей, генерируемых из ключа посредством KEYEXPANSION().
Rijndael
Блочный шифр, выбранный NIST победителем конкурса AES.
Раунд
Последовательность преобразований состояния, повторяемая Nr раз в спецификациях CIPHER(), INVCIPHER() и EQINVCIPHER(). Последовательность состоит из четырёх преобразований, за исключением одной итерации, в которой одно из преобразований опущено.
Раундовый ключ
Один из Nr + 1 массивов из четырёх слов, получаемых из ключа блочного шифра с использованием процедуры расширения ключа; каждый раундовый ключ является входными данными для экземпляра ADDROUNDKEY() в блочном шифре AES.
Состояние
Промежуточный результат блочного шифра AES, представленный двумерным массивом байтов с четырьмя строками и Nb столбцами.
S-box
Нелинейная таблица подстановки, используемая в SUBBYTES() и KEYEXPANSION() для выполнения взаимно однозначной подстановки значения байта.
Слово
Группа из 32 битов, рассматриваемая либо как единое целое, либо как массив из 4 байтов.

2

2.2 Список функций

В этом Стандарте определены следующие функции:

ADDROUNDKEY()
Преобразование состояния, при котором раундовый ключ объединяется с состоянием.
AES-128()
Блочный шифр, определённый в этом Стандарте, с 128-битными ключами.
AES-192()
Блочный шифр, определённый в этом Стандарте, с 192-битными ключами.
AES-256()
Блочный шифр, определённый в этом Стандарте, с 256-битными ключами.
CIPHER()
Преобразование блоков, лежащее в основе AES-128, AES-192 и AES-256; расписание ключей и число раундов являются параметрами преобразования.
EQINVCIPHER()
Обратное преобразование CIPHER(), в котором dw заменяет w в качестве параметра расписания ключей.
INVCIPHER()
Обратное преобразование CIPHER().
INVMIXCOLUMNS()
Обратное преобразование MIXCOLUMNS().
INVSBOX()
Обратное преобразование SBOX().
INVSHIFTROWS()
Обратное преобразование SHIFTROWS().
INVSUBBYTES()
Обратное преобразование SUBBYTES().
KEYEXPANSION()
Процедура, генерирующая раундовые ключи из ключа.
KEYEXPANSIONEIC()
Процедура, генерирующая модифицированные раундовые ключи для эквивалентного обратного шифра.
MIXCOLUMNS()
Преобразование состояния, которое берёт все столбцы состояния и смешивает их данные (независимо друг от друга), формируя новые столбцы.
ROTWORD()
Преобразование слов, при котором четыре байта слова циклически переставляются.
SBOX()
Преобразование байтов, определяемое S-box.
SHIFTROWS()
Преобразование состояния, при котором последние три строки циклически сдвигаются на различные смещения.
SUBBYTES()
Преобразование состояния, применяющее S-box независимо к каждому байту состояния.
SUBWORD()
Преобразование слов, при котором S-box применяется к каждому из четырёх байтов слова.
XTIMES()
Преобразование байтов, при котором полиномиальное представление входного байта умножается на x по модулю m(x), образуя полиномиальное представление выходного байта.

3

2.3 Параметры и символы алгоритма

b−1
Мультипликативная обратная величина элемента b в GF(28).
b̃
Входные данные аффинного преобразования в S-box AES.
dw
Массив слов для расписания ключей, являющийся входными данными эквивалентного обратного шифра.
GF(2)
Конечное поле с двумя элементами.
GF(28)
Конечное поле с 256 элементами.
in
Входные данные CIPHER() или INVCIPHER(), представленные массивом из 16 байтов с индексами от 0 до 15.
m(x)
Модуль, определённый в этом стандарте для полиномиального представления байтов как элементов GF(28).
key
Массив из Nk слов, составляющих ключ для AES-128, AES-192 или AES-256.
Nb
Число столбцов, составляющих состояние, где каждый столбец является 32-битным словом. Для этого Стандарта Nb = 4.
Nk
Число 32-битных слов, составляющих ключ. Для AES-128, AES-192 и AES-256 значению Nk присваиваются соответственно 4, 6 и 8 (см. раздел 6.3).
Nr
Число раундов. Для AES-128, AES-192 и AES-256 значению Nr присваиваются соответственно 10, 12 и 14.
out
Выходные данные CIPHER() или INVCIPHER(), представленные массивом из 16 байтов с индексами от 0 до 15.
Rcon
Массив слов для константы раунда.
state
Состояние, представленное двумерным массивом из 16 байтов, со строками и столбцами, индексируемыми от 0 до 3.
u[i]
Для одномерного массива u слов или байтов — элемент массива, индексируемый неотрицательным целым числом i.
u[i..i + 3]
Для массива u слов — последовательность u[i], u[i + 1], u[i + 2], u[i + 3].
w
Массив слов для расписания ключей.
⊕
Либо операция исключающего ИЛИ над битами, либо побитовая операция исключающего ИЛИ над байтами, либо побитовая операция исключающего ИЛИ над словами.
•
Умножение в GF(28).
∗
Умножение целых чисел.
←
Присваивание переменной в псевдокоде.
{}
Разделители для байта в шестнадцатеричной или двоичной записи.

4

FIPS 197 — ADVANCED ENCRYPTION STANDARD (AES)

3. Обозначения и соглашения

3.1 Входные и выходные данные

Бит — это двоичная цифра: 0 или 1. Блок — это последовательность из 128 бит; входные и выходные данные для блочных шифров AES являются блоками. Другой входной величиной для блочных шифров AES, называемой ключом, является битовая последовательность, которая обычно устанавливается заранее и сохраняется при многих вызовах блочного шифра. Длины ключей для AES-128, AES-192 и AES-256 составляют 128 бит, 192 бита и 256 бит соответственно.

3.2 Байты

Основной единицей обработки в алгоритмах AES является байт — последовательность из восьми бит.

Значение байта обозначается конкатенацией восьми битов, заключённой в фигурные скобки (например, {10100011}). Когда биты байта обозначаются индексированной переменной, в настоящем Стандарте принято, что индексы убывают слева направо (то есть {b7 b6 b5 b4 b3 b2 b1 b0}).

Также удобно обозначать значения байтов шестнадцатеричной записью. Шестнадцать шестнадцатеричных символов представляют последовательности из четырёх битов, как указано в Таблице 1. Байт представляется упорядоченной парой шестнадцатеричных символов, где левый символ пары представляет четыре самых левых бита (то есть b7, b6, b5, b4), а правый символ пары представляет четыре самых правых бита (то есть b3, b2, b1, b0). Например, шестнадцатеричная форма байта {10100011} — {a3}.

Таблица 1. Шестнадцатеричное представление 4-битовых последовательностей
Последовательность0 0 0 00 0 0 10 0 1 00 0 1 10 1 0 00 1 0 10 1 1 00 1 1 1
Символ01234567
Последовательность1 0 0 01 0 0 11 0 1 01 0 1 11 1 0 01 1 0 11 1 1 01 1 1 1
Символ89abcdef

3.3 Индексирование последовательностей байтов

Чтобы однозначно представлять входные данные и ключ как последовательности байтов, в настоящем Стандарте принято следующее соглашение об индексировании. Пусть задана последовательность из 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)

где

a₀ = {r₀ r₁ … r₇}; a₁ = {r₈ r₉ … r₁₅}; …; a₁₅ = {r₁₂₀ r₁₂₁ … r₁₂₇}. (3.5)

Как описано в разделе 3.2, биты внутри любого отдельного байта индексируются в убывающем порядке слева направо. Такой порядок более естественен для арифметики конечного поля над байтами, описанной в разделе 4. Два вида битовых индексов для последовательностей байтов показаны в Таблице 2.

Таблица 2. Индексы байтов и битов
Битовый индекс в последовательности0123456789101112131415…
Байтовый индекс01…
Битовый индекс в байте7654321076543210…

3.4 Состояние

Внутри алгоритмы для блочных шифров 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.

Входные байты, массив состояния и выходные байты
Рисунок 1. Вход и выход массива состояния

3.5 Массивы слов

Слово — это последовательность из четырёх байтов; блок состоит из четырёх слов. Четыре столбца массива состояния s интерпретируются как массив v из четырёх слов следующим образом, в обозначениях Рисунка 1:

v₀, v₁, v₂ и v₃ как столбцы массива состояния s. (3.8)

Таким образом, индекс столбца c массива s становится индексом для v, а индекс строки r массива s становится индексом для четырёх байтов в каждом слове.

Для одномерного массива слов u запись u[i] обозначает слово с индексом i, а последовательность из четырёх слов u[i], u[i + 1], u[i + 2], u[i + 3] обозначается u[i..i + 3].

4. Математические предварительные сведения

Для некоторых преобразований алгоритмов 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.

4.1 Сложение в GF(28)

Чтобы сложить два элемента в конечном поле 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. Аналогично, сумма любого элемента с самим собой является нулевым элементом.

4.2 Умножение в GF(28)

Символ • обозначает умножение в 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), следующим образом:

Определение XTIMES(b). (4.5)

Условия в формуле (4.5): первая строка — если b7 = 0; вторая строка — если b7 = 1.

Умножение на более высокие степени x (такие как {04}, {08} и {10}) может быть реализовано повторным применением XTIMES(). Например, пусть b = {57}:

Примеры умножения {57} на {01}, {02}, {04}, {08}, {10}, {20}, {40} и {80}. (4.6)

Эти произведения облегчают вычисление любого кратного {57}. Например, поскольку {13} = {10}⊕{02}⊕{01}, следует, что

Вычисление {57}•{13} = {fe}. (4.7)

4.3 Умножение слов на фиксированную матрицу

Два преобразования — MIXCOLUMNS() и INVMIXCOLUMNS() — в алгоритмах для блочных шифров AES могут быть выражены через умножение матриц. В частности, для каждого преобразования задаётся отдельная фиксированная матрица. Для обеих матриц каждая из 16 записей матрицы является байтом одного заданного слова, обозначаемого здесь [a0, a1, a2, a3].

Для входного слова [b0, b1, b2, b3] преобразования выходное слово [d0, d1, d2, d3] определяется арифметикой конечного поля следующим образом:

Определение d₀, d₁, d₂ и d₃. (4.8)

Матричная форма уравнения (4.8) имеет вид

Матричная форма уравнения (4.8). (4.9)

4.4 Мультипликативные обратные элементы в GF(28)

Для байта 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)

5. Спецификации алгоритмов

Общая функция для выполнения 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.

Таблица 3. Комбинации ключа, блока и раундов
Длина ключаРазмер блокаЧисло раундов
Nk(в битах)Nb(в битах)Nr
AES-1284128412810
AES-1926192412812
AES-2568256412814

Тремя входными значениями 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 соответственно.

5.1 CIPHER()

Раунды в спецификации CIPHER() состоят из следующих четырёх байт-ориентированных преобразований состояния:

  • SUBBYTES() применяет таблицу подстановки (S-box) к каждому байту.
  • SHIFTROWS() сдвигает строки массива состояния на разные смещения.
  • MIXCOLUMNS() перемешивает данные внутри каждого столбца массива состояния.
  • ADDROUNDKEY() объединяет раундовый ключ с состоянием.

Четыре преобразования определены в разделах 5.1.1–5.1.4. В этих спецификациях преобразованный бит, байт или блок обозначается добавлением символа ′ в качестве верхнего индекса к исходной переменной (т. е. как b′, b′i, s′i,j или s′).

Раундовые ключи для ADDROUNDKEY() формируются KEYEXPANSION(), которая определена в разделе 5.2. В частности, расписание ключа представляется как массив w из 4 ∗ (Nr + 1) слов.

CIPHER() определена псевдокодом в алгоритме 1.

Алгоритм 1 Псевдокод для CIPHER()
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.

5.1.1 SUBBYTES()

SUBBYTES() — обратимое нелинейное преобразование состояния, при котором таблица подстановки, называемая S-box, применяется независимо к каждому байту состояния. S-box AES обозначается SBOX().

Пусть b обозначает входной байт SBOX(), а c обозначает постоянный байт {01100011}. Выходной байт b′ = SBOX(b) строится композицией следующих двух преобразований:

  1. Определите промежуточное значение b̃ следующим образом, где b−1 — мультипликативная обратная величина к b, как описано в разделе 4.4:
Уравнение (5.2)
  1. Примените следующее аффинное преобразование битов b̃, чтобы получить биты 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):

Уравнение (5.4)

На рисунке 2 показано, как SUBBYTES() преобразует состояние.

Иллюстрация SUBBYTES()
Рисунок 2. Иллюстрация SUBBYTES()

S-box AES представлена в шестнадцатеричной форме в таблице 4. Например, если sr,c = {53}, то

Таблица 4. SBOX(): значения подстановки для байта xy (в шестнадцатеричном формате)
y
x0123456789abcdef
0637c777bf26b6fc53001672bfed7ab76
1ca82c97dfa5947f0add4a2af9ca472c0
2b7fd9326363ff7cc34a5e5f171d83115
304c723c31896059a071280e2eb27b275
409832c1a1b6e5aa0523bd6b329e32f84
553d100ed20fcb15b6acbbe394a4c58cf
6d0efaafb434d338545f9027f503c9fa8
751a3408f929d38f5bcb6da2110fff3d2
8cd0c13ec5f974417c4a77e3d645d1973
960814fdc222a908846eeb814de5e0bdb
ae0323a0a4906245cc2d3ac629195e479
be7c8376d8dd54ea96c56f4ea657aae08
cba78252e1ca6b4c6e8dd741f4bbd8b8a
d703eb5664803f60e613557b986c11d9e
ee1f8981169d98e949b1e87e9ce5528df
f8ca1890dbfe6426841992d0fb054bb16

значение подстановки определяется пересечением строки с индексом «5» и столбца с индексом «3» в таблице 4, так что s′r,c = {ed}.

5.1.2 SHIFTROWS()

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, не изменяется.

Иллюстрация SHIFTROWS()
Рисунок 3. Иллюстрация SHIFTROWS()

5.1.3 MIXCOLUMNS()

MIXCOLUMNS() — преобразование состояния, которое умножает каждый из четырёх столбцов состояния на одну фиксированную матрицу, как описано в разделе 4.3, с элементами, взятыми из следующего слова:

[a0,a1,a2,a3] = [{02},{01},{01},{03}].                                      (5.6)

Таким образом,

Уравнение (5.7)

так что отдельные выходные байты определяются следующим образом:

Уравнение (5.8)

На рисунке 4 показано MIXCOLUMNS().

Иллюстрация MIXCOLUMNS()
Рисунок 4. Иллюстрация MIXCOLUMNS()

5.1.4 ADDROUNDKEY()

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.

Иллюстрация ADDROUNDKEY()
Рисунок 5. Иллюстрация ADDROUNDKEY()

FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)

5.2 KEYEXPANSION()

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:

Таблица 5. Константы раунда
jRcon[j]jRcon[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], следующим образом:

  • Если i кратно Nk, то w[i] = w[i − Nk] ⊕ SUBWORD(ROTWORD(w[i − 1])) ⊕ Rcon[i/Nk].
  • Для AES-256, если i + 4 кратно 8, то w[i] = w[i − Nk] ⊕ SUBWORD(w[i − 1]).
  • Во всех остальных случаях w[i] = w[i − Nk] ⊕ w[i − 1].

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.

5.3 INVCIPHER()

Для реализации 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)

Рисунок 6. KEYEXPANSION() AES-128 для формирования слов w[i] при 4 ≤ i < 44, где l принимает значения, кратные 4, от 0 до 36.

FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)

Рисунок 7. KEYEXPANSION() AES-192 для формирования слов w[i] при 6 ≤ i < 52, где l принимает значения, кратные 6, от 0 до 42.

FIPS 197 ADVANCED ENCRYPTION STANDARD (AES)

Рисунок 8. KEYEXPANSION() AES-256 для формирования слов w[i] при 8 ≤ i < 60, где l принимает значения, кратные 8, от 0 до 48.

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

5.3.1 INVSHIFTROWS()

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

s′r,c = sr,(c−r) mod 4      для 0 ≤ r < 4 и 0 ≤ c < 4.                         (5.12)

INVSHIFTROWS() проиллюстрировано на рисунке 9. В таком представлении состояния эффект заключается в перемещении каждого байта на r позиций вправо в строке, при этом крайние правые r байтов циклически переносятся в левый конец строки. Первая строка, для которой r = 0, не изменяется.

FIPS 197. Стандарт усовершенствованного шифрования (AES)

Иллюстрация INVSHIFTROWS()
Рисунок 9. Иллюстрация INVSHIFTROWS()

5.3.2 INVSUBBYTES()

INVSUBBYTES() является обратной операцией к SUBBYTES(), при которой к каждому байту состояния применяется обратная к SBOX(), обозначаемая INVSBOX(). INVSBOX() получается из таблицы 4 перестановкой ролей входов и выходов, как показано в таблице 6:

Таблица 6. INVSBOX(): значения подстановки для байта xy (в шестнадцатеричном формате)
y
x0123456789abcdef
052096ad53036a538bf40a39e81f3d7fb
17ce339829b2fff87348e4344c4dee9cb
2547b9432a6c2233dee4c950b42fac34e
3082ea16628d924b2765ba2496d8bd125
472f8f66486689816d4a45ccc5d65b692
56c704850fdedb9da5e154657a78d9d84
690d8ab008cbcd30af7e45805b8b34506
7d02c1e8fca3f0f02c1afbd0301138a6b
83a9111414f67dcea97f2cfcef0b4e673
996ac7422e7ad3585e2f937e81c75df6e
a47f11a711d29c5896fb7620eaa18be1b
bfc563e4bc6d279209adbc0fe78cd5af4
c1fdda8338807c731b11210592780ec5f
d60517fa919b54a0d2de57a9f93c99cef
ea0e03b4dae2af5b0c8ebbb3c83539961
f172b047eba77d626e169146355210c7d

5.3.3 INVMIXCOLUMNS()

INVMIXCOLUMNS() является обратной операцией к MIXCOLUMNS(). В частности, INVMIXCOLUMNS() умножает каждый из четырёх столбцов состояния на одну фиксированную матрицу, как описано в разделе 4.3, элементы которой берутся из следующего слова:

[a₀, a₁, a₂, a₃] = [{0e}, {09}, {0d}, {0b}].                                            (5.13)

Таким образом,

Уравнение 5.14

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

Уравнение 5.15

5.3.4 Обратная операция к ADDROUNDKEY()

ADDROUNDKEY(), описанная в разделе 5.1.4, является собственной обратной операцией.

5.3.5 EQINVCIPHER()

Несколько свойств алгоритма AES допускают альтернативное описание обратной операции к CIPHER(), называемое эквивалентным обратным шифром и обозначаемое EQINVCIPHER(). В описании EQINVCIPHER() преобразования раундовой функции шифра в алг. 1 непосредственно заменяются их обратными преобразованиями в EQINVCIPHER() в том же порядке. Эффективность этой структуры по сравнению с описанием INVCIPHER() в алг. 3 объясняется в документе с предложением Rijndael [2].

Псевдокод эквивалентного обратного шифра, приведённый в алг. 4, использует модифицированное расписание ключей, обозначаемое массивом слов dw. Процедура формирования dw является расширением KEYEXPANSION(), обозначаемым KEYEXPANSIONEIC(); её псевдокод приведён в алг. 5.

Алгоритм 4. Псевдокод для EQINVCIPHER()

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

Алгоритм 5. Псевдокод для KEYEXPANSIONEIC()

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.

6. Соображения по реализации

6.1 Требования к длине ключа

Реализация алгоритма AES ДОЛЖНА (shall) поддерживать по меньшей мере одну из трёх длин ключа, указанных в разд. 5: 128, 192 или 256 битов (то есть Nk = 4, 6 или 8 соответственно). Реализации могут дополнительно поддерживать две или три длины ключа, что может способствовать взаимодействию реализаций алгоритма.

6.2 Ограничения на ключи

Если криптографический ключ был сгенерирован надлежащим образом (рекомендации см. в NIST Special Publication 800-133, Rev. 2 [6]), при использовании полученного ключа для алгоритма AES никаких ограничений не налагается.

6.3 Расширения параметров

В таблице 3 настоящий Стандарт явно определяет допустимые значения длины ключа (Nk), размера блока (Nb) и числа раундов (Nr). Однако будущие редакции настоящего Стандарта могут включать изменения или дополнения допустимых значений этих параметров. Поэтому разработчики реализации могут выбрать проектирование своих реализаций AES с учётом будущей гибкости.

6.4 Рекомендации по реализации для различных платформ

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

Документ с предложением AES [2] и другие ресурсы, расположенные на странице AES [7], содержат рекомендации по эффективной реализации алгоритма AES на различных платформах. Предлагаемые реализации предназначены для объяснения внутренней работы алгоритма AES, но не обеспечивают защиты от различных атак на реализацию.

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

Следует рассматривать защиту реализаций алгоритма AES от атак на реализацию там, где это применимо. Такие соображения выходят за рамки настоящего документа, но учитываются при тестировании на соответствие алгоритму, определённому в настоящем Стандарте, согласно программе валидации, разработанной NIST (см. https://nist.gov/cmvp).

6.5 Режимы работы

Режимы работы блочного шифра — это криптографические функции, использующие блочный шифр для предоставления информационных услуг, таких как конфиденциальность и аутентификация. Рекомендованные NIST режимы работы определены в серии публикаций NIST Special Publications 800-38. Дополнительная информация доступна по адресу https://csrc.nist.gov/Projects/block-cipher-techniques/BCM.

Список литературы

  1. James Nechvatal, Elaine Barker, Lawrence Bassham, William Burr, Morris Dworkin, James Foti, and Edward Roback. Report on the Development of the Advanced Encryption Standard (AES). Journal of Research of NIST (NIST JRES), May 2001. https://doi.org/10.6028/jres.106.023.
  2. Joan Daemen and Vincent Rijmen. AES Proposal: Rijndael Document Version 2. AES Algorithm Submission, September 1999. Available at https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf.
  3. Joan Daemen and Vincent Rijmen. The Design of Rijndael - The Advanced Encryption Standard (AES), Second Edition. Information Security and Cryptography. Springer, 2020. https://doi.org/10.1007/978-3-662-60769-5.
  4. Michael Artin. Algebra. Pearson Modern Classic. Pearson, second edition, 2017.
  5. Alfred J. Menezes, Scott A. Vanstone, and Paul C. Van Oorschot. Handbook of Applied Cryptography. CRC Press, Inc., USA, 1st edition, 1997. https://doi.org/10.1201/9780429466335.
  6. Elaine Barker, Allen Roginsky, and Richard Davis. Recommendation for Cryptographic Key Generation. (National Institute of Standards and Technology, Gaithersburg, MD), NIST Special Publication (SP) 800-133, Rev. 2, June 2020. https://doi.org/10.6028/NIST.SP.800-133r2.
  7. National Institute of Standards and Technology. AES Development, 2022. Available at https://csrc.nist.gov/projects/aes.
  8. National Institute of Standards and Technology. Cryptographic Standards and Guidelines: Examples with Intermediate Values, 2022. Available at https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/example-values.
  9. National Institute of Standards and Technology. Crypto Publications Review Board, 2022. Available at https://csrc.nist.gov/projects/crypto-publication-review-project.
  10. Nicky Mouha. Review of the Advanced Encryption Standard. (National Institute of Standards and Technology, Gaithersburg, MD), NIST Interagency Report (IR) 8319. https://doi.org/10.6028/NIST.IR.8319.

FIPS 197

ADVANCED ENCRYPTION STANDARD (AES)

Приложение A — Примеры развёртывания ключа

В этом приложении показано построение расписания ключа для каждого размера ключа. Обратите внимание, что многобайтные значения представлены с использованием обозначений, описанных в разд. 3. Промежуточные значения, получаемые при построении расписания ключа (см. разд. 5.2), приведены в следующей таблице (все значения представлены в шестнадцатеричном формате, за исключением столбца индекса (i)).

A.1 Развёртывание 128-битного ключа

В этом разделе приведено развёртывание следующего ключа:

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]
409cf4f3ccf4f3c098a84eb01010000008b84eb012b7e1516a0fafe17
5a0fafe1728aed2a688542cb1
688542cb1abf7158823a33939
723a3393909cf4f3c2a6c7605
82a6c76056c76052a50386be50200000052386be5a0fafe17f2c295f2
9f2c295f288542cb17a96b943
107a96b94323a339395935807a
115935807a2a6c76057359f67f
127359f67f59f67f73cb42d28f04000000cf42d28ff2c295f23d80477d
133d80477d7a96b9434716fe3e
144716fe3e5935807a1e237e44
151e237e447359f67f6d7a883b
166d7a883b7a883b6ddac4e23c08000000d2c4e23c3d80477def44a541
17ef44a5414716fe3ea8525b7f
18a8525b7f1e237e44b671253b
19b671253b6d7a883bdb0bad00
20db0bad000bad00db2b9563b9100000003b9563b9ef44a541d4d1c6f8
21d4d1c6f8a8525b7f7c839d87
227c839d87b671253bcaf2b8bc
23caf2b8bcdb0bad0011f915bc
2411f915bcf915bc119959658220000000b9596582d4d1c6f86d88a37a
256d88a37a7c839d87110b3efd
26110b3efdcaf2b8bcdbf98641
27dbf9864111f915bcca0093fd
28ca0093fd0093fdca63dc54744000000023dc54746d88a37a4e54f70e
294e54f70e110b3efd5f5fc9f3
305f5fc9f3dbf9864184a64fb2
3184a64fb2ca0093fd4ea6dc4f
324ea6dc4fa6dc4f4e2486842f80000000a486842f4e54f70eead27321
33ead273215f5fc9f3b58dbad2
34b58dbad284a64fb2312bf560
35312bf5604ea6dc4f7f8d292f
367f8d292f8d292f7f5da515d21b00000046a515d2ead27321ac7766f3
37ac7766f3b58dbad219fadc21
3819fadc21312bf56028d12941
3928d129417f8d292f575c006e
40575c006e5c006e574a639f5b360000007c639f5bac7766f3d014f9a8
41d014f9a819fadc21c9ee2589
42c9ee258928d12941e13f0cc8
43e13f0cc8575c006eb6630ca6

A.2 Развёртывание 192-битного ключа

В этом разделе приведено развёртывание следующего ключа:

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]
6522c6b7b2c6b7b52717f210001000000707f21008e73b0f7fe0c91f7
7fe0c91f7da0e64522402f5a5
82402f5a5c810f32bec12068e
9ec12068e809079e56c827f6b
106c827f6b62f8ead20e7a95b9
110e7a95b9522c6b7b5c56fec2
125c56fec256fec25cb1bb254a02000000b3bb254afe0c91f74db7b4bd
134db7b4bd2402f5a569b54118
1469b54118ec12068e85a74796
1585a747966c827f6be92538fd
16e92538fd0e7a95b9e75fad44
17e75fad445c56fec2bb095386
18bb095386095386bb01ed44ea0400000005ed44ea4db7b4bd485af057
19485af05769b5411821efb14f
2021efb14f85a74796a448f6d9
21a448f6d9e92538fd4d6dce24
224d6dce24e75fad44aa326360
23aa326360bb095386113b30e6
24113b30e63b30e611e2048e8208000000ea048e82485af057a25e7ed5
25a25e7ed521efb14f83b1cf9a
2683b1cf9aa448f6d927f93943
2727f939434d6dce246a94f767
286a94f767aa326360c0a69407
29c0a69407113b30e6d19da4e1
30d19da4e19da4e1d15e49f83e100000004e49f83ea25e7ed5ec1786eb
31ec1786eb83b1cf9a6fa64971
326fa6497127f93943485f7032
33485f70326a94f76722cb8755
3422cb8755c0a69407e26d1352
35e26d1352d19da4e133f0b7b3
3633f0b7b3f0b7b3338ca96dc320000000aca96dc3ec1786eb40beeb28
3740beeb286fa649712f18a259
382f18a259485f70326747d26b
396747d26b22cb8755458c553e
40458c553ee26d1352a7e1466c
41a7e1466c33f0b7b39411f1df
429411f1df11f1df9482a19e2240000000c2a19e2240beeb28821f750a
43821f750a2f18a259ad07d753
44ad07d7536747d26bca400538
45ca400538458c553e8fcc5006
468fcc5006a7e1466c282d166a
47282d166a9411f1dfbc3ce7b5
48bc3ce7b53ce7b5bceb94d565800000006b94d565821f750ae98ba06f
49e98ba06fad07d753448c773c
50448c773cca4005388ecc7204
518ecc72048fcc500601002202

A.3 Развёртывание 256-битного ключа

В этом разделе приведено развёртывание следующего ключа:

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]
80914dff414dff409fa9ebf0101000000fb9ebf01603deb109ba35411
99ba3541115ca71be8e6925af
108e6925af2b73aef0a51a8b5f
11a51a8b5f857d77812067fcde
122067fcdeb785b01d1f352c07a8b09c1a
13a8b09c1a3b6108d793d194cd
1493d194cd2d9810a3be49846e
15be49846e0914dff4b75d5b9a
16b75d5b9a5d5b9ab74c39b8a9020000004e39b8a99ba35411d59aecb8
17d59aecb88e6925af5bf3c917
185bf3c917a51a8b5ffee94248
19fee942482067fcdede8ebe96
20de8ebe961d19ae90a8b09c1ab5a9328a
21b5a9328a93d194cd2678a647
222678a647be49846e98312229
2398312229b75d5b9a2f6c79b3
242f6c79b36c79b32f50b66d150400000054b66d15d59aecb8812c81ad
25812c81ad5bf3c917dadf48ba
26dadf48bafee9424824360af2
2724360af2de8ebe96fab8b464
28fab8b4642d6c8d43b5a9328a98c5bfc9
2998c5bfc92678a647bebd198e
30bebd198e98312229268c3ba7
31268c3ba72f6c79b309e04214
3209e04214e0421409e12cfa0108000000e92cfa01812c81ad68007bac
3368007bacdadf48bab2df3316
34b2df331624360af296e939e4
3596e939e4fab8b4646c518d80
366c518d8050d15dcd98c5bfc9c814e204
37c814e204bebd198e76a9fb8a
3876a9fb8a268c3ba75025c02d
395025c02d09e0421459c58239
4059c58239c5823959a61312cb10000000b61312cb68007bacde136967
41de136967b2df33166ccc5a71
426ccc5a7196e939e4fa256395
43fa2563956c518d809674ee15
449674ee1590922859c814e2045886ca5d
455886ca5d76a9fb8a2e2f31d7
462e2f31d75025c02d7e0af1fa
477e0af1fa59c5823927cf73c3
4827cf73c3cf73c3278a8f2ecc20000000aa8f2eccde136967749c47ab
49749c47ab6ccc5a7118501dda
5018501ddafa256395e2757e4f
51e2757e4f9674ee157401905a
527401905a927c60be5886ca5dcafaaae3
53cafaaae32e2f31d7e4d59b34
54e4d59b347e0af1fa9adf6ace
559adf6ace27cf73c3bd10190d
56bd10190d10190dbdcad4d77a400000008ad4d77a749c47abfe4890d1
57fe4890d118501ddae6188d0b
58e6188d0be2757e4f046df344
59046df3447401905a706c631e

Приложение B — Пример шифрования

Следующая схема показывает значения в массиве состояния по мере выполнения шифрования для длины блока и длины ключа по 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

Приложение C — Примеры векторов

NIST Computer Security Resource Center предоставляет веб-сайт с «примерами с промежуточными значениями» для AES [8].

Приложение D — Журнал изменений (информационное)

Исходный FIPS 197 (26 ноября 2001 г.) был рассмотрен и обновлён под эгидой Совета NIST по обзору криптографических публикаций [9]. Публичные комментарии и анализы безопасности AES, описанные в NIST IR 8319 [10], послужили основой для решения сохранить технические спецификации Стандарта.

Ниже приведено краткое изложение редакционных изменений исходного FIPS 197 в обновлении от 9 мая 2023 г., NIST FIPS 197-upd1:

  1. Было улучшено форматирование многих элементов публикации, а текст был пересмотрен для ясности.
  2. В предварительную часть были добавлены следующие элементы: титульный лист, предисловие, аннотация и ключевые слова. Имена и аффилиации должностных лиц на титульном листе отражают исходную публикацию.
  3. Разделы объявлений были обновлены с учётом действующих законов, нормативных актов, стандартов, руководств и программ валидации.
  4. Раздел 1 был пересмотрен, чтобы 1) добавить и обновить ссылки на работы по разработке AES и 2) явно назвать AES-128, AES-192 и AES-256.
  5. Материал прежнего раздела 2.2 (Параметры алгоритма, символы и функции) был разделён на два новых раздела: 2.2 (Список функций) и 2.3 (Параметры алгоритма и символы).
  6. Термины, функции и символы из спецификаций всесторонне включены в перечни в разделах 2.1–2.3.
  7. Описание соглашения об индексировании было удалено из раздела 3.1.
  8. Таблица 1 была пересмотрена, а текст прежнего раздела 3.2 о полиномиальной интерпретации байтов был пересмотрен и перенесён в раздел 4.
  9. В раздел 3.3 перед специализацией на примере блока было добавлено общее определение индексирования последовательностей байтов, а таблица 2 была пересмотрена.
  10. Заголовок раздела 3.5 был изменён, чтобы сосредоточиться на массивах слов, и в текст было включено их обозначение. Слова-столбцы состояния были представлены в вертикальном формате с улучшенным описанием индексов.
  11. Ссылка на дополнительную информацию о конечных полях [4] была включена в сноску в разделе 4, а заголовки разделов 4.1 и 4.2 были пересмотрены, чтобы явно упоминать GF(28).
  12. Раздел 4.2 был пересмотрен для предоставления явного общего описания умножения в конечном поле. Прежний раздел 4.2.1 был включён в пересмотренный раздел 4.2: исходный пример модульного приведения полинома был заменён иллюстрацией умножения в конечном поле с использованием xtime.
  13. Заголовок раздела 4.3 был пересмотрен, чтобы сосредоточиться на умножении на фиксированную матрицу, а текст раздела был упрощён путём удаления вторичной интерпретации как полиномиального приведения. Описания MIXCOLUMNS() и INVMIXCOLUMNS() в разделах 5.1.3 и 5.3.3 были соответственно пересмотрены, чтобы отсылать к этой конструкции.
  14. Текст о мультипликативных обратных элементах в GF(28) из прежнего раздела 4.2 был пересмотрен и перенесён в новый раздел 4.4.
  15. Обсуждение спецификаций алгоритма в разделе 5 было расширено для разъяснения взаимосвязей между его компонентами. Новое краткое объяснение Nb как параметра Rijndael позволило заменить Nb его постоянным значением 4 в остальной части Стандарта.
  16. Псевдокод шифра, процедуры развёртывания ключа и обратного шифра в разделах 5.1, 5.2 и 5.3 был переформатирован, а часть текста в этих разделах была пересмотрена для ясности.
  17. Описания SHIFTROWS() в разделе 5.1.2 и INVSHIFTROWS() в разделе 5.3.2 были улучшены, а ошибка в последнем была исправлена.
  18. Иллюстрации трёх экземпляров KEYEXPANSION() на новых рис. 6, 7 и 8 были добавлены в раздел 5.2. Текст раздела также был пересмотрен, включая явное отображение констант раунда на новом рис. 5.
  19. В раздел 5.3.5 был добавлен отдельный алгоритм для модифицированной процедуры развёртывания ключа для эквивалентного обратного шифра вместо одних лишь дополнительных строк. Описание эквивалентного обратного шифра было упрощено в пользу ссылки на обновлённый источник [3].
  20. Раздел 6.2 был пересмотрен, чтобы включить ссылку на NIST Special Publication 800-133, Rev. 2 [6].
  21. Раздел 6.4 был пересмотрен для расширения обсуждения атак на реализацию.
  22. Раздел «Ссылки» более не обозначается как приложение. Ссылки были обновлены для замены отозванных публикаций и исправления сведений о цитировании и URL-адресов.
  23. Примеры в приложении C были удалены в пользу ссылки на подробные примеры векторов, которые теперь поддерживаются в [8].
  24. Приложение D было создано для обобщения изменений в этом обновлении FIPS 197.