Enviar um arquivo
  1. base64hub
  2. Chaves e hashes
  3. Descriptografar AES

Descriptografar AES a partir de Base64

Cole o Base64 criptografado e digite a senha para ler a mensagem. O AES-GCM verifica a integridade enquanto descriptografa, então uma senha errada ou um único caractere alterado gera um erro claro.

Grátis sem cadastro, sem limites Local nada é enviado Contra adulteração tag GCM verificada a cada descriptografia Atualizado 27 de out. de 2026
Formato – descriptografe em qualquer lugar

Saída = Base64( salt 16 bytes ‖ IV 12 bytes ‖ texto cifrado ‖ tag GCM 16 bytes ). Chave = PBKDF2-HMAC-SHA256(senha em UTF-8, salt, 310.000 iterações, 32 bytes). Cifra: AES-256-GCM, sem dados associados. Código que descriptografa:

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");
}

Processado no seu navegador. Esta página não consegue enviar seus dados para lugar nenhum – como sabemos

Como descriptografar texto AES

  1. Descriptografar já vem selecionado, com um exemplo carregado. A senha dele é correct horse battery staple, assim você vê primeiro uma execução bem-sucedida.
  2. Cole sua string em Base64 criptografado. Base64 padrão ou URL-safe funcionam, com ou sem =, e as quebras de linha são ignoradas.
  3. Com o tipo de chave Senha, digite a senha e, se o remetente a alterou, o mesmo valor em Iterações do PBKDF2 (padrão 310.000). Em Chave bruta, cole a chave de 16, 24 ou 32 bytes em Base64 ou hex.
  4. Clique em Descriptografar, ou aperte Enter no campo da senha. A mensagem aparece em Texto descriptografado. Se o conteúdo não for texto UTF-8, ele é mostrado como Base64, e Baixar salva os bytes originais.

Uma execução bem-sucedida informa “Descriptografado e autenticado”: a tag GCM conferiu, então o texto é exatamente o que o remetente criptografou.

Descriptografar Base64 ou decodificar Base64?

Muita gente pesquisa “descriptografar Base64” quando tem uma string Base64 comum. O Base64 é uma codificação sem chave, então essa string só precisa ser decodificada, e o decodificador Base64 faz isso. Um teste rápido: se a decodificação dá texto legível ou um arquivo reconhecível, ela nunca foi criptografada. Se dá bytes de aparência aleatória e alguém lhe passou uma senha, você tem texto cifrado, e esta é a página certa, desde que ele tenha sido gerado no formato abaixo. Base64 não é criptografia explica a diferença.

Teste com um valor conhecido

Esta string foi criptografada fora do navegador com a função Python encrypt() da documentação do formato, usando a senha correct horse battery staple:

SD8wB+5V2GRfupy/yEY1xTUE8d5z9fwbzQ0gxeRzbtym1I4O7A9Q2NYnbYxEPYgvwJ4Q7DU5q/sugOx+B1Ro3ujkDXvnl/y2XYuji9A=

Ela descriptografa para Meet me at the usual place at 10. Os 104 caracteres decodificam para 77 bytes: 16 de salt, 12 de IV, 33 de texto cifrado e 16 de tag. O detalhamento abaixo do resultado mostra a mesma divisão para qualquer string que você colar.

Mensagens de erro e o que significam

MensagemCausa habitual
Falha ao descriptografar: senha ou chave errada, modo errado ou os dados foram alteradosSenha errada, outro número de iterações, chave bruta usada num blob de senha ou o contrário, ou um caractere perdido ao copiar
Curto demais para ser um texto cifrado desta ferramentaA string foi cortada, ou nem é desta ferramenta
Uma chave AES deve ter 16, 24 ou 32 bytesA chave bruta tem o comprimento errado; confira se ela está em Base64 ou hex
Este navegador não suporta chaves AES de 192 bitsChrome e Edge só permitem chaves de 128 e 256 bits; descriptografe com Python ou Node.js
As iterações devem estar entre 1.000 e 10.000.000O campo de iterações tem um valor impossível

O GCM não distingue uma senha errada de dados adulterados: nos dois casos a tag não confere e nada é exibido. Modos sem autenticação, como o CBC, podem devolver lixo em vez de um erro.

Strings que esta ferramenta não abre

O formato aqui é fixo: Base64( salt[16] ‖ iv[12] ‖ ciphertext ‖ tag[16] ) para senhas, Base64( iv[12] ‖ ciphertext ‖ tag[16] ) para chaves brutas, AES-GCM, PBKDF2-HMAC-SHA256 com 310.000 iterações. Outras ferramentas gravam outros formatos, e os primeiros caracteres muitas vezes os denunciam:

Começa comGerado porDescriptografe com
U2FsdGVkX1openssl enc ou CryptoJS com frase-senha (cabeçalho Salted__)openssl enc -d -a com as opções originais de cifra e KDF
gAAAAAum token Fernet (pacote Python cryptography)Fernet(key).decrypt(token)
-----BEGIN PGP MESSAGE-----OpenPGPgpg --decrypt
-----BEGIN AGE ENCRYPTED FILE-----ageage --decrypt

Mais inícios reconhecíveis estão reunidos em Prefixos comuns de Base64.

Descriptografando em Node.js e Python

O mesmo formato funciona sem navegador. Em 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");
}

Para uma string de chave bruta em Python, pule o salt e o PBKDF2 e comece o IV no byte 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")

A versão com senha para Python está na página criptografar AES. Esse tipo de criptografia serve para passar um segredo de uma pessoa para outra; quando ele chegar, mova-o para um gerenciador de senhas ou de segredos em vez de guardar o texto cifrado.

Perguntas frequentes

Dá para descriptografar Base64 sem senha?

Se for só Base64, sim, porque não há nada para descriptografar: cole no decodificador Base64. Se for texto cifrado AES em Base64, não. Sem a senha ou a chave, os bytes não podem ser recuperados, e nenhuma ferramenta consegue adivinhar uma senha forte.

Por que aparece senha errada se a senha está certa?

Confira primeiro as iterações do PBKDF2; elas não ficam guardadas no texto cifrado, então quem as mudou precisa informar o número. Confira também se a string foi copiada inteira e se ela realmente vem do formato desta ferramenta.

Esta ferramenta descriptografa texto do OpenSSL ou do CryptoJS?

Não. Strings que começam com U2FsdGVkX1 trazem o cabeçalho Salted__ do OpenSSL e usam outra derivação de chave e, geralmente, o modo CBC. Descriptografe-as com openssl enc -d e as mesmas opções usadas para criptografar.

O que acontece com o texto descriptografado?

Ele aparece na página e em nenhum outro lugar. A descriptografia roda no seu navegador com WebCrypto, e o Content Security Policy da página bloqueia todas as requisições de rede, exceto as do contador de visitas da Cloudflare, então nem a senha nem a mensagem são enviadas.