AES: шифрование и расшифровка

Шифруйте и расшифровывайте с помощью AES-128, AES-192 или AES-256 (FIPS 197) в режимах GCM (шифрование с аутентификацией), CBC, CTR или ECB. Ключи задаются в виде сырых байтов в шестнадцатеричном виде или Base64 либо выводятся из пароля с помощью PBKDF2-HMAC-SHA256. GCM поддерживает AAD и показывает метку аутентификации отдельно; результаты CBC/CTR/ECB совместимы с enc из OpenSSL. Хеши смотрите в генераторе хешей, ключевые коды аутентификации — в генераторе HMAC, устаревшие шифры — на странице «Устаревшие шифры» в этом разделе.
Работает полностью локально — ключи и открытый текст не покидают вкладку. Файлы до 200 МБ.
Всё, что вы вводите здесь, остаётся в этой вкладке — но это не то же самое, что «безопасно для секретов промышленной эксплуатации». Память браузера, расширения и посторонние видят то, что вы вставляете. Используйте эту страницу для обучения, проверки и взаимодействия, а не для работы с реальными данными клиентов.
Направление: Режим: Результат:
GCM = AES-GCM с nonce длиной 12 байт и меткой аутентификации 128 бит (AEAD: конфиденциальность и целостность). Режим по умолчанию, когда важна безопасность.
В hex допускаются пробелы, двоеточия и префиксы 0x.
В GCM и CTR никогда не используйте один и тот же nonce с одним ключом.
Длина метки:
Строки параметров фиксируют точный способ чтения ключа, IV, размер AAD и метку, поэтому скопированный результат можно воспроизвести на другой машине.
Какой режим выбрать?
GCM — ответ по умолчанию: он шифрует и аутентифицирует — строка метки делает подмену заметной (попробуйте расшифровать, изменив один байт метки, и страница откажется). CBC скрывает повторы блоков, но не обеспечивает целостности; если без него не обойтись, добавьте HMAC (см. генератор HMAC). CTR превращает AES в потоковый шифр — без дополнения, но повторное использование nonce с тем же ключом катастрофично и в CTR, и в GCM. ECB здесь только для совместимости и обучения: одинаковые блоки открытого текста дают одинаковые блоки шифртекста (знаменитый «пингвин ECB»).
Совместимость с OpenSSL — результаты CBC и CTR с этой страницы (дополнение PKCS#7, сырой ключ) проходят туда и обратно через командную строку openssl enc:
openssl enc -aes-256-cbc -K <64-hex-key> -iv <32-hex-iv> -in msg.txt -out msg.enc
openssl enc -d -aes-256-cbc -K <key> -iv <iv> -in msg.enc -out msg.txt
То же работает с -aes-128-cbc, -aes-192-cbc, -aes-256-ctr (IV длиной 16 байт = начальный блок счётчика). Учтите: openssl enc не поддерживает GCM — для шифрования с аутентификацией используйте эту страницу или openssl aesgcm из OpenSSL 3.3+.
Нужен китайский национальный шифр?
SM4 (GB/T 32907-2016) — блочный шифр, предписанный в китайской коммерческой криптографии, с тем же блоком 128 бит и размером ключа, что и у AES, но с собственным расписанием ключей и S-блоком — работает на отдельной странице в режимах ECB и CBC: шифрование и расшифровка SM4. Остальные инструменты семейства SM — там же: SM3 (хеш), SM2 (открытый ключ) и SM9 (криптография на основе идентификаторов).
Самопроверка
Запускает движки страницы на независимых эталонах: векторы с известным ответом для всех четырёх режимов (сгенерированы независимой нативной реализацией), векторы меток GCM с AAD и без него, перекрёстная проверка движка WebCrypto с чисто JS-движком AES, цикл GCM «шифрование–расшифровка» и отрицательные тесты (изменённая метка и неверный ключ должны приводить к ошибке). Никуда ничего не отправляется.
Шифрование AES с нуля
Вкратце: AES — мировой стандартный блочный шифр — он перемешивает блоки по 16 байт при ключе 128, 192 или 256 бит; а режим, в котором вы его используете (GCM, CBC, CTR, ECB), определяет, как связаны блоки, зачем нужен IV и можно ли обнаружить подмену; выбирайте GCM, если нет причин поступить иначе.
Что собой представляет сам AES (FIPS 197)

Блочный шифр. AES (схема Rijndael, стандартизированная NIST в 2001 году как FIPS 197) шифрует ровно по 16 байт за раз. Длина ключа — 16, 24 или 32 байта — выбирает AES-128, -192 или -256 и число внутренних раундов (10, 12, 14). Каждый раунд перемешивает блок с раундовыми ключами, выведенными из вашего ключа, через таблицы замен, сдвиги строк и перемешивание столбцов. Ни одна практическая атака не ломает сам шифр: реальные сбои почти всегда связаны с ошибками в режиме, IV или управлении ключами, и именно об этом остальная часть страницы.

Зачем вообще режим? Потому что сообщения редко бывают по 16 байт. Режим связывает шифрование блоков: ECB шифрует блоки независимо; CBC складывает по XOR каждый блок с предыдущим шифртекстом; CTR шифрует счётчик и складывает его по XOR с данными, как потоковый шифр; GCM строится на CTR и добавляет метку аутентификации. AES остаётся тем же — режим меняет всё, что касается гарантий.

Ключи и пароли. Ключ AES — это 16, 24 или 32 случайных байта. Человеческий пароль таковым не является: опция «Пароль» на этой странице выводит полноценный ключ с помощью PBKDF2-HMAC-SHA256 (по умолчанию 600 000 итераций, базовый уровень OWASP 2023 — подробности о KDF см. в генераторе HMAC). Никогда не используйте строку пароля напрямую как ключ AES: её энтропия составляет малую долю длины.

Сравнение четырёх режимов
РежимIV / nonceЦелостностьПримечания
GCM12 байт, уникален для каждого сообщенияДа — метка 96..128 битAEAD: рекомендуемый повсеместно режим по умолчанию (TLS 1.3, SSH, форматы файлов). Также принимает AAD.
CBC16 байт, непредсказуемыйНетДополнение PKCS#7; классический режим, но нуждается в MAC рядом. Ошибки оракула дополнения — классическая ловушка CBC.
CTR16-байтный начальный счётчикНетБез дополнения, потоковый, произвольный доступ; повторный nonce под одним ключом раскрывает XOR открытых текстов.
ECBнетНетОдинаковые блоки → одинаковый шифртекст. Демонстрация «пингвина ECB». Только для совместимости.

Правила для IV в одном абзаце. IV не является секретом — передавайте его рядом с шифртекстом, — но требования к его уникальности различаются: CBC требует непредсказуемый IV; GCM и CTR требуют лишь никогда не повторять один и тот же nonce с тем же ключом (повтор nonce в GCM ещё опаснее: он раскрывает ключ аутентификации). Кнопка «Случайный IV» использует безопасный генератор случайных чисел браузера; кнопка «Все нули» нужна для воспроизведения тестовых векторов, а не для реальных сообщений.

Дополнение. CBC и ECB работают только с целыми блоками, поэтому дополнение PKCS#7 добавляет от 1 до 16 байт, каждый из которых равен длине дополнения. Поэтому шифртекст CBC может вырасти до 16 байт, а расшифровка неверным ключом обычно завершается ошибкой дополнения. CTR и GCM работают как потоковые и не требуют дополнения — длина шифртекста точно равна длине открытого текста (попробуйте пример в режиме CTR: 43 байта на входе, 43 байта на выходе).

CFB и OFB (два оставшихся классических режима) на этой странице не реализованы: они работают как потоковые, как CTR, но без преимуществ перед ним, и в основном встречаются в старых протоколах.

Что добавляет GCM (AEAD, метки, AAD)

Шифрование с аутентификацией. GCM = шифрование CTR + аутентификатор GHASH по шифртексту, IV и AAD. Выходная метка — это отпечаток всего: если изменить хотя бы один бит шифртекста, IV или AAD, метка перестанет совпадать, и получатель может убедиться, что сообщение не изменено и отправлено владельцем ключа. CBC+HMAC даёт то же только при правильной композиции (шифрование, затем MAC) — GCM делает это правильно по своей конструкции.

AAD. Дополнительные аутентифицируемые данные передаются открыто, но покрываются меткой: заголовки протокола, имена файлов, идентификаторы алгоритмов. Получатель должен передать точно такие же байты AAD, иначе проверка метки не пройдёт — в этом и смысл.

Длина метки. Рекомендуется метка по умолчанию 128 бит; более короткие метки (96..120 бит) уменьшают размер, но снижают стойкость к подделке. Ниже 96 бит гарантии безопасности GCM быстро ухудшаются, поэтому эта страница на этом останавливается.

Катастрофа nonce. Повторное использование 12-байтного nonce GCM под одним ключом раскрывает XOR открытых текстов двух сообщений и подключ аутентификации — после этого возможны подделки всех будущих сообщений под этим ключом. Системы, которые не могут гарантировать уникальность, используют варианты, устойчивые к ошибкам с nonce (AES-GCM-SIV, RFC 8452).

Контрольные значения — воспроизведите их на этой странице

Первая строка — знаменитый пример FIPS 197 для одного блока; остальные сгенерированы независимой нативной реализацией (OpenSSL через Node.js) и повторно проверены на движках этой страницы. Вставьте в страницу ключ, IV и входные данные, чтобы воспроизвести каждую строку.

СлучайВходные данныеОжидаемый результат
AES-128, один блок (в стиле FIPS 197)key 000102..0f, plaintext 00112233..ff69c4e0d86a7b0430d8cdb78070b4c55a
AES-128-GCMkey 000102..0f, IV 606162..6b, plaintext 0011..ef ×2ct 275f095bedfda377063fee326128892188377b410698ed03a022b9971bb4bdbe, tag 87ea7770714048977de2fd8dac645ecf
AES-256-GCM, то же, но с AAD deadbeefkey 000102..1fct eacab966ff15e518f48f5390be502fbc2756ccee0dcfff36a282c50bf5593ae7, tag aead900e895c88252d0388d7aefce5c8
AES-256-CBCkey 000102..1f, IV 101112..1f, plaintext 0011..ef ×20e2392dd6f690b44a5a1b4fdff3b7f83cb9ab59d9900119cc5f83e062d95fb643b1a94b514ea2f3b95f84c900b5c98a8
AES-256-CTR (тот же вход, что и для CBC выше)43-byte plaintext → 43-byte ciphertexte9d2cdb9f661359178ed366dfa3a4671f8e20efd723f090eb7d1d524d480fd3c
Типичные ошибки
  • Использование ECB, потому что он не требует IV. Удобство здесь — ловушка: повторы блоков проступают прямо в шифртексте (зашифруйте растровое изображение, и картинка всё равно будет видна). ECB допустим только для отдельных блоков или для случайных ключей ровно по 16 байт — на практике его не выбирают осознанно никогда.
  • Повторное использование nonce/IV. Для GCM или CTR под одним ключом это та единственная ошибка, которая ломает всё сразу. Системы на основе счётчика (кнопка «Случайный IV» на этой странице) существуют, чтобы сделать её невозможной.
  • Считать IV секретом. Это не так. Храните его или передавайте рядом с шифртекстом. Скрывать его бессмысленно и это провоцирует повторное использование.
  • Использование пароля как ключа. "hunter2hunter2hunter2hunter2" занимает 32 байта, но это не 256 бит энтропии — это словарное слово с дополнением. Выведите ключ через PBKDF2 (встроено в эту страницу) или сгенерируйте случайный ключ.
  • Предположение, что CBC обнаруживает подмену. Измените бит в шифртексте CBC, и расшифровка «пройдёт» с незаметно испорченным открытым текстом. Видимой подмену делает только метка GCM (или явный HMAC).
  • Сравнение шифртекстов GCM на равенство. При случайных nonce одно и то же сообщение шифруется каждый раз по-разному — это свойство, а не ошибка. Детерминированное шифрование — другой, специализированный инструмент.
Часто задаваемые вопросы

AES-128 всё ещё надёжен или нужен 256? Оба варианта стойки против реалистичных противников; лучшие известные атаки отнимают лишь долю запаса. AES-256 важен главным образом для долгосрочных секретов и защиты от квантовых угроз (алгоритм Гровера вдвое снижает стойкость ключа, оставляя AES-256 на уровне около 128 бит).

Почему openssl enc не умеет GCM? Команда enc появилась до AEAD и не может переносить метку; в OpenSSL 3.3 добавлена отдельная команда aesgcm. Результат GCM на этой странице хранит метку в отдельной строке, чтобы вы могли явно переносить оба значения.

Что такое обёртывание ключей (AES-KW)? Это специализированный режим для шифрования других ключей фиксированными 64-битными блоками со своей проверкой целостности. Здесь он не предлагается, потому что его входы и выходы имеют форму ключей, а не сообщений — неправильное использование здесь обычное дело.

Почему шифртекст CTR совпадает по длине с открытым текстом, а CBC длиннее? CTR и GCM работают как потоковые (без дополнения); CBC/ECB дополняют до целого блока из 16 байт по PKCS#7. Разница в длине заложена в конструкции, а не является ошибкой.

Можно ли расшифровать то, что зашифровано в другом месте? Да, если известны точный режим, ключ, IV (а для GCM — метка). Строки результата на этой странице фиксируют всё это, чтобы вы могли переносить параметры между инструментами; блок OpenSSL выше показывает соответствующие командные строки.