lunes, mayo 21, 2007

Estaganografía

En el post de hoy voy a contaros en que consiste la esteganografía, y veremos algún ejemplo en linux. La esteganografía es una rama de la criptología que estudia la ocultación de mensajes sin que, al contrario que en la criptografía, se sepa de la existencia de dicho mensaje. Por ejemplo, mediante técnicas criptográficas se puede convertir un mensaje de texto en una cadena de caracteres ininteligibles, pero si ese mensaje cifrado pasa por manos ajenas podría saber que ahí hay un mensaje escondido. En cambio mediante esteganografía no se sabría de la existencia de dicho mensaje, por ejemplo podría ser guardado en una imagen sin que se note ningún cambio en ésta, por lo tanto si una persona viera esa imagen no sabría que oculta un mensaje, sin embargo la persona adecuada si.

Mediante esteganografía podemos ocultar un mensaje en una imagen, en un vídeo, en un fichero de audio y en otros archivos. El mensaje oculto, quien dice mensaje dice cualquier archivo, puede estar simplemente escondido en otro, sin cifrar, de manera que si a alguien le da por probar podría extraerlo con facilidad, o bien puede estar cifrado, de forma que si alguien detectara la existencia de dicho mensaje no podría obtenerlo, precisamente porque está cifrado. Se puede cifrar con diferentes algoritmos, según el programa que utilicemos podremos emplear uno u otro. Para cifrarlo nos pedirá una clave, que será la clave de cifrado y descifrado, ya que la mayoría de los programas usan algoritmos de cifrado simétricos, uno muy utilizado es el AES.

Bueno yo creo que ya con eso sabéis que es lo que es, y usos seguro que se os ocurren mas de uno, yo para que veáis hasta que punto pasa desapercibido os diré un caso real, se trata de Al Qaeda, en ordenadores de personas relacionadas con atentados de esta organización se encontraron imágenes pornográficas que contenían datos ocultos, esteganografiados. Un uso que se me ocurre a mi podría ser para colgar fotos en Flickr que contuvieran datos cifrados, así tu tienes un album de fotos y tu contacto otro y os comunicáis a través de esas fotos que pasan desapercibidas a ojos de todo el mundo.

Bueno ahora si, vamos a pasar a la práctica, vamos a ver un ejemplo de como ocultar un archivo en una imagen jpg desde linux. Cambien existen herramientas para Windows, pero yo no las conozco, de todas formas en los links que os pondré al final aparecen muchas herramientas, seguro que os servirá alguna. En linux vamos a ver como hacerlo utilizando el programa steghide, comencemos pues:

Utilizaremos esta imagen de Tux, la mascota de linux :-) clic para ver el original:



Y el archivo que vamos a utilizar es un txt llamado secreto y que contiene la URL de mi blog: http://neobius.blogspot.com:

$cat secreto.txt
http://neobius.blogspot.com

Ahora vamos a usar ya el paquete steghide. Lo usaremos de la siguiente manera para esconder un fichero en otro:

steghide embed -ef archivo_a_ocultar -cf archivo_donde_ocultarlo -sf archivo_final

El parámetro -sf es opcional, si no lo ponemos simplemente el archivo se ocultara el original especificado con -cf. Por cierto después de ejecutar eso nos pedirá una contraseña que será la misma que necesitaremos para poder extraer después el archivo ocultado.

Para extraer un archivo tenemos que ejecutar esto otro:

steghide extract -sf archivo

Donde -sf es para especificar el archivo que contiene los datos ocultados. Nos pedirá la misma contraseña que pusimos cuando lo creamos, si la introducimos correctamente podremos extraer el archivo oculto, así de sencillo.

Ahora si vamos ya con un ejemplo real. Situación, tenemos una imagen de Tux, llamada tux.jpg y un fichero que queremos ocultar llamado secreto.txt, ademas queremos que el archivo final, es decir el dibujo con el archivo oculto, se llame stegano.jpg. Ejecutamos:

steghide embed -ef secreto.txt -cf tux.jpg -sf stegano.jpg

Ahora tenemos ya un archivo, stegano.jpg que contiene el archivo secreto.txt, es este (clic para ver el original):



Para extraer el archivo ejecutaríamos:

steghide extract -sf stegano.jpg

Lo podéis comprobar vosotros mismos, la contraseña para extraer el fichero es linux, eso si, si lo haceis darle un clic a la foto y luego descargarla, porque la que aparece aqui en el post directamente es una redimensionada por blogger.

Hay otra opción también interesante que es la opción info, veamos para que sirve:

$ steghide info stegano.jpg
"stegano.jpg":
formato: jpeg
capacidad: 885,0 Byte
¿Intenta informarse sobre los datos adjuntos? (s/n) s
Anotar salvoconducto:
archivo adjunto "secreto.txt":
tamaño: 28,0 Byte
encriptado: rijndael-128, cbc
compactado: si

Nos muestra la información sobre un fichero y si le proporcionamos la contraseña adecuada también sobre el archivo que contenga. Un dato de interés es que nos dice también la cantidad de datos que podemos adherir al jpg, nos dice que son 885 bytes, pero entonces alguien puede explicarme esto?

$ steghide info stegano.jpg
"stegano.jpg":
formato: jpeg
capacidad: 885,0 Byte
¿Intenta informarse sobre los datos adjuntos? (s/n) s
Anotar salvoconducto:
archivo adjunto "secret":
tamaño: 886,0 Byte
encriptado: rijndael-128, cbc
compactado: si

El tamaño del archivo contenido es mayor que el tamaño que puede hospedar el archivo continente, que ha pasado? pues muy sencillo, los archivos también se guardan comprimidos, se puede especificar el grado de compresión, asi como optar por no comprimirlo. Para que no se comprima se usaría la opción -Z y para especificar el grado de compresión -z level donde level es un número del 1 al 9, el nueve es la mayor compresión.

Bueno como ya está bien, quizá otro día os escriba algo mas sobre otros programas y utilidades. Posiblemente pronto una segunda parte.

Ahora unos links con programas y mas información, en el último enlace y en la Wikipedia en inglés podéis encontrar otras herramientas:

http://en.wikipedia.org/Steganography
http://es.wikipedia.org/Estaganografía
http://www.jjtc.com/Steganography/toolmatrix.htm

Saludos ;-)