
El año pasado encontré un desafío de esteganografía en un CTF que me tuvo mirando la foto de un gato durante dos horas. La imagen parecía completamente normal; 800x600 píxeles de un gato atigrado naranja sentado sobre un teclado. Sin anomalías en los metadatos, sin archivos ZIP adjuntos, sin artefactos obvios. La flag estaba escondida en los bits menos significativos del canal azul. Cuando la extraje, el mensaje tenía 43 caracteres. El gato no había cambiado en absoluto.
Esa experiencia me llevó por un camino sin retorno. La esteganografía es uno de esos temas que suenan a ficción de película de hackers hasta que lo intentas de verdad. Entonces te das cuenta de que es solo matemáticas; y matemáticas sorprendentemente simples.
Qué es realmente la esteganografía
La esteganografía es la práctica de ocultar datos dentro de otros datos de forma que nadie sepa que los datos ocultos existen. Es fundamentalmente distinto de la criptografía. El cifrado transforma un mensaje para que no pueda leerse; la esteganografía oculta el mensaje para que nadie siquiera lo busque.
La distinción importa. Un archivo cifrado grita "tengo secretos". Una imagen con esteganografía no dice nada. Es una foto de un gato. O un atardecer. O el logo de tu empresa. La mejor esteganografía produce archivos portadores estadísticamente indistinguibles de los originales sin modificar.
La palabra proviene del griego: steganos (cubierto) + graphein (escritura). Existe desde la antigua Grecia; Heródoto escribió sobre un hombre que afeitó la cabeza de un esclavo, tatuó un mensaje en el cuero cabelludo, esperó a que el pelo volviera a crecer y envió al esclavo a entregar el mensaje. Desde entonces hemos evolucionado a los píxeles.
Cómo funciona la codificación LSB
La técnica de esteganografía en imágenes más común es la codificación Least Significant Bit (LSB); es decir, el bit menos significativo. Así es como funciona.
Un píxel en una imagen RGB de 24 bits tiene tres canales de color, cada uno almacenado como un valor de 8 bits (0-255). El último bit de cada byte; el bit menos significativo; contribuye con el cambio más pequeño posible al valor del color. Modificarlo cambia el valor del canal en exactamente 1. La diferencia entre RGB(142, 87, 203) y RGB(143, 87, 202) es invisible para el ojo humano.
Entonces tomas tu mensaje secreto, lo conviertes a binario y reemplazas los LSBs de los píxeles de la imagen con los bits de tu mensaje. Cada píxel te da 3 bits de almacenamiento (uno por canal). Una imagen de 1920x1080 tiene 2.073.600 píxeles; eso son 6.220.800 bits de almacenamiento, o aproximadamente 760 KB de datos ocultos. En la práctica usarías mucho menos para evitar la detección, pero la capacidad teórica es enorme.
Aquí tienes una implementación mínima en Python para hacerlo más concreto:
from PIL import Image
import numpy as np
def text_to_bits(text):
"""Convert text to a binary string with a null terminator."""
bits = ''.join(format(ord(c), '08b') for c in text)
bits += '00000000' # null terminator to mark end of message
return bits
def hide_message(image_path, message, output_path):
"""Hide a message in the LSBs of an image."""
img = Image.open(image_path).convert('RGB')
pixels = np.array(img)
flat = pixels.flatten()
bits = text_to_bits(message)
if len(bits) > len(flat):
raise ValueError(f"Message too long: need {len(bits)} bits, have {len(flat)}")
for i, bit in enumerate(bits):
# Clear the LSB, then set it to our message bit
flat[i] = (flat[i] & 0xFE) | int(bit)
stego = flat.reshape(pixels.shape)
Image.fromarray(stego.astype('uint8')).save(output_path, 'PNG')
print(f"Hidden {len(message)} chars in {len(bits)} bits ({len(bits)/len(flat)*100:.4f}% of capacity)")
def extract_message(image_path):
"""Extract a hidden message from the LSBs of an image."""
img = Image.open(image_path).convert('RGB')
flat = np.array(img).flatten()
bits = ''.join(str(b & 1) for b in flat)
chars = []
for i in range(0, len(bits), 8):
byte = bits[i:i+8]
if byte == '00000000':
break
chars.append(chr(int(byte, 2)))
return ''.join(chars)
# Usage
hide_message('cat.png', 'The flag is CTF{hidden_in_plain_sight}', 'stego_cat.png')
print(extract_message('stego_cat.png'))
La operación clave está en la línea 18: (flat[i] & 0xFE) | int(bit). El AND a nivel de bits con 0xFE (11111110 en binario) limpia el LSB, y el OR lo establece en el valor de nuestro bit del mensaje. Ese es todo el truco. El resto es simplemente convertir texto a bits e iterar sobre los píxeles.
Ocultar un mensaje paso a paso
Si no quieres escribir Python; o estás en una máquina donde no puedes instalar PIL; la Herramienta de Esteganografía en Kitmul hace lo mismo directamente en tu navegador. Sin subidas de archivos, sin procesamiento en servidor. La imagen nunca sale de tu dispositivo.
Este es el flujo de trabajo:
- Sube una imagen portadora. PNG funciona mejor porque es sin pérdida. La compresión JPEG destruirá tus bits ocultos; más sobre eso después.
- Escribe tu mensaje secreto. La herramienta te muestra la capacidad disponible según las dimensiones de tu imagen.
- Descarga la imagen esteganográfica. Se ve idéntica a la original. Píxel por píxel, las diferencias son imperceptibles.
Para extraer, cambia al modo Revelar, sube la imagen esteganográfica y el texto oculto aparecerá.

Toda la operación se ejecuta del lado del cliente usando la Canvas API y typed arrays. Tu mensaje secreto nunca toca una conexión de red. Esto importa; si estás ocultando información sensible, enviarla a un servidor de terceros anula completamente el propósito.
Detección y estegoanálisis; cómo NO ser descubierto
El estegoanálisis es el arte de detectar esteganografía, y es más sofisticado de lo que podrías pensar.
La inspección visual no detectará la codificación LSB. Pero el análisis estadístico sí. La prueba más simple es un análisis chi-cuadrado de las distribuciones de valores de píxeles. En una imagen natural, los valores de los píxeles tienen una distribución característica. La incrustación LSB aplana pares de valores (por ejemplo, 142 y 143 se vuelven igualmente probables), lo que aparece como una anomalía en el histograma.
Herramientas como StegExpose y OpenStego incluyen módulos de detección. En entornos competitivos de CTF, zsteg y steghide son las herramientas de extracción habituales.
Aquí van algunos consejos prácticos si quieres que tu imagen esteganográfica resista el escrutinio:
- Usa menos capacidad. Incrustar datos en solo el 10-20% de los píxeles disponibles hace que la detección estadística sea mucho más difícil. Usar el 100% de la capacidad es una señal de alerta forense.
- Aleatoriza la selección de píxeles. En lugar de escribir secuencialmente desde el píxel 0, usa una secuencia pseudoaleatoria con una semilla basada en una contraseña para seleccionar qué píxeles llevan datos. Esto distribuye las modificaciones de forma uniforme.
- Elige imágenes con mucho detalle. Las fotos con mucha textura, ruido y variación de color ocultan mejor los cambios LSB que los degradados suaves o los bloques sólidos. Una foto del suelo de un bosque funciona mejor que una foto de una pared blanca.
- Nunca uses JPEG como portador. La compresión con pérdida de JPEG modifica los valores de los píxeles durante la codificación. Tus bits ocultos se destruirán al guardar la imagen. Usa siempre PNG, BMP o TIFF para esteganografía LSB.
- Elimina los metadatos antes de compartir. Los datos EXIF que muestran que la imagen fue procesada por una herramienta de esteganografía son una pista obvia.
Cuándo combinar esteganografía con cifrado
La esteganografía y el cifrado resuelven problemas diferentes, y el enfoque más fuerte usa ambos. Veamos por qué.
Si un atacante sospecha que tu imagen contiene datos ocultos y logra extraer los LSBs, verá tu mensaje en texto plano. Fin del juego. Pero si cifras el mensaje primero; usando AES-256, por ejemplo; los bits extraídos parecen ruido aleatorio. El atacante no puede distinguir si encontró un mensaje o simplemente datos normales de la imagen.
El flujo de trabajo práctico:
- Cifra tu mensaje con un cifrado simétrico fuerte.
- Oculta el texto cifrado en la imagen usando codificación LSB.
- Comparte la imagen esteganográfica públicamente.
- Comparte la clave de descifrado por un canal separado.
Esto te da dos capas de protección: el mensaje está tanto oculto (esteganografía) como ilegible (cifrado). Un atacante necesitaría tanto detectar los datos ocultos como romper el cifrado; un problema significativamente más difícil que cualquiera de los dos por separado.
Las herramientas de Seguridad y Criptografía de Kitmul incluyen cifrado AES, generadores de hash y otras utilidades que complementan la herramienta de esteganografía para exactamente este flujo de trabajo.
Casos de uso en el mundo real
La esteganografía no es solo un truco de CTF. Tiene aplicaciones legítimas e importantes.
Marcas de agua digitales. Editores, fotógrafos y empresas de medios incrustan marcas de agua invisibles en imágenes para rastrear la distribución no autorizada. Si aparece una imagen filtrada, la marca de agua incrustada identifica qué destinatario la filtró. Así es como varios estudios de cine importantes rastrean las copias de evaluación.
Denuncia y resistencia a la censura. En países con fuerte vigilancia de internet, la esteganografía permite a los activistas compartir información a través de imágenes de apariencia inocente publicadas en redes sociales. La imagen pasa la inspección de los filtros de contenido automatizados; el mensaje oculto llega a su audiencia objetivo.
Comunicación encubierta. Las agencias de inteligencia han usado esteganografía al menos desde principios de los 2000. La detención por parte del FBI en 2010 de espías rusos (el "Programa Illegals") reveló que estaban incrustando mensajes cifrados en imágenes publicadas en sitios web públicos.
Desafíos CTF. Las competiciones Capture The Flag adoran la esteganografía porque pone a prueba un conjunto de habilidades diferente al de los desafíos criptográficos estándar. Necesitas identificar que se usó esteganografía antes de poder comenzar la extracción. Las técnicas de esteganografía habituales en CTF incluyen codificación LSB, datos adjuntos, manipulación de paletas en archivos GIF y ocultación en el espectro de audio.
Prueba de propiedad. Artistas y creadores de contenido pueden incrustar información de derechos de autor o pruebas de propiedad directamente en sus obras. A diferencia de las marcas de agua visibles, estas no degradan la calidad visual de la pieza.

Los límites de la codificación de píxeles
La esteganografía LSB tiene limitaciones reales que vale la pena entender. La imagen portadora debe ser sin pérdida; cualquier paso de compresión con pérdida (JPEG, WebP con pérdida) corromperá los datos incrustados. La capacidad del mensaje escala con las dimensiones de la imagen, pero usar más del 15-20% de la capacidad hace que la imagen sea vulnerable a la detección estadística. Y la técnica solo oculta datos; no los protege de la extracción por parte de alguien que sabe qué buscar.
Para la mayoría de los propósitos prácticos, la esteganografía en imágenes funciona mejor como una capa dentro de una estrategia de defensa en profundidad. Oculta el mensaje, cifra el contenido y usa un canal seguro para compartir la clave. Ninguna técnica individual es infalible, pero la combinación eleva significativamente el nivel de dificultad.
Pruébalo tú mismo
La Herramienta de Esteganografía en Kitmul te permite ocultar y revelar mensajes en imágenes PNG directamente en tu navegador. Todo se ejecuta del lado del cliente; no se suben datos, no se necesitan cuentas, sin límites. Sube una imagen, escribe un mensaje, descarga el resultado. Luego intenta extraerlo para verificar el proceso completo.
Si te interesan las herramientas de seguridad y privacidad, la colección de Seguridad y Criptografía incluye generadores de hash, herramientas de cifrado, generadores de contraseñas y más; todo ejecutándose localmente en tu navegador.
Todo el procesamiento se ejecuta localmente en tu navegador. No se envían imágenes ni mensajes a ningún servidor. La herramienta es gratuita, abierta y no requiere cuentas ni tiene límites.