Descifrado AES — Compatible con OpenSSL y CryptoJS
Descifra AES en línea — GCM/CBC/CTR, frase de contraseña o clave sin procesar, detecta automáticamente el formato "U2FsdGVkX1" de OpenSSL y CryptoJS. 100 % en el navegador, las claves nunca salen de la página.
Opciones avanzadas
Nunca reutilices un IV con la misma clave. Déjalo en blanco para generar un IV aleatorio seguro.
Cómo funciona el descifrado AES
El descifrado AES es el inverso exacto del cifrado: la misma clave simétrica que revolvió los datos ejecuta las rondas del cifrado en sentido inverso para recuperar los bytes originales. Como AES es simétrico, no existe una 'clave de descifrado' separada — debes proporcionar la misma clave o frase de contraseña, el mismo modo y el mismo IV que se usaron para cifrar. Si aciertas con los parámetros, el texto plano vuelve byte a byte; si te equivocas en uno, obtienes un error o datos ilegibles.
Para descifrar correctamente, cuatro cosas deben coincidir exactamente con el cifrado: la clave (o la frase de contraseña más sus ajustes de derivación de clave), el modo de operación (GCM, CBC o CTR), el IV o nonce y — para GCM — la etiqueta de autenticación. Si falla cualquiera de ellos, el resultado es un error contundente (un fallo de autenticación GCM, un fallo de relleno en CBC) o datos ilegibles en silencio (CTR, o CBC con el IV incorrecto). Esta herramienta lee la sal, el IV y la etiqueta del texto cifrado por ti cuando vienen empaquetados, y diagnostica el fallo cuando algo no cuadra.
El texto cifrado llega en varias formas distintas, y esta herramienta entiende tres. El formato 1 es nuestro diseño autocontenido con frase de contraseña: una sal de 16 bytes, luego el IV, luego el texto cifrado (con la etiqueta GCM añadida al final en modo GCM) — se descifra solo con la frase de contraseña. El formato 2 es el diseño con clave sin procesar: el IV antepuesto al texto cifrado, o texto cifrado 'puro' donde tú indicas el IV por separado. El formato 3 es el diseño de OpenSSL, producido por el comando openssl enc y por CryptoJS.
Vale la pena reconocer ese formato de OpenSSL a simple vista. Empieza con los 8 bytes ASCII Salted__, seguidos de una sal de 8 bytes y luego el texto cifrado, y cuando todo eso se codifica en Base64, esos primeros bytes siempre se representan como el prefijo U2FsdGVkX1. Así que si un texto cifrado que te entregaron empieza por U2FsdGVkX1, casi con toda seguridad lo produjo openssl enc o una llamada CryptoJS AES.encrypt(text, passphrase). CryptoJS deriva su clave con la función heredada EVP_BytesToKey usando una única pasada de MD5, mientras que el openssl moderno usa PBKDF2 — razón por la cual elegir la función de derivación de clave correcta es todo el juego al descifrar estos casos. Si tu entrada es Base64 y solo quieres ver los bytes en bruto, nuestro decodificador de Base64 te los mostrará. Para crear texto cifrado en estos formatos, usa la herramienta de cifrado AES.
// AES-256-GCM decrypt with a passphrase (PBKDF2-HMAC-SHA256, 600,000 iterations).
// Identical code runs in the browser and in Node.js 20+ via Web Crypto.
async function aesGcmDecrypt(base64, passphrase) {
const enc = new TextEncoder();
const packed = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
const salt = packed.slice(0, 16), iv = packed.slice(16, 28); // salt(16) | iv(12)
const ct = packed.slice(28); // ciphertext + tag
const baseKey = await crypto.subtle.importKey(
'raw', enc.encode(passphrase), 'PBKDF2', false, ['deriveKey']);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 600000, hash: 'SHA-256' },
baseKey, { name: 'AES-GCM', length: 256 }, false, ['decrypt']);
const plain = await crypto.subtle.decrypt(
{ name: 'AES-GCM', iv }, key, ct); // throws if the tag fails
return new TextDecoder().decode(plain); // recovered plaintext
} Características principales
Detecta automáticamente la salida de OpenSSL y CryptoJS
Pega texto cifrado que empiece por U2FsdGVkX1 y la herramienta reconoce el formato Salted__ y ofrece un cambio de un clic al flujo de descifrado correspondiente, para que nunca te enfrentes a un error sin salida.
Tres funciones de derivación de clave
Descifra en todas las generaciones del formato openssl enc: PBKDF2 con un recuento de iteraciones personalizado, EVP_BytesToKey con SHA-256, o la pasada única de MD5 heredada que usa CryptoJS.
Explica por qué falló el descifrado
En lugar de un error genérico obtienes un diagnóstico: clave incorrecta frente a IV incorrecto, un fallo de autenticación GCM, un error de relleno CBC, contaminación de base64, o 'esto parece un texto cifrado de la era MD5, prueba EVP-MD5'.
Comando openssl equivalente mostrado en vivo
Consulta el comando exacto openssl enc -d que reproduce el descifrado en la línea de comandos, incluido el recuento de iteraciones, para que puedas verificar el resultado fuera del navegador.
Frase de contraseña o clave sin procesar, GCM/CBC/CTR
Gestiona texto cifrado autocontenido con frase de contraseña, texto cifrado con clave sin procesar con un IV antepuesto o indicado por separado, y los tres modos de Web Crypto.
100 % en tu navegador
El texto cifrado y las claves se procesan localmente con la API Web Crypto y nunca se suben — puedes verificarlo con la pestaña Red o desconectándote.
Ejemplos de descifrado AES
Descifra un texto cifrado autocontenido con frase de contraseña (GCM)
sal(16) ‖ iv(12) ‖ texto cifrado ‖ etiqueta(16), Base64 — de la página de cifrado
El rápido zorro marrón salta sobre el perro perezoso.
Este es el inverso del ejemplo GCM de la página de cifrado. Toma la cadena Base64 autocontenida que produjo para la frase de contraseña hunter2, pégala aquí con Modo GCM, Tamaño de clave 256, Tipo de clave Frase de contraseña y la misma frase de contraseña hunter2, y la frase original vuelve a aparecer. No introduces la sal ni el IV por separado — la herramienta lee la sal de 16 bytes y el IV de 12 bytes del principio de la cadena, deriva la clave con PBKDF2-HMAC-SHA256 (600.000 iteraciones) y verifica la etiqueta GCM de 128 bits añadida al final antes de devolver cualquier texto. Haz clic en Cargar ejemplo en la página de cifrado para generar una cadena nueva y luego descífrala aquí.
Descifra una salida real de OpenSSL / PBKDF2
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=
Attack at dawn!
Esta es una salida genuina de openssl enc. Pégala, cambia al modo OpenSSL (Modo CBC, Tipo de clave Frase de contraseña), introduce la frase de contraseña correct-horse, elige la función de derivación de clave PBKDF2 y ajusta las iteraciones a 10.000 — el texto plano es Attack at dawn!. El prefijo U2FsdGVkX1 le indicó a la herramienta que este era el formato Salted__, y la sal de 8 bytes está justo después de esa cabecera dentro del Base64. Puedes reproducir el descifrado exacto en la línea de comandos: echo 'U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=' | openssl enc -d -aes-256-cbc -pbkdf2 -iter 10000 -pass pass:correct-horse -base64 -A. Si un texto cifrado similar falla con PBKDF2, probablemente lo generó CryptoJS — cambia la KDF a EVP-MD5 e inténtalo de nuevo. Haz clic en Cargar ejemplo de OpenSSL para rellenar estos valores automáticamente.
Cómo descifrar texto cifrado AES
- 1
Pega el texto cifrado
Suelta tu texto cifrado en Base64 o Hex en la entrada. Si empieza por U2FsdGVkX1, la herramienta lo marca como formato OpenSSL/CryptoJS y ofrece cambiarte al modo correcto.
- 2
Ajusta el formato y el modo
Para una cadena autocontenida de esta herramienta, mantén el modo Frase de contraseña y el GCM/CBC/CTR correspondiente. Para salida de OpenSSL/CryptoJS, acepta el cambio (CBC + frase de contraseña). Para datos con clave sin procesar, elige Clave sin procesar y la codificación, e indica el IV si no está antepuesto.
- 3
Elige la función de derivación de clave
En el modo OpenSSL, elige PBKDF2 (y su recuento de iteraciones), EVP-SHA256 o EVP-MD5 para que coincida con cómo se derivó la clave. EVP-MD5 es la que usa CryptoJS.
- 4
Introduce la frase de contraseña o la clave
Escribe la frase de contraseña exacta, o pega la clave sin procesar exacta en hex o Base64. El texto plano aparece a la derecha en cuanto todo coincide.
- 5
Lee el diagnóstico si falla
Si el descifrado da error, el panel indica la causa probable — IV incorrecto, clave incorrecta, error de relleno, contaminación de base64 o un desajuste de KDF — para que puedas ajustar un ajuste a la vez en lugar de adivinar.
Por qué falla el descifrado AES — y cómo solucionarlo
Fallo de autenticación GCM
GCM se niega a devolver texto plano si la etiqueta no se verifica. La causa es una frase de contraseña o clave incorrecta, el modo incorrecto, un IV incorrecto, o texto cifrado alterado o truncado — GCM no puede decir cuál. Revisa cada uno frente a cómo se cifraron los datos.
mode: CBC // but the data was encrypted with GCM => Authentication failed
mode: GCM, same passphrase and key size as encryption => plaintext
CBC: un primer bloque ilegible significa un IV incorrecto
En CBC, el IV solo afecta al primer bloque de 16 bytes. Si el bloque uno es ilegible pero el resto se decodifica limpiamente, tu IV es incorrecto; si todo es ilegible, la clave es incorrecta.
iv: 00000000000000000000000000000000 (wrong IV) => first block corrupt, rest readable
iv: (the exact IV used to encrypt) => Attack at dawn!
Error de relleno CBC / PKCS#7
Un error de relleno casi siempre significa que la clave es incorrecta; también puede significar que el texto cifrado se corrompió, se truncó o no tenía relleno PKCS#7. Confirma que se copió el texto cifrado completo y que la frase de contraseña y la KDF coinciden.
passphrase: hunter3 // one character off => padding error
passphrase: hunter2 // exact => plaintext
Contaminación de Base64 (o hex)
Los saltos de línea, espacios o comillas tipográficas pegados junto con el texto cifrado rompen la decodificación. La herramienta elimina los espacios en blanco automáticamente, pero los caracteres faltantes o sobrantes siguen fallando.
“U2FsdGVkX1...” (curly quotes and trailing junk copied in)
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ= (clean Base64)
U2FsdGVkX1 detectado pero el modo OpenSSL está desactivado
Si la entrada empieza por U2FsdGVkX1, estás ante una salida Salted__ de OpenSSL/CryptoJS, que no se descifrará como una cadena normal de frase de contraseña. La herramienta muestra un aviso; haz clic en Cambiar al modo OpenSSL y elige la KDF.
OpenSSL compatible: off input: U2FsdGVkX1... => cannot parse
OpenSSL compatible: on, KDF chosen => plaintext
Desajuste de KDF (la trampa de CryptoJS)
Un texto cifrado que falla con PBKDF2 o SHA-256 pero se descifra con EVP-MD5 fue producido por CryptoJS u openssl 1.0.2 y anteriores. En la línea de comandos, esos necesitan -md md5.
KDF: PBKDF2 // CryptoJS ciphertext => padding error
KDF: EVP-MD5 // matches CryptoJS => plaintext
Qué puedes hacer con el descifrado AES
- Descifra la salida de openssl enc
- Lee un blob Salted__ producido por openssl enc -aes-256-cbc sin recurrir a una terminal: pega el Base64, introduce la frase de contraseña, elige la KDF y obtén tu texto plano.
- Descifra texto cifrado de CryptoJS
- Recupera datos de una aplicación heredada que usó CryptoJS AES.encrypt(text, passphrase). Selecciona EVP-MD5 para igualar su derivación de clave MD5 de una sola pasada — el paso que casi todos pasan por alto.
- Depura un descifrado que sigue fallando
- Cuando tu propio código no puede descifrar algo, pégalo aquí para aislar si el problema es la clave, el IV, el modo, la codificación o la KDF, usando el panel de diagnóstico.
- Verifica un ciclo completo de cifrado
- Confirma que el texto cifrado de la página de cifrado AES o de tu aplicación se descifra de vuelta a los bytes originales exactos.
- Entiende un texto cifrado desconocido
- Identifica un formato por su forma — un prefijo U2FsdGVkX1, o un prefijo de longitud fija que parece un IV — y averigua cómo se produjo antes de probar una clave.
Funcionamiento interno y formatos del descifrado AES
- Descifrado GCM — autenticado
- GCM recalcula la etiqueta de 128 bits sobre el texto cifrado y la compara antes de devolver cualquier texto plano; un desajuste lanza un error en lugar de filtrar datos corruptos. Usa el IV de 96 bits que fue antepuesto. Un fallo de GCM significa que la clave, el modo, el IV o el texto cifrado son incorrectos — el cifrado no puede decirte cuál, solo que la autenticación falló.
- Descifrado CBC — observa el primer bloque y el relleno
- CBC tiene dos firmas de fallo distintas. Si solo el primer bloque de 16 bytes sale ilegible y el resto se ve bien, el IV era incorrecto. Si todos los bloques son ilegibles, la clave es incorrecta. Un error de relleno PKCS#7 normalmente significa que la clave es incorrecta, o que el texto cifrado se corrompió o truncó. CBC no tiene etiqueta (a diferencia de una construcción autenticada como un HMAC), así que una clave incorrecta puede incluso descifrar a bytes que parecen plausibles.
- Descifrado CTR — silencioso ante errores
- CTR nunca lanza un error: una clave incorrecta simplemente produce datos ilegibles, que normalmente se manifiestan como un error de 'UTF-8 no válido' una vez que los bytes se decodifican a texto. Haz coincidir el contador/IV exactamente. Como no hay comprobación de integridad, trata con sospecha cualquier salida de CTR que no hayas autenticado por separado.
- Diseños de texto cifrado (F1 / F2 / F3)
- El formato 1 (frase de contraseña) es sal(16) luego IV luego texto cifrado, con la etiqueta GCM de 16 bytes añadida al final en modo GCM. El formato 2 (clave sin procesar) es IV luego texto cifrado, o texto cifrado puro con un IV indicado por separado. El formato 3 (OpenSSL) es la cabecera ASCII Salted__ luego una sal de 8 bytes luego el texto cifrado. Saber qué diseño tienes le indica a la herramienta dónde viven la sal y el IV, y una clave sin procesar en sí debería provenir de un CSPRNG — consulta el generador de clave secreta.
- Derivación de clave: igualar lo que cifró los datos
- Para texto cifrado autocontenido con frase de contraseña, esta herramienta usa PBKDF2-HMAC-SHA256 a 600.000 iteraciones. Para texto cifrado de OpenSSL/CryptoJS debes seleccionar la KDF que se usó: PBKDF2 (el valor por defecto de openssl -pbkdf2 es 10.000 iteraciones — ajusta tu recuento exacto), EVP_BytesToKey con SHA-256 (openssl 1.1+ sin -pbkdf2), o EVP_BytesToKey con MD5 y una sola pasada (CryptoJS y openssl 1.0.2 y anteriores). El fallo clásico de 'esto no descifra' es un texto cifrado de CryptoJS u openssl antiguo probado con SHA-256 — cambia a EVP-MD5 y funciona.
Buenas prácticas de descifrado AES
- Empieza por identificar el formato
- Antes de tocar ningún ajuste, mira el texto cifrado. Un prefijo U2FsdGVkX1 significa OpenSSL/CryptoJS; una cadena autocontenida de esta herramienta es formato de frase de contraseña; un blob puro normalmente necesita una clave sin procesar y un IV por separado.
- Haz coincidir exactamente la función de derivación de clave
- Para texto cifrado de OpenSSL/CryptoJS, la KDF es tan importante como la frase de contraseña. Si PBKDF2 falla, prueba EVP-MD5 (CryptoJS, openssl antiguo); el recuento de iteraciones también debe coincidir, no solo el algoritmo.
- Pega el texto cifrado sin contaminar
- Los saltos de línea o espacios sueltos al copiar pueden corromper el Base64. Esta herramienta elimina los espacios en blanco, pero si la decodificación sigue fallando, revisa si hay comillas tipográficas, caracteres faltantes o una copia truncada. Nuestra herramienta de Base64 puede ayudarte a inspeccionar una cadena sospechosa.
- Trata con honestidad un resultado con clave incorrecta
- Con CTR o CBC, una clave incorrecta puede producir bytes en lugar de un error. Si la salida parece ilegible o falla la comprobación de UTF-8, la clave o el IV son incorrectos — no confíes en una salida que parezca parcialmente correcta.
- Nunca envíes texto cifrado secreto o claves a un servidor
- El sentido de descifrar en el navegador es que nada sale de la página. Evita herramientas que suban datos; esta usa Web Crypto localmente, y puedes verificarlo con la pestaña Red o desconectándote. AES-256 es fuerte — aprobado por CNSA 2.0 para TOP SECRET — así que si no puedes descifrar, el problema son los parámetros, no el cifrado.
Preguntas frecuentes sobre descifrado AES
¿Se puede descifrar AES sin la clave?
¿Cómo descifro la salida de openssl enc?
¿Qué significa U2FsdGVkX1 al principio de un texto cifrado?
¿Cómo descifro texto cifrado de CryptoJS?
GCM frente a CBC — ¿por qué mi texto cifrado se descifra de una forma y no de la otra?
¿Se suben mi texto cifrado o mi clave al descifrar aquí?
¿Cuál es la diferencia entre una frase de contraseña y una clave sin procesar al descifrar?
Herramientas relacionadas
Ver todas las herramientas →Herramienta de Cifrado AES — GCM, CBC y CTR
Herramientas de Seguridad
Cifrado AES online y gratuito — AES-128/192/256, GCM/CBC/CTR, frase de contraseña (PBKDF2) o clave sin procesar. Se ejecuta 100 % en tu navegador; nada se sube a un servidor.
Generador y verificador de hash bcrypt
Herramientas de Seguridad
Genera y verifica hashes bcrypt de contraseñas online — coste ajustable, prefijos $2b$/$2a$/$2y$. 100 % en tu navegador; tu contraseña nunca se sube.
Generador HMAC y verificador de firmas
Herramientas de Seguridad
Generador y verificador HMAC en línea gratis. Calcula HMAC-SHA256/SHA1/SHA384/SHA512 con claves en texto, hex o Base64 y salida Hex/Base64/Base64URL. 100 % en tu navegador: las claves nunca salen de la página.
Decodificador JWT
Herramientas de Seguridad
Decodifica tokens JWT online con nuestro decodificador JWT gratis. Inspecciona encabezado, carga útil, firma, expiración y reclamaciones al instante. 100% navegador — tu token nunca sale del dispositivo. Sin registro ni rastreo.
Codificador y Generador JWT
Herramientas de Seguridad
Generador y codificador JWT gratis online. Construye el encabezado y la carga útil, firma con HS256, RS256 o ES256 al instante. 100% en el navegador — tu secreto y tu clave nunca salen de tu dispositivo.
Generador de secreto JWT — HS256/384/512
Herramientas de Seguridad
Genera un secreto JWT fuerte y conforme a la RFC para HS256/384/512 — 100 % en tu navegador, nunca enviado a un servidor. base64url, base64 o hex para .env.