Загрузить файл
  1. base64hub
  2. Ключи и хеши
  3. AES-расшифровка

AES-расшифровка из Base64

Вставьте зашифрованный Base64 и введите пароль, чтобы прочитать сообщение. AES-GCM проверяет целостность прямо при расшифровке, поэтому неверный пароль или один изменённый символ дают понятную ошибку.

Бесплатно без регистрации и ограничений Локально ничего не загружается Проверка подмены тег GCM сверяется при каждой расшифровке Обновлено 27 окт. 2026 г.
Формат – расшифровка где угодно

Вывод = Base64( соль 16 байт ‖ IV 12 байт ‖ шифртекст ‖ тег GCM 16 байт ). Ключ = PBKDF2-HMAC-SHA256(пароль в UTF-8, соль, 310 000 итераций, 32 байта). Шифр: AES-256-GCM, без дополнительных данных. Код для расшифровки:

Python (pip install cryptography)

import base64
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes

def decrypt(b64, password):
    data = base64.b64decode(b64)
    salt, iv, ct = data[:16], data[16:28], data[28:]
    key = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt,
                     iterations=310000).derive(password.encode("utf-8"))
    return AESGCM(key).decrypt(iv, ct, None).decode("utf-8")
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");
}

Обработка идёт в браузере. Эта страница не может никуда отправить ваши данные – откуда мы это знаем

Как расшифровать текст AES

  1. Режим Расшифровать уже выбран, и загружен пример. Пароль к нему: correct horse battery staple, так что сначала можно посмотреть на успешную расшифровку.
  2. Вставьте свою строку в поле Зашифрованный Base64. Подойдёт и стандартный, и URL-safe Base64, с = или без, переносы строк игнорируются.
  3. С типом ключа Пароль введите пароль и, если отправитель его менял, то же значение Итерации PBKDF2 (по умолчанию 310 000). Для «Сырой» ключ вставьте ключ длиной 16, 24 или 32 байта в Base64 или hex.
  4. Нажмите Расшифровать или 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-битные ключи AESChrome и 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 итераций. Другие инструменты пишут другие форматы, и их часто выдают первые символы:

Начинается сЧем созданоЧем расшифровать
U2FsdGVkX1openssl enc или CryptoJS с парольной фразой (заголовок Salted__)openssl enc -d -a с исходными опциями шифра и KDF
gAAAAAтокен Fernet (cryptography для Python)Fernet(key).decrypt(token)
-----BEGIN PGP MESSAGE-----OpenPGPgpg --decrypt
-----BEGIN AGE ENCRYPTED FILE-----ageage --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, так что ни пароль, ни сообщение никуда не отправляются.