Cómo ocultar texto secreto en imágenes (esteganografía)
La esteganografía consiste en esconder un mensaje dentro de otra cosa, de modo que nadie sospeche que hay algo oculto. En el caso de las imágenes, el texto secreto se guarda en los propios píxeles y la foto sigue viéndose idéntica. En esta guía verás cómo ocultar y revelar texto dentro de una imagen, gratis y totalmente en tu navegador, con la opción de cifrar el mensaje con una contraseña.
Cómo funciona
Una imagen digital es una rejilla de píxeles, y cada píxel tiene tres valores de color: rojo, verde y azul, cada uno entre 0 y 255. Ese rango cabe en 8 bits (un byte). La técnica que usamos se llama LSB, del inglés least significant bit, es decir, el bit menos significativo: el último bit de cada valor.
Cambiar ese último bit apenas altera el color. Por ejemplo, un rojo de valor 200 en binario es 11001000. Si le cambiamos el último bit para que valga 201, queda 11001001. La diferencia entre 200 y 201 es imperceptible para el ojo humano, pero ese bit ahora puede transportar información nuestra.
El mensaje se convierte en bytes, y cada bit de esos bytes se escribe en el bit menos significativo de un canal de un píxel. Un ejemplo concreto: la letra “H” corresponde al número 72, que en binario es 01001000. Esos 8 bits se reparten uno a uno en el bit menos significativo de ocho canales sucesivos. Al leer de nuevo esos últimos bits en el mismo orden, recuperamos 01001000, o sea 72, o sea “H”. Repite el proceso para cada letra y tienes el mensaje completo escondido dentro de la imagen.
Cuánto puedes ocultar
La capacidad depende de cuántos píxeles tenga la imagen y de cuántos canales de color uses. Con 1 bit por canal por píxel, estos son valores aproximados:
| Tamaño de la imagen | Solo canal rojo | RGB (rojo, verde y azul) |
|---|---|---|
| 100x100 px | 1,2 KB | 3,6 KB |
| 1280x720 px | 115 KB | 345 KB |
| 1920x1080 px | 259 KB | 778 KB |
Usar los tres canales R, G y B a la vez triplica la capacidad, porque cada píxel aporta tres bits en lugar de uno. Nuestro codificador te deja elegir entre Rojo, RGB o RGBA, así ajustas el equilibrio entre discreción y espacio disponible.
Oculta un mensaje
Sube tu imagen, escribe el texto y descarga el resultado. Todo pasa aquí mismo, en tu navegador.
Los pasos son sencillos:
- Sube una imagen (funciona bien cualquier foto o captura con suficiente detalle).
- Escribe el mensaje que quieres ocultar.
- Opcionalmente, elige RGB si necesitas más espacio que el que da el canal rojo por sí solo.
- Opcionalmente, define una contraseña para cifrar el contenido.
- Haz clic en Codificar y luego en Descargar.
La imagen resultante siempre se descarga en formato PNG, y esto es importante: el PNG es un formato sin pérdidas, así que conserva cada bit tal cual. El JPEG, en cambio, comprime con pérdidas y reescribe los valores de color para ahorrar tamaño, lo que destruiría por completo los bits ocultos. Por eso nunca guardamos la salida como JPEG.
Revela un mensaje
Para leer un texto oculto solo necesitas el PNG. Suéltalo en el decodificador y aparecerá el mensaje.
Los pasos:
- Arrastra o sube el PNG con el mensaje escondido.
- Si el texto se cifró con contraseña, escríbela cuando se te pida.
- Lee el texto revelado.
El decodificador es bastante flexible: detecta automáticamente muchos formatos LSB habituales, no solo el que produce nuestro codificador. Prueba distintas combinaciones de canales (R, RGB, RGBA, y también solo verde o solo azul), reconoce tanto mensajes con prefijo de longitud como los terminados con un byte nulo, y admite el orden de bits en modo MSB o LSB. Además aplica una validación estricta, de manera que una foto normal sin nada escondido simplemente devuelve un resultado vacío en lugar de “ruido” inventado.
Añade una contraseña (cifrado)
Cuando defines una contraseña, el mensaje no solo se esconde: se cifra con AES-256-GCM, con la clave derivada de tu contraseña mediante PBKDF2. El efecto práctico es doble. Sin la contraseña, los bits ocultos parecen ruido aleatorio y no revelan absolutamente nada. Y una contraseña incorrecta tampoco revela nada, porque la etiqueta de autenticación de GCM detecta que la clave no coincide y rechaza el descifrado.
Vale la pena entender la diferencia entre las dos capas. La esteganografía oculta que existe un mensaje: quien mira la imagen no sospecha que hay algo dentro. El cifrado hace que el mensaje sea ilegible aunque alguien descubra que está ahí y logre extraer los bits. Por separado cada una tiene su límite; juntas se refuerzan, porque un atacante primero tendría que notar que hay contenido oculto y después romper el cifrado.
Límites y errores comunes
Conviene ser honesto sobre lo que esta técnica no hace:
- Funciona únicamente con PNG (u otros formatos sin pérdidas). Es el requisito clave.
- Volver a guardar la imagen como JPEG, o hacerle una captura de pantalla, altera los valores de color y borra el mensaje. Trata el PNG como el archivo original y no lo reconviertas.
- Muchas apps de chat y redes sociales recomprimen automáticamente las imágenes que subes, y esa recompresión destruye el payload. Para que el mensaje sobreviva, comparte el PNG como archivo adjunto (por ejemplo, “enviar como documento”), no por un canal que lo reprocese.
- Es esteganografía LSB, no un detector universal. No extrae mensajes ocultos con otros métodos, como la esteganografía en el dominio DCT que se usa en algunos esquemas sobre JPEG.
Preguntas frecuentes
¿Es privado? Sí. Tanto el codificador como el decodificador se ejecutan por completo en tu navegador usando la Canvas API. La imagen y el texto nunca salen de tu dispositivo: no se sube nada a ningún servidor.
¿Puedo usar cualquier imagen? Puedes partir de casi cualquier imagen (foto, captura, dibujo), pero el resultado se descarga siempre como PNG para no perder los bits. Cuanta más resolución tenga, más texto cabe. Solo recuerda no convertir después la salida a JPEG.
¿La imagen codificada se verá diferente? No a simple vista. Solo cambiamos el último bit de cada canal, así que la variación de color es de una unidad como mucho, invisible para el ojo. Los archivos ocupan prácticamente lo mismo que el original.
¿Alguien puede leerlo sin la contraseña? Si cifraste el mensaje, no. Sin la contraseña correcta los bits parecen ruido aleatorio y el descifrado AES-256-GCM se rechaza. Si no usaste contraseña, cualquiera que sospeche que hay un mensaje LSB podría extraerlo, así que para contenido sensible añade siempre una contraseña.
¿Listo para probarlo? Esconde tu mensaje con el Codificador de Esteganografía y recupéralo con el Decodificador de Esteganografía.