Hace ya unos meses me reuní con mi viejo amigo Leo, de por allá cuando estábamos trabajando juntos en la FC. Tenia mucho tiempo de no verlo y después de ponernos al tanto de nuestras vidas y de empezar a platicar de diversas cuestiones (OVNIS, terremotos, teoría de la conspiración, la nueva versión de Ubuntu, de CC y de matemáticas), al final me comento de un truco muy simple que conocía para ocultar mensajes en las imágenes.
Pasaron unos días y comente con otro amigo (Lalo Lemus) el truco de mi amigo Leo y me comento que era una forma muy primitiva de una área de las Ciencias de la computación conocida como Esteganografía (siempre me ha sorprendido la cantidad de cultura general de computólogo que posee Lalo).
La esteganografía es la rama de las ciencias de la computación que estudia la manera de transmitir mensajes ocultos embebidos en mensajes. Aquí hago un paréntesis, ya se que están pensando que eso es la criptografia, pero no, aunque son cosas muy parecidas la criptografía y la estagnografía son cosas diferentes.
Mientras que la criptografía estudia como cifrar mensajes para que cuando alguien los intercepte no sea capaz de entenderlos, la esteganografia estudia como oculta el mismo hecho de que un mensaje existe.
Vamos para la cirpto se asume que el enemigo conoce que se va a atransmitir un mensaje, y que ademas el enemigo va a interceptar el mensaje. Solo que el mensaje viene en clave y no va a poder entender su contenido (esta cifrado).
En el caso de la esteganografia, el enemigo se da cuenta que hay un intercambio de información. Pero no sabe que en la información; aparentemente inocente, hay un mensaje oculto.
Desde los tiempo de Herodoto (padre de la historia) hay indicios de esteganografía. Pues se describe una situación donde un general escribió un aviso donde prevenía de un ataque de los griegos en una tableta de madera, y después la encero y escribió otro mensaje sobre la cera (en esos tiempo era común mandar correspondencia en tabletas enceradas).
Herodoto también describe otro caso mas hardcore en donde le rapan la cabeza a un esclavo y le tatuan un mensaje, luego esperan a que el cabello del esclavo vuelva a crecer y lo mandan (sin conocimiento del mensaje) con el receptor.
En la esteganografia moderna se trata de esconder archivos dentro de otros archivos (de apariencia inocente) por ejemplo imágenes, musica o vídeos. Una de la técnicas mas comunes es la de modificar el LSB (Bit menos significativo) en los datos de algún archivo (por ejemplo los píxeles de una imagen). De esta manera la imagen no cambia mucho (no es perceptible al ojo humano y tiene un mensaje oculto entre sus píxeles.
Una buena esteganografia, debe cumplir con:
- El archivo no sea sospechoso.
- Un usuario normal no debe notar el cambio entre un archivo común y un archivo con un mensaje oculto
- El tamaño del archivo no debe variar.
Como la mayoría de las buenas técnicas de esteganografia requieren un cierto conocimiento de teoría de la información y de programación, por lo que la mayoría de los usuarios mortales no podemos usarlas tan fácil.
Aquí es donde se vuelve valioso el truco de mi amigo Leo
Esteganografía para principiantes
Este truco no es una buena esteganografia, pues no cumple con los requisitos arriba expuestos. pero digamos que tiene la enorme ventaja que no requiere nada mas que el ambiente estándar de usuario (sin conocimientos de programación) y en un sistema operativo decente sin ser nada del otro mundo (vamos con cualquier GNU/Linux – Unix basta).
El truco en cuestión es el siguiente (me dio permiso de escribirlo :p )
cat imagen.jpg mensaje.zip > imagenConMensaje.jpg du -b imagen.jpg tail -c +4012558 imagenConMensaje.jpg > mensajeRecuperado.zip
Expliquemos paso a paso. Se tiene una imagen: imagen.jpg y se quiere ocultar el mensaje contenido en el zip: mensaje.zip. Se le añaden a la imagen los bytes del mensaje al final. Esto forma una nueva imagen (que mide el tamaño de la imagen mas el tamaño del mensaje). Ahora si queremos recuperar el mensaje debemos de saber cual era el tamaño original del mensaje (por eso lo calculamos con du) y extraemos los ultimo bytes de la imagen y les damos forma en un nuevo archivo .zip.
En el caso de mi imagen el tamaño resulto ser 4012558, pero obviamente esa cantidad debe sustituirse con el tamaño de la imagen que ustedes usen (el resultado del comando previo).
¿Por que funciona?
Recordemos que en las imagenes .jpg hay un cabecero y luego vienen los datos y en el cabecero esta guardado el tamaño de la imagen. Al añadir el mensaje al final del archivo con el comando cat, le estamos poniendo bytes al final de los datos sin modificar el cabecero. Por esta razón la nueva imagen con los datos puede ser vista y leída en cualquier SW como si fuera una imagen normal. Aun cuando tiene los datos ocultos.
Si nosotros supiéramos el tamaño de la imagen original, podemos restarle a la imagen modificada ese tamaño (tail) y el resultado deben ser los bytes que contienen el mensaje, como ese era originalmente un zip lo direccionamos en nuevo zip y tendremos el mensaje de vuelta.
Como ejemplo aquí hay una imagen de Emma Watson.
Ahora aquí esta la misma imagen, junto con todos los libros de Narnia escondidos en un zip.
Nótese el cambio de tamaño de la imagen a mas del doble (como ya dijimos esta no es una buena técnica de esteganografía).
Nota Las miniaturas son links a las verdaderas imágenes que usé.
#1 by Carlos Alegría on 2 junio 2011 - 20:19 pm
Hace tiempo que sigo el trabajo de Luis Von Ahn, pionero entre otras cosas, del área de la CC conocida como Human Computation. Según recuerdo, él dice que fué el primero en demostrar matemáticamente la existencia de protocolos esteganográficos para la transmisión de información. Puedes bajar el artículo de aquí: http://www.cs.cmu.edu/~biglou/PSS.pdf
#2 by Carlos Alegría on 2 junio 2011 - 20:39 pm
Por cierto, creo que también es posible hacer esteganografía con criptografía visual (http://en.wikipedia.org/wiki/Visual_cryptography), en donde cada una de las partes del mensaje pueden ser enviadas de forma oculta como ruido en una imagen.
#3 by Etna on 2 junio 2011 - 21:53 pm
Excelente artículo. Welcome back!
#4 by nemediano on 9 junio 2011 - 15:23 pm
Ya le eche un ojo al paper. Me sorprende la cantidad de cosas que se pueden formalizar a partir de la idea de la esteganografía. La robustez se ve como una cosa de locos.
Sobre la esteganografía visual es algo muy padre, me recuerda a las pinturas de cierto arista (se me olvido el nombre y san google no me respondió facil)
Saludos y gracias por los dos comentarios