Cifrar y descifrar texto con una frase de contraseña
Escribe un mensaje, elige una frase de contraseña y obtienes un bloque en base64 que solo esa misma frase puede abrir. La clave se deriva en tu dispositivo con PBKDF2 y el cifrado es AES-256-GCM, así que un bloque modificado falla al descifrarse en vez de devolver basura en silencio.
La clave sale de esta frase de contraseña y de nada más. No hay enlace de recuperación ni forma de restablecerla: si la olvidas, el texto se pierde para siempre.
Qué ocurre cuando pulsas Cifrar
Cuatro pasos, todos dentro de la implementación de Web Crypto de tu navegador y no en JavaScript:
- Se toman dieciséis bytes aleatorios como sal, y doce más como el IV — el nonce que AES-GCM necesita.
- Tu frase de contraseña se estira hasta una clave de 256 bits con PBKDF2-HMAC-SHA-256, 250.000 rondas, usando esa sal.
- El texto se codifica como UTF-8 y se cifra con AES-256-GCM, que produce el texto cifrado más una etiqueta de autenticación de 16 bytes.
- La sal, el IV, el número de rondas y el texto cifrado se empaquetan juntos y se codifican en base64, así que el conjunto entero aguanta un copiar y pegar en un correo.
El descifrado vuelve a leer los parámetros del propio bloque, así que solo necesitas la frase de contraseña.
El formato de salida, byte a byte
Aquí no hay nada propietario, y un formato que no puedas abrir en otra parte no protege gran cosa. Después de decodificar el bloque desde base64 obtienes:
- Byte 0 — la versión del formato, ahora mismo
1. - Bytes 1 a 4 — el número de rondas de PBKDF2, entero de 32 bits big-endian.
- Bytes 5 a 20 — la sal de 16 bytes.
- Bytes 21 a 32 — el nonce GCM de 12 bytes.
- Del byte 33 en adelante — el texto cifrado AES-256-GCM con su etiqueta de 16 bytes al final, que es la disposición que produce Web Crypto.
El número de rondas viaja con el bloque para que esa cifra pueda subirse más adelante sin romper nada de lo cifrado hoy. Al volver a entrar se comprueba que esté dentro de rango, porque si no un bloque enviado por un desconocido podría pedirle a tu navegador mil millones de rondas y colgar la pestaña.
Por qué el mismo texto da un bloque distinto cada vez
Se generan una sal nueva y un nonce nuevo para cada mensaje, así que cifrar la misma frase dos veces con la misma frase de contraseña produce dos bloques sin relación entre sí. Ese es el comportamiento correcto. Una salida idéntica le diría a un observador que dos mensajes son iguales sin necesidad de leer ninguno.
También importa que el nonce nunca se reutilice con la misma clave. GCM es especialmente frágil en esto: repite un nonce y un atacante puede recuperar el XOR de dos textos en claro y, peor todavía, deducir el valor que se usa para autenticar mensajes, lo que le permite falsificar bloques. Nonces aleatorios por mensaje, con una clave nueva derivada de una sal nueva, mantienen esto bien lejos de la zona de peligro.
Por qué GCM y no CBC
La mayoría de las herramientas de "cifrado AES" usan AES-CBC sin autenticación. El cifrado por sí solo oculta el contenido, pero no detecta cambios: invierte unos cuantos bits en un texto cifrado con CBC y se seguirá descifrando, en otra cosa distinta, sin protestar. Esa es la puerta por la que entran los ataques de padding oracle. GCM produce una etiqueta de autenticación junto al texto cifrado, de modo que un solo byte alterado hace que el descifrado falle por completo. Si ves "No se pudo descifrar", el bloque realmente no verificó.
Dónde se queda corto
La frase de contraseña lo es todo. PBKDF2 con 250.000 rondas hace que cada intento cueste trabajo real, pero un atacante que tenga el bloque prueba combinaciones sin conexión, en paralelo, sobre hardware hecho para eso, durante todo el tiempo que quiera. Una palabra del diccionario con un número detrás no sobrevive a eso. Cuatro o cinco palabras realmente aleatorias sí.
PBKDF2 es la opción más débil de las modernas. Argon2 y scrypt son memory-hard: exigen mucha memoria, lo que recorta la ventaja de la GPU. PBKDF2 no lo es, y contra él un atacante con GPU saca muchísimo más partido. Los navegadores solo exponen PBKDF2 a través de Web Crypto, y meter una compilación de Argon2 es justo el tipo de dependencia que este sitio no incluye. Es una limitación real, no una preferencia.
Prueba integridad, no identidad. Un bloque que se descifra no fue modificado por nadie sin la frase de contraseña. No prueba quién lo escribió, porque cualquiera que tenga la frase puede escribir uno. Para mensajes entre personas, las herramientas hechas para eso — age, GPG, Signal — cubren la parte que esto no cubre.
Solo texto. No hay modo de archivo. Cifrar un archivo significa leerlo entero en memoria y devolverte una descarga, y para cualquier cosa de tamaño una herramienta de escritorio lo hace mejor.
Dos notas prácticas. Enviar la frase de contraseña por el mismo canal que el bloque echa por tierra todo el ejercicio. Y el resultado pasa por tu portapapeles, que otras aplicaciones de la máquina a menudo pueden leer.
Preguntas frecuentes
¿Esto es realmente seguro?
La criptografía es estándar y corre en la implementación nativa del navegador: AES-256-GCM con una clave estirada desde tu frase de contraseña por PBKDF2-HMAC-SHA-256 a lo largo de 250.000 rondas y con una sal aleatoria. El punto débil nunca es el algoritmo, es la frase de contraseña. Una corta o fácil de adivinar se puede romper por fuerza bruta sin conexión por muy bueno que sea el cifrado.
¿Qué pasa si olvido la frase de contraseña?
El texto es irrecuperable. No hay custodia de claves, no hay restablecimiento y no hay copia de nada en ninguna parte: la página no guarda estado y no hay servidor detrás. Anota la frase de contraseña en algún lado antes de confiar en el bloque.
¿Por qué cifrar el mismo texto dos veces da un resultado distinto?
Porque cada vez se generan una sal y un nonce aleatorios nuevos. Un texto cifrado idéntico filtraría el hecho de que dos mensajes son iguales, así que es intencionado, no un fallo.
¿Puedo descifrar esto con OpenSSL o Python?
Con un solo comando de OpenSSL no, porque la sal, el nonce y el número de rondas viven en una cabecera propia. La disposición está documentada más arriba, y unas diez líneas de Python con el paquete cryptography la leen: extrae los campos, ejecuta PBKDF2 y luego abre el resto con AES-GCM.
¿Puedo cifrar un archivo en lugar de texto?
Aquí no. Esta herramienta solo maneja texto. Para archivos, usa age o GPG en el escritorio, o un archivo comprimido protegido con contraseña si el destinatario no tiene nada más instalado.
Última actualización 19 de septiembre de 2026