Subir un archivo
  1. base64hub
  2. Claves y hashes
  3. Descifrar AES

Descifrar AES desde Base64

Pega el Base64 cifrado e introduce la contraseña para leer el mensaje. AES-GCM comprueba la integridad mientras descifra, así que una contraseña incorrecta o un solo carácter cambiado producen un error claro.

Gratis sin registro, sin límites Local no se sube nada Detecta manipulaciones La etiqueta GCM se verifica en cada descifrado Actualizado 27 oct 2026
Formato – descífralo en cualquier parte

Salida = Base64( salt 16 bytes ‖ IV 12 bytes ‖ texto cifrado ‖ etiqueta GCM 16 bytes ). Clave = PBKDF2-HMAC-SHA256(contraseña como UTF-8, salt, 310.000 iteraciones, 32 bytes). Cifrado: AES-256-GCM, sin datos asociados. Código que lo descifra:

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

Se procesa en tu navegador. Esta página no puede enviar tus datos a ninguna parte – cómo lo sabemos

Cómo descifrar un texto AES

  1. Descifrar está seleccionado y ya hay un ejemplo cargado. Su contraseña es correct horse battery staple, así que puedes ver primero un descifrado correcto.
  2. Pega tu cadena en Base64 cifrado. Sirve Base64 estándar o URL-safe, con o sin =, y los saltos de línea se ignoran.
  3. Con el tipo de clave Contraseña, introduce la contraseña y, si el remitente las cambió, las mismas Iteraciones de PBKDF2 (por defecto, 310.000). Con Clave sin procesar, pega la clave de 16, 24 o 32 bytes en Base64 o hex.
  4. Pulsa Descifrar, o Enter en el campo de la contraseña. El mensaje aparece en Texto descifrado. Si el contenido no es texto UTF-8, se muestra como Base64 y Descargar guarda los bytes originales.

Un descifrado correcto muestra «Descifrado y autenticado»: la etiqueta GCM coincidió, así que el texto es exactamente el que cifró el remitente.

¿Descifrar Base64 o decodificar Base64?

Mucha gente busca «descifrar Base64» cuando tiene una cadena Base64 normal. Base64 es una codificación sin clave, así que esa cadena solo necesita decodificarse, y eso lo hace el decodificador Base64. Una prueba rápida: si al decodificar sale texto legible o un archivo reconocible, nunca estuvo cifrado. Si salen bytes que parecen aleatorios y alguien te dio una contraseña, tienes un texto cifrado, y esta es la página adecuada, siempre que se haya creado con el formato descrito más abajo. Base64 no es cifrado explica la diferencia.

Pruébalo con un valor conocido

Esta cadena se cifró fuera del navegador con la función encrypt() de Python de la documentación del formato, con la contraseña correct horse battery staple:

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

Se descifra como Meet me at the usual place at 10. Los 104 caracteres se decodifican en 77 bytes: 16 de salt, 12 de IV, 33 de texto cifrado y 16 de etiqueta. El desglose bajo el resultado muestra el mismo reparto para cualquier cadena que pegues.

Mensajes de error y qué significan

MensajeCausa habitual
Error al descifrar: contraseña o clave incorrecta, modo incorrecto o los datos se modificaronContraseña incorrecta, otro número de iteraciones, clave sin procesar usada con un bloque de contraseña o al revés, o un carácter perdido al copiar
Demasiado corto para ser un texto cifrado de esta herramientaLa cadena está cortada o directamente no viene de esta herramienta
Una clave AES debe tener 16, 24 o 32 bytesLa clave sin procesar tiene una longitud incorrecta; comprueba si está en Base64 o en hex
Este navegador no admite claves AES de 192 bitsChrome y Edge solo permiten claves de 128 y 256 bits; descifra con Python o Node.js
Las iteraciones deben estar entre 1.000 y 10.000.000El campo de iteraciones tiene un valor imposible

GCM no distingue una contraseña incorrecta de unos datos alterados: en ambos casos la etiqueta no coincide y no se muestra nada. Los modos sin autenticación, como CBC, pueden devolver basura en lugar de un error.

Cadenas que esta herramienta no puede abrir

El formato de esta herramienta es fijo: Base64( salt[16] ‖ iv[12] ‖ ciphertext ‖ tag[16] ) con contraseña, Base64( iv[12] ‖ ciphertext ‖ tag[16] ) con clave sin procesar, AES-GCM, PBKDF2-HMAC-SHA256 con 310.000 iteraciones. Otras herramientas usan otros formatos, y los primeros caracteres suelen delatarlos:

Empieza porLo generaSe descifra con
U2FsdGVkX1openssl enc o CryptoJS con frase de contraseña (cabecera Salted__)openssl enc -d -a con el cifrado y las opciones de KDF originales
gAAAAAun token Fernet (cryptography de Python)Fernet(key).decrypt(token)
-----BEGIN PGP MESSAGE-----OpenPGPgpg --decrypt
-----BEGIN AGE ENCRYPTED FILE-----ageage --decrypt

Encontrarás más comienzos reconocibles en Prefijos Base64 habituales.

Descifrar en Node.js y Python

El mismo formato funciona sin navegador. En 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 una cadena con clave sin procesar en Python, sáltate el salt y PBKDF2 y empieza el IV en el 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")

La versión con contraseña para Python está en la página Cifrar AES. Este tipo de cifrado sirve para pasar un secreto de una persona a otra; cuando ya ha llegado, guárdalo en un gestor de contraseñas o de secretos en lugar de conservar el texto cifrado.

Preguntas frecuentes

¿Se puede descifrar Base64 sin contraseña?

Si solo es Base64, sí, porque no hay nada que descifrar: pégalo en el decodificador Base64. Si es texto cifrado con AES en Base64, no. Sin la contraseña o la clave los bytes no se pueden recuperar, y ninguna herramienta puede adivinar una contraseña fuerte.

¿Por qué dice que la contraseña es incorrecta si es la correcta?

Revisa primero las iteraciones de PBKDF2: no se guardan en el texto cifrado, así que si el remitente las cambió, tiene que decirte el número. Comprueba también que copiaste la cadena entera y que de verdad sigue el formato de esta herramienta.

¿Esta herramienta puede descifrar texto de OpenSSL o CryptoJS?

No. Las cadenas que empiezan por U2FsdGVkX1 llevan la cabecera Salted__ de OpenSSL y usan otra derivación de clave y normalmente el modo CBC. Descífralas con openssl enc -d y las mismas opciones con las que se cifraron.

¿Qué pasa con el texto descifrado?

Se muestra en la página y en ningún otro sitio. El descifrado se hace en tu navegador con WebCrypto, y la Content Security Policy de la página bloquea todas las peticiones de red salvo las del contador de visitas de Cloudflare, así que no se envían ni la contraseña ni el mensaje.