Как расшифровать текст AES
- Режим Расшифровать уже выбран, и загружен пример. Пароль к нему:
correct horse battery staple, так что сначала можно посмотреть на успешную расшифровку. - Вставьте свою строку в поле Зашифрованный Base64. Подойдёт и стандартный, и URL-safe Base64, с
=или без, переносы строк игнорируются. - С типом ключа Пароль введите пароль и, если отправитель его менял, то же значение Итерации PBKDF2 (по умолчанию 310 000). Для «Сырой» ключ вставьте ключ длиной 16, 24 или 32 байта в Base64 или hex.
- Нажмите Расшифровать или Enter в поле пароля. Сообщение появится в поле Расшифрованный текст. Если внутри не текст UTF-8, результат показывается в Base64, а кнопка Скачать сохраняет исходные байты.
При успехе инструмент пишет «Расшифровано, подлинность подтверждена»: тег GCM совпал, значит, текст ровно тот, который зашифровал отправитель.
Расшифровать Base64 или декодировать?
Многие ищут «расшифровать base64», когда у них на руках обычная строка Base64. Base64 кодирует без ключа: такую строку достаточно декодировать, и с этим справится декодер Base64. Быстрая проверка: если после декодирования получается читаемый текст или узнаваемый файл, ничего не шифровалось. Если получаются случайные на вид байты, а вам дали пароль, у вас шифртекст, и эта страница подойдёт при условии, что он сделан в формате, описанном ниже. Разница подробно объяснена в статье Base64 – это не шифрование.
Проверка на известном значении
Эта строка зашифрована вне браузера функцией encrypt() на Python из описания формата, с паролем correct horse battery staple:
SD8wB+5V2GRfupy/yEY1xTUE8d5z9fwbzQ0gxeRzbtym1I4O7A9Q2NYnbYxEPYgvwJ4Q7DU5q/sugOx+B1Ro3ujkDXvnl/y2XYuji9A=
Она расшифровывается в Meet me at the usual place at 10. 104 символа декодируются в 77 байт: 16 байт соли, 12 байт IV, 33 байта шифртекста и 16 байт тега. Разбивка под результатом показывает такое же деление для любой вставленной строки.
Сообщения об ошибках и что они значат
| Сообщение | Обычная причина |
|---|---|
| Не удалось расшифровать: неверный пароль или ключ, не тот режим, или данные изменены | Неверный пароль, другое число итераций, «сырой» ключ для строки, зашифрованной паролем, или наоборот, либо символ, потерянный при копировании |
| Слишком коротко для шифртекста этого инструмента | Строка обрезана или вообще сделана не этим инструментом |
| Ключ AES должен быть длиной 16, 24 или 32 байта | У «сырого» ключа неверная длина; проверьте, Base64 это или hex |
| Этот браузер не поддерживает 192-битные ключи AES | Chrome и Edge допускают только 128- и 256-битные ключи; расшифруйте в Python или Node.js |
| Число итераций должно быть от 1000 до 10 000 000 | В поле итераций невозможное значение |
GCM не отличает неверный пароль от подделанных данных: в обоих случаях тег не совпадает и ничего не выводится. Режимы без аутентификации, например CBC, вместо ошибки могут вернуть мусор.
Строки, которые этот инструмент не откроет
Формат здесь фиксированный: Base64( salt[16] ‖ iv[12] ‖ ciphertext ‖ tag[16] ) для паролей, Base64( iv[12] ‖ ciphertext ‖ tag[16] ) для «сырых» ключей, AES-GCM, PBKDF2-HMAC-SHA256 с 310 000 итераций. Другие инструменты пишут другие форматы, и их часто выдают первые символы:
| Начинается с | Чем создано | Чем расшифровать |
|---|---|---|
U2FsdGVkX1 | openssl enc или CryptoJS с парольной фразой (заголовок Salted__) | openssl enc -d -a с исходными опциями шифра и KDF |
gAAAAA | токен Fernet (cryptography для Python) | Fernet(key).decrypt(token) |
-----BEGIN PGP MESSAGE----- | OpenPGP | gpg --decrypt |
-----BEGIN AGE ENCRYPTED FILE----- | age | age --decrypt |
Больше узнаваемых начал собрано в статье Типичные префиксы Base64.
Расшифровка в Node.js и Python
Тот же формат работает и без браузера. В Node.js:
const crypto = require("crypto");
function decrypt(b64, password) {
const data = Buffer.from(b64, "base64");
const salt = data.subarray(0, 16), iv = data.subarray(16, 28);
const tag = data.subarray(data.length - 16), ct = data.subarray(28, data.length - 16);
const key = crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256");
const d = crypto.createDecipheriv("aes-256-gcm", key, iv);
d.setAuthTag(tag);
return Buffer.concat([d.update(ct), d.final()]).toString("utf8");
}
function encrypt(text, password) {
const salt = crypto.randomBytes(16), iv = crypto.randomBytes(12);
const key = crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256");
const c = crypto.createCipheriv("aes-256-gcm", key, iv);
const ct = Buffer.concat([c.update(text, "utf8"), c.final()]);
return Buffer.concat([salt, iv, ct, c.getAuthTag()]).toString("base64");
}
Для строки с «сырым» ключом в Python пропустите соль и PBKDF2 и читайте IV с байта 0:
import base64
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def decrypt_raw(b64, key_b64):
data = base64.b64decode(b64)
iv, ct = data[:12], data[12:]
return AESGCM(base64.b64decode(key_b64)).decrypt(iv, ct, None).decode("utf-8")
Версия с паролем для Python есть на странице AES-шифрование. Такое шифрование нужно, чтобы передать секрет от одного человека другому; когда он дошёл, перенесите его в менеджер паролей или менеджер секретов и не храните шифртекст.
Вопросы и ответы
Можно ли расшифровать Base64 без пароля?
Если это просто Base64, то да, потому что расшифровывать нечего: вставьте строку в декодер Base64. Если это шифртекст AES в Base64, то нет. Без пароля или ключа байты не восстановить, и никакой инструмент не подберёт стойкий пароль.
Почему пишет «неверный пароль», хотя пароль правильный?
Сначала проверьте число итераций PBKDF2: оно не хранится в шифртексте, поэтому отправитель, который его менял, должен сообщить вам значение. Ещё убедитесь, что строка скопирована целиком и действительно сделана в формате этого инструмента.
Может ли инструмент расшифровать текст из OpenSSL или CryptoJS?
Нет. Строки, начинающиеся с U2FsdGVkX1, несут заголовок OpenSSL Salted__, используют другой вывод ключа и обычно режим CBC. Расшифруйте их через openssl enc -d с теми же опциями, которыми их шифровали.
Что происходит с расшифрованным текстом?
Он показывается на странице и больше нигде. Расшифровка идёт в вашем браузере через WebCrypto, а Content Security Policy страницы блокирует все сетевые запросы, кроме счётчика просмотров Cloudflare, так что ни пароль, ни сообщение никуда не отправляются.