Mandelsteg y su papel en la seguridad de las comunicaciones



El programa Mandelsteg ha sido escrito por Henry Hastur y puede distribuirse gratuitamente. Está en realidad formado por dos programas: mandelsteg, que genera archivos gif de fractales de Mandelbrot en los que guarda los datos que se pasan como entrada según las opciones que indiquemos en línea de comandos, gifextract, que toma las imágenes generadas por mandelsteg y extrae los datos.


Nota: la información y ejemplos que se proporcionan en esta página provienen, salvo algunas acotaciones mías, de la documentación de los programas que se comentan, elaborada por Henry Hastur. Los ejemplos se han escrito con la sintaxis de los sistemas Unix (Linux, HP-UX, System V...).

Mandelsteg


Mandelsteg tiene diversas opciones que utilizaremos dependiendo del nivel de seguridad deseado.

Si simplemente ejecutamos mandelsteg sin opciones, el programa generará un gif de 640x480 de la sección del conjunto por defecto de un fractal de Mandelbrot. Con la opción -c, calculará cuantos bytes pueden almacenarse en la imagen, y con -e tomará los datos de la entrada y los almacenará en la imagen. Podemos especificar un nombre de archivo después de -e para el archivo gif. Con -r, generará bytes aleatorios que colocará en la imagen, de forma que podremos generar imágenes sin datos verdaderos para crear confusión.

Con el nivel de seguridad mínimo que proporciona la opción -e, los datos serán guardados en el bit 7 de cada pixel y se generará una paleta de 128 colores de tal forma que los pixels tengan el mismo aspecto, contengan o no datos. Esto es suficiente para burlar vigilancias inexpertas, pero alguien que conozca estas técnicas podrá descubrir fácilmente que la imagen contiene datos. Por ejemplo, sustituyendo la paleta por otra, se distinguirán claramente los datos ocultos en áreas de la imagen donde hay colores sólidos. Esto se puede evitar con la opción -ns, que hará que se almacenen datos sólo en áreas donde no haya colores sólidos. Eso sí, esta opción reduce drásticamente el número de datos que puede almacenar la imagen, así que antes de utilizarla "directamente", conviene hacer primero una prueba con la opción -c.

Otro problema que puede delatar a la imagen es la paleta de 128 colores. Con la opción -fp se generará una paleta de 256 colores que evitará problemas, siempre que se use combinada con la opción -ns. Si no, obtendremos el efecto contrario, una imagen en la que se verá claramente que contiene datos ocultos.
seguridad comunicaciones


Pueden utilizarse tamaños de imagen distintos a 640x480, lo cual también nos permite generar imágenes más grandes y que, por tanto, puedan albergar más datos. Para ello se usa la opción -sz seguida del ancho y el alto en pixels separados por un espacio. También se puede seleccionar un área del conjunto de Mandelbrot distinta de la utilizada por defecto con la opción -md seguida de la coordenada x inicial, la coordenada y inicial, el ancho y el alto.

También se puede modificar el bit de los pixels en los que se guardarán datos, que por defecto es el 7, con la opción -b. El bit 7 da la mayor capacidad, y el 0 la mayor seguridad. También se puede hacer que el programa se salte un número inicial de bytes para que los datos ocultos no empiecen justo al principio con la opción -bp seguida del número de bytes. Si se añade la opción -r, en estos bytes "saltados" se introducirán datos aleatorios (además de, si quedan bytes libres, añadirse al final de la información ocultada para rellenar toda la imagen).


Ejemplos

mandelsteg -e fractal.gif < archivo.txt

Genera un fractal que almacena en fractal.gif, imagen de 640x480, e introduce los datos de archivo.txt.

mandelsteg -sz 400 400 -md -0.5505 -0.5505 0.0001 0.0001 -e fractal.gif < archivo.txt

Crea un fractal utilizando coordenadas distintas de las empleadas por defecto, lo almacena en una imagen de 400x400 e introduce los datos de archivo.txt.

mandelsteg -sz 400 400 -md -1.0 -1.0 2.0 2.0 -b 0 -ns -fp -bp 23 -r -e fractal.gif < archivo.txt

Crea un fractal con coordenadas distintas, lo almacena en una imagen de 400x400 y almacena los datos de archivo.txt utilizando el bit 0, no almacenando datos en áreas de colores sólidos y utilizando una paleta de 256 colores, además de introducir datos aleatorios en los 23 primeros bytes.

mandelsteg -ns -sz 320 240 -c > /dev/null

Muestra por pantalla la cantidad de información que puede almacenar en una imagen de las características indicadas.

mandelsteg -fp -r -ns -e falso.gif < /dev/null


Crea un fractal que almacena en falso.gif y que contiene datos aleatorios (útil para despistar o hacer perder tiempo).

Por cierto, salvo que se tenga un Pentium potente, hay que ser pacientes con este programa. El cálculo de fractales supone muchas operaciones en coma flotante...



Gifextract


Gifextract simplemente toma como entrada una imagen y extrae los datos que contiene. por defecto, los extraerá del bit 7, así que si almacenamos los datos en algún bit distinto, habrá que indicárselo con la opción -b. También si usamos la opción -ns o -bp al generar la imagen con mandelsteg, habrá que utilizarlas con gifextract para extraer los datos correctamente.

También podemos utilizar la opción -a, que nos indicará el porcentaje de unos y ceros que hay en la imagen. ¿Para que sirve esto? Pues bien, en una imagen normal de un fractal de Mandelbrot, hay cerca de un 55% de bits 1, y un 45% de bits cero. Una imagen que contenga datos tenderá más al 50%-50%. Esto puede evitarse con una valor alto con la opción -bp y una imagen en la que "sobre sitio". Por último, tenemos esta opción -a de gifextract para comprobar el resultado.

Ejemplos

gifextract -b 4 < imagen.gif > datos.txt

Extrae los datos almacenados en el bit 4 de los pixels de imagen.gif y los guarda en datos.txt

gifextract -a -b 3 imagen.gif

Analiza el porcentaje de unos y ceros en los bits tres de cada pixel de imagen.gif.

gifextract -b 0 -bp 23 -ns imagen.gif > datos.txt


Extrae los datos de imagen.gif. fractal que fue generado con las opciones -b 0, -ns y -bp 23.



Cuestiones de seguridad

La pregunta es: ¿es seguro el uso de Mandelsteg? Pues la realidad es que no (pero... ¡esperad, leed primero las razones y después encontraréis la solución! :-) ). Las razones:
  • La ya mencionada sobre el porcentaje de bits 1 y 0.
  • Si averiguan las coordenadas y el tamaño de las áreas que hemos usado, se podrá generar la imagen real, sin datos, y comprobar si sale igual a la que contiene datos (así que nunca uséis dos veces los mismos parámetros).
  • Y como gifextract no tiene ningún tipo de protección y no hay demasiadas combinaciones con -b, -bp y -ns, no llevará mucho tiempo extraer los datos.


¿La solución? Encriptar los datos con PGP, utilizar el programa Stealth para eliminar toda cabecera que los identifique como datos encriptados con PGP, y sólo entonces utilizar Mandelsteg. Esto empieza a complicarse, pero no os preocupéis, que al final de esta página hay todo un "caso práctico" desarrollado.



Stealth


Stealth es un programa que también ha sido escrito por Henry Hastur y que como Mandelsteg puede distribuirse libremente. Permite eliminar las cabeceras de los archivos encriptados por PGP que los identifican como tales, o volver a añadirlas.

Stealth no puede utilizarse con la versión 5.0 de PGP, sólo con las anteriores, las clásicas 2.6. Por otro lado, no se puede utilizar el ASCII armor de PGP, los archivos han de ser binarios. Los archivos pueden llevar firma, pero sólo pueden ser encriptados para un destinatario. Asimismo, Stealth da problemas con claves públicas de tamaño 8*n+1 u 8*n+2 (como 513 o 1026). Afortunadamente, este problema puede detectarlo Stealth y nos avisará al intentar eliminar cabeceras.

Stealth necesita localizar el archivo pubring.pgp para trabajar. Para ello, primero mira en el directorio que indica la variable $PGPPATH, y si no, en su directorio.

Stealth toma su entrada de la entrada standard, y escribe en la salida standard (así que atentos a las redirecciones), y si no se le pasan parámetros, realiza su acción por defecto: quitar las cabeceras PGP del archivo de entrada y escribir un nuevo archivo sin esas cabeceras.

Para realizar otras acciones, tenemos los siguientes parámetros:

-v: El típico parámetro "verbose".

-c: indica a Stealth que el archivo de entrada fue encriptado con criptografía convencional (algoritmo IDEA), en vez de utilizar claves públicas.

-a: utilizado para añadir cabeceras. Ha de ir seguido de una cadena que identifique a la clave cuya cabecera PGP hay que añadir al archivo de entrada. Esto puede hacerse como en PGP con el nombre del propietario de la clave, o con el key id que proporciona la opción -kv de PGP precedido de 0x.

Ejemplos

stealth < mensaje.pgp > mensaje.stl

Elimina las cabeceras PGP del archivo mensaje.pgp y genera el archivo mensaje.stl.

stealth -c < mensaje.pgp > mensaje.stl 

Igual que el ejemplo anterior, sólo que en este caso mensaje.pgp ha sido encriptado con IDEA y no con claves públicas.

stealth -a "José Pérez" < mensaje.stl > mensaje.pgp 

Añade al archivo mensaje.stl las cabeceras PGP de la clave cuyo propietario es José Pérez.

stealth -a 0x21ffac < mensaje.stl > mensaje.pgp 

Añade al archivo mensaje.stl las cabeceras de la clave cuyo key id es 21ffac.

stealth -ac < mensaje.stl > mensaje.pgp 


Añade cabeceras al archivo mensaje.stl que fue encriptado con IDEA.



PGP+Stealth+Mandelsteg: ejemplo de uso.


Supongamos que Pepe y Manolo (nuestros socorridos sujetos de experimentación :-) ) desean comunicarse de una forma segura. Para ello, llevan tiempo empleando PGP, pero hace poco la empresa en la que trabajan ha empezado a sospechar de este uso de PGP y ha prohibido su uso. Para solucionar este problema, van a incorporar Stealth y Mandelsteg a su sistema de comunicaciones. Previamente se han puesto de acuerdo en si van a utilizar los parámetros -b, -bp y -ns de Mandelsteg (y como son auténticos "profesionales", mantienen sus copias de PGP, Stealth y Mandelsteg en sitios seguros, y llevan tiempo mostrando público interés en la Matemática del Caos y los fractales... ;-D ).

Así pues, cuando Pepe quiere mandar un mensaje de forma segura a Manolo, primero lo encripta con PGP como habitualmente, utilizando la clave pública de Manolo. Posteriormente, utiliza Stealth para eliminar la cabecera PGP, oculta el archivo resultante en una imagen de un fractal utilizando Mandelsteg, y envía esta imagen a Manolo.

Manolo simplemente tiene que invertir el proceso. Extrae los datos contenidos en la imagen, con Stealth añade la cabecera PGP correspondiente a su clave pública (siendo él el destinatario, es evidente que ha de añadir esa cabecera), y desencripta el mensaje.

No hay comentarios :