Como descriptografar texto AES
- Descriptografar já vem selecionado, com um exemplo carregado. A senha dele é
correct horse battery staple, assim você vê primeiro uma execução bem-sucedida. - Cole sua string em Base64 criptografado. Base64 padrão ou URL-safe funcionam, com ou sem
=, e as quebras de linha são ignoradas. - 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.
- 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
| Mensagem | Causa habitual |
|---|---|
| Falha ao descriptografar: senha ou chave errada, modo errado ou os dados foram alterados | Senha 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 ferramenta | A string foi cortada, ou nem é desta ferramenta |
| Uma chave AES deve ter 16, 24 ou 32 bytes | A chave bruta tem o comprimento errado; confira se ela está em Base64 ou hex |
| Este navegador não suporta chaves AES de 192 bits | Chrome 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.000 | O 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 com | Gerado por | Descriptografe com |
|---|---|---|
U2FsdGVkX1 | openssl enc ou CryptoJS com frase-senha (cabeçalho Salted__) | openssl enc -d -a com as opções originais de cifra e KDF |
gAAAAA | um token Fernet (pacote Python cryptography) | Fernet(key).decrypt(token) |
-----BEGIN PGP MESSAGE----- | OpenPGP | gpg --decrypt |
-----BEGIN AGE ENCRYPTED FILE----- | age | age --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.