Qué hay dentro de ese bloque en Base64
La salida parece texto aleatorio, pero tiene una estructura definida. Detrás del Base64 hay un pequeño
contenedor binario: una firma de seis bytes que dice SFXENC, un byte de versión, el número de
iteraciones de PBKDF2 como entero de 32 bits, la sal de 16 bytes, el nonce de 12 bytes, dos bytes de
longitud de nombre, y después el mensaje cifrado con su etiqueta de autenticación pegada al final.
Eso sale a 41 bytes de cabecera más una etiqueta de 16 bytes, o sea 57 bytes de sobrecarga fija antes de que el Base64 lo expanda todo un tercio. Un mensaje de 40 caracteres aterriza por tanto en 97 bytes y 132 caracteres imprimibles. Los mensajes cortos están dominados por su propia cabecera, algo inevitable: la sal y el nonce tienen que viajar con el texto cifrado o nadie, tú incluido, podría descifrarlo jamás.
El campo de longitud de nombre es siempre cero aquí. Esta herramienta comparte su criptografía con cifrar un archivo con contraseña, cuyo contenedor reserva sitio para el nombre original del archivo para que al descifrar se restaure; un mensaje pegado no tiene nombre de archivo, así que el campo se deja vacío. Reutilizar ese código en lugar de escribir una segunda implementación significa que las dos herramientas heredan las mismas primitivas auditadas y la misma batería de pruebas.
La convención de marcadores, y un viaje de ida y vuelta completo
Hay una sola caja de texto, y la herramienta necesita dos valores tuyos, así que las secciones se marcan con líneas de cabecera. Para cifrar:
=== MESSAGE ===
La contraseña del wifi de invitados de la oficina es Trombon-Escalera-9
=== PASSWORD ===
caballo correcto grapa batería
Pulsa el botón y el resultado contiene una sección === CIPHERTEXT === con una línea larga de Base64.
Copia el bloque entero. Para leerlo de vuelta más adelante, cambia el Modo a descifrar y pega:
=== CIPHERTEXT ===
<el bloque en Base64>
=== PASSWORD ===
caballo correcto grapa batería
Como la salida de cifrado ya etiqueta correctamente su propia sección, el resultado entero se puede
pegar tal cual con las líneas de contraseña añadidas debajo. El pie === NOTES === que añade cada
pasada de cifrado se reconoce como una sección por derecho propio y se descarta al volver a entrar,
así que no hay nada que recortar antes.
Un viaje completo de ida y vuelta son cinco pasos:
- Deja el Modo en cifrar.
- Escribe o pega en la caja de texto las dos secciones marcadas de arriba, primero el mensaje y después la contraseña.
- Pulsa el botón y luego Copiar al portapapeles. Eso copia el resultado entero: el bloque
=== CIPHERTEXT ===y el pie=== NOTES ===de debajo. - Envía ese bloque a tu destinatario, y envía la contraseña por otra vía. Las dos mitades en la misma bandeja de entrada equivalen a no enviar nada cifrado.
- Para leerlo de vuelta, pon el Modo en descifrar, pega el bloque de texto cifrado con una
sección
=== PASSWORD ===debajo, y vuelve a pulsar.
PBKDF2 a 600.000 iteraciones, y por qué una contraseña débil pierde igual
El AES-256 no es el eslabón débil de este diseño. Tu contraseña sí. Las contraseñas tienen muchísima menos entropía que una clave de 256 bits, así que el hueco hay que taparlo encareciendo cada intento, que es lo que hace PBKDF2: aplica HMAC-SHA256 sobre la contraseña seiscientas mil veces antes de que el resultado se convierta en una clave AES.
Esa cifra salió de la hoja de referencia de almacenamiento de contraseñas de OWASP y no de la costumbre, y es el mismo número que usa el cifrado de archivos, porque esta herramienta importa las primitivas de aquel módulo en vez de volver a derivarlas. La derivación ocurre exactamente una vez por clic, no una vez por byte, así que el coste es una pausa fija al principio de la operación, idéntica tanto si el mensaje es una frase como si son diez páginas. Cuánto se note esa pausa es una propiedad de tu dispositivo y no de la herramienta, que es la respuesta honesta para cualquier cosa que se ejecute en local: un ordenador de sobremesa la absorbe, un móvil de hace cinco años no la va a disimular.
El motivo de que ese coste deliberado importe es que un atacante también lo paga, en cada intento. Una
palabra de diccionario, un nombre, una fecha o Verano2026! caen igualmente, porque incluso a ese
precio una lista corta de unos pocos millones de candidatos es una tarde. Una frase de contraseña de
cuatro o cinco palabras no cae, porque no hay ninguna lista corta que triturar. Genera una con el
generador de frases de contraseña, y si insistes en elegir la
tuya, pásala antes por el
verificador de fortaleza de contraseñas.
Una contraseña equivocada y un bloque manipulado fallan igual
Intenta descifrar con la contraseña equivocada y obtienes un único fallo claro, sin salida. Cambia un carácter en mitad del Base64 y obtienes el mismo fallo. Edita un byte de la cabecera, ni siquiera del texto cifrado, y lo obtienes otra vez.
Esto es el cifrado autenticado haciendo su trabajo, no un manejo de errores ordenado. El GCM produce una etiqueta sobre el texto cifrado, y la cabecera entera se le pasa como datos autenticados adicionales, así que todos los campos quedan cubiertos por esa etiqueta. La verificación pasa o no pasa. No hay descifrado parcial, ni frases medio recuperadas, ni riesgo de que te muestren basura de aspecto verosímil y la confundas con el mensaje real.
La otra cara es que la herramienta no puede decirte cuál de los dos errores cometiste. “Contraseña equivocada” y “bloque corrupto” son el mismo suceso para el cifrador, y una herramienta que adivinara entre los dos se estaría inventando información. Después de un descifrado correcto se hace una comprobación más: los bytes recuperados tienen que ser texto UTF-8 válido, y si no lo son recibes un mensaje distinto que lo dice, que es la firma de un bloque truncado justo en el punto equivocado.
Dos canales, o no has cifrado nada
Cifrar traslada el secreto del mensaje a la contraseña. Si las dos cosas viajan por la misma vía, una bandeja de entrada comprometida o una ventana de chat mirada por encima del hombro entrega el par completo y el texto cifrado era puro teatro.
Manda el bloque por correo y dicta la contraseña en una llamada. Publica el bloque en un ticket y pasa la contraseña por un mensaje directo aparte. Acordad una frase de contraseña en persona una vez y reutilizadla una temporada. Cualquiera de esas cosas encarece de verdad la interceptación; poner las dos en el mismo hilo no.
Lo que esto no oculta
El contenido de tu mensaje es confidencial. Varias cosas de alrededor no lo son: cuánto medía el
mensaje, cuándo lo enviaste, a quién se lo enviaste, y el hecho mismo de que se cifró con esta
herramienta, que es lo que anuncia la firma SFXENC a cualquiera que descodifique el Base64. Esa
firma está ahí para que la ruta de descifrado reconozca su propio formato y rechace educadamente
cualquier entrada ajena.
Todo pasa por la Web Crypto API que viene con tu navegador. Ningún material de clave, ningún texto en claro y ninguna contraseña tocan la red, y una vez cargada esta página puedes desconectarte del todo y las dos direcciones siguen funcionando. Para un documento entero en lugar de una nota pegada, la hermana basada en archivos enlazada más arriba usa las primitivas idénticas; y para leer una cadena Base64 normal que no es texto cifrado en absoluto, decodificar Base64 es la herramienta adecuada.

