AES: шифрування та розшифрування — GCM, CBC, CTR і ECB у вашому браузері
Шифрування / розшифрування AES
Шифруйте або розшифровуйте за допомогою AES-128, AES-192 або AES-256 (FIPS 197) у режимах GCM (автентифіковане шифрування), CBC, CTR або ECB. Ключі — це сирі байти у hex або Base64 чи виведені з пароля через PBKDF2-HMAC-SHA256. GCM підтримує AAD і показує тег автентифікації окремо; виводи CBC/CTR/ECB сумісні з enc OpenSSL. Для гешів див. генератор гешів, для MAC з ключем — генератор HMAC, для застарілих шифрів — сторінку застарілих шифрів у цій родині. Працює повністю локально — ключі й відкритий текст не покидають вашу вкладку. Файли до 200 МБ.
Усе, що ви вводите тут, залишається у цій вкладці — але це не те саме, що «безпечно для промислових секретів». Пам'ять браузера, розширення та сторонні очі бачать те, що ви вставляєте. Використовуйте цю сторінку, щоб вивчати, перевіряти та налагоджувати сумісність, а не для роботи з реальними даними клієнтів.
Напрямок:Режим:Вихід:
GCM = AES-GCM з 12-байтовим nonce і 128-бітним тегом автентифікації (AEAD: конфіденційність + цілісність). За замовчуванням, коли важлива безпека.
Ключ(сирі байти: 16, 24 або 32 байти = AES-128/192/256; довжина вставленого визначає розмір)
Hex допускає пробіли, двокрапки та префікси 0x.
Сіль (hex, 8–16 байтів):
Ітерації:Розмір ключа:
Сіль передається разом із шифротекстом — хто розшифровує, потребує той самий пароль, сіль, кількість ітерацій і розмір ключа. OWASP рекомендує щонайменше 600 000 ітерацій PBKDF2-HMAC-SHA256.
IV / nonce(GCM: 12 байтів; CBC/CTR: 16 байтів — hex)
Ніколи не повторюйте nonce з тим самим ключем у GCM або CTR.
AAD(додаткові автентифіковані дані — автентифіковані, але не зашифровані; необов'язково)
Довжина тега:
Тег автентифікації(hex, як друкує ця сторінка під час шифрування — потрібно для розшифрування)
Plaintext text (the data to encrypt, UTF-8 encoded)
Виберіть файл або перетягніть його сюди Файл читається локально блоками по 8 МБ; нічого не завантажується. До 200 МБ.
Ciphertext (один рядок: режим, розмір ключа, значення; параметри — у рядках нижче)
Рядки параметрів фіксують точне прочитання ключа, 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-ключ> -iv <32-hex-iv> -in msg.txt -out msg.enc openssl enc -d -aes-256-cbc -K <ключ> -iv <iv> -in msg.enc -out msg.txt Те саме працює з -aes-128-cbc, -aes-192-cbc, -aes-256-ctr (16-байтовий IV = початковий блок лічильника). Зверніть увагу: openssl encне підтримує GCM — для автентифікованого шифрування використовуйте цю сторінку або openssl aesgcm з OpenSSL 3.3+.
Потрібен натомість китайський національний шифр? SM4 (GB/T 32907-2016) — блоковий шифр, передбачений у китайській комерційній криптографії, з тим самим 128-бітним блоком і розміром ключа, що й AES, але з власним розкладом ключів і S-box — працює на окремій сторінці в режимах 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 шифрує лічильник і складає його з даними, як потоковий шифр; GCM побудовано на CTR і додає тег автентифікації. AES залишається тим самим — режим змінює все, що стосується гарантій.
Ключі та паролі. Ключ AES — це 16, 24 або 32 випадкові байти. Людський пароль таким не є: опція «Пароль» на цій сторінці виводить належний ключ за допомогою PBKDF2-HMAC-SHA256 (за замовчуванням 600 000 ітерацій, базовий рівень OWASP 2023 — деталі KDF див. у генераторі HMAC). Ніколи не використовуйте рядок пароля безпосередньо як ключ AES: його ентропія становить невелику частку довжини.
Порівняння чотирьох режимів
Режим
IV / nonce
Цілісність
Примітки
GCM
12 байтів, унікальний для кожного повідомлення
Так — тег 96..128 біт
AEAD: рекомендований вибір усюди (TLS 1.3, SSH, формати файлів). Також приймає AAD.
CBC
16 байтів, непередбачуваний
Ні
Доповнення PKCS#7; класичний, але потребує MAC поруч. Помилки оракула доповнення — класична пастка CBC.
CTR
16-байтовий початковий лічильник
Ні
Без доповнення, потоковий, довільний доступ; повторне використання 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 досягає того самого, лише якщо його правильно скласти (encrypt-then-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..ff
69c4e0d86a7b0430d8cdb78070b4c55a
AES-128-GCM
key 000102..0f, IV 606162..6b, plaintext 0011..ef ×2
ct 275f095bedfda377063fee326128892188377b410698ed03a022b9971bb4bdbe, tag 87ea7770714048977de2fd8dac645ecf
AES-256-GCM, те саме, але з AAD deadbeef
key 000102..1f
ct eacab966ff15e518f48f5390be502fbc2756ccee0dcfff36a282c50bf5593ae7, tag aead900e895c88252d0388d7aefce5c8
AES-256-CBC
key 000102..1f, IV 101112..1f, plaintext 0011..ef ×2
Використання ECB через те, що не потрібен IV. Зручність — пастка: шаблони блоків просочуються прямо в шифротекст (зашифруйте растрове зображення, і картинку все ще видно). ECB прийнятний лише для окремих блоків або випадкових ключів рівно по 16 байтів — на практиці його не обирають свідомо.
Повторне використання nonce/IV. За GCM або CTR під одним ключем це єдина помилка, яка ламає все одразу. Системи з лічильником (кнопка «Випадковий IV» на цій сторінці) існують, щоб зробити її неможливою.
Вважати IV секретом. Це не так. Зберігайте або передавайте його разом із шифротекстом. Приховування нічого не дає і спокушає до повторного використання.
Використання пароля як ключа."hunter2hunter2hunter2hunter2" має 32 байти, але не 256 біт ентропії — це слово зі словника з доповненням. Виведіть ключ через PBKDF2 (вбудовано на цій сторінці) або згенеруйте випадковий ключ.
Припущення, що CBC виявляє підміну. Переверніть один біт у шифротексті CBC, і розшифрування «пройде» з тихо пошкодженим відкритим текстом. Лише тег GCM (або явний HMAC) робить підміну видимою.
Порівняння шифротекстів GCM на рівність. З випадковими nonce той самий відкритий текст щоразу шифрується по-різному — це особливість. Детерміноване шифрування — інший, спеціалізований інструмент.
Часті запитання (FAQ)
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 показує відповідні рядки команд.