Esteganografía: Ocultando el uso de LSB

Después de haber hablado en varias ocasiones sobre la esteganografia, volvemos al tema ampliando un poco más la técnica de LSB (Ocultando archivos en otros – LSB, Ocultando archivos en otros – LSB II).

Resumidamente, esta técnica consiste en ocultar información en el bit menos significativo de cada uno de los píxeles de una imagen, consiguiendo así que el cambio realizado sea invisible al ojo humano. El problema de esta técnica, es que la información oculta puede obtenerse fácilmente si esta no se ha codificado previamente o si no se sigue un patrón concreto a la hora de ocultarla. Para poder evitar que terceras personas puedan descubrir que una cierta imagen contiene información oculta, podemos utilizar la técnica que se explicará a continuación.

Este método de ocultación de información será útil (idealmente) para ocultar imágenes, de dos colores como máximo, dentro de otras imágenes, siendo necesario la posesión de un token (el cual será otra imagen) por ambas partes de la comunicación para obtener la imagen oculta. A pesar de decir que de forma “ideal” únicamente se pueden ocultar imágenes de dos colores, esto no implica que no se pueda introducir texto en una imagen bicolor, y esconder el resultado ;)

La técnica, básicamente consiste en dos imágenes, dónde una de ellas será una imagen que únicamente debería poseer el emisor y el receptor, y la otra será la imagen que queremos ocultar (la cual tiene que tener unas dimensiones menores o iguales que la imagen portadora).

Una vez se tienen ambas imágenes, se recorrerán todos los píxeles de la imagen a ocultar y si el color RGB del píxel es diferente de 0xFFFFFF (blanco puro), se restará “1” al color del píxel en esa misma posición de la imagen portadora (o se sumará “1” en el caso de que el valor del píxel sea “0”), modificando así únicamente aquellos píxeles cuya posición correspondan a píxeles “pintados” en la imagen a ocultar. De esta forma, para poder obtener la imagen oculta, se irán comparando uno a uno los píxeles de la imagen recibida con los de la imagen original (secreta entre ambas partes) y en aquellos que sean diferentes, será donde se han ocultado los píxeles “pintados” de la imagen a ocultar. Hay que remarcar, que con esta técnica, es posible que no se obtenga exactamente la misma imagen que al principio en el caso de que se usen más de dos colores, ya que en su obtención solo se “pintarán” dos colores (blanco o negro) perdiendo todos aquellos valores intermedios.

Por último, comentar que cuando se ha explicado esta técnica se ha dicho que es “ideal” para imágenes de dos colores, ya que en esos casos será donde menos diferencia visual exista entre la imagen original y la imagen modificada, pero que también se podría utilizar para tener en cuenta 3 o incluso más tonalidades, ya que el ojo humano no es capaz de diferenciar entre todos los valores existentes de color.

Para poder entenderlo todo mejor y verlo con nuestros propios ojos, se han creado dos scripts que se encargarán de ocultar una imagen en otra (Ocultar una imagen) y de obtener la imagen oculta de una imagen en base al token establecido (Obtener imagen oculta).

Suponiendo que tenemos la imagen1.png funcionando como token, y queremos ocultar la imagen2.png, deberemos realizar lo siguiente:

php ocultar.php png png imagen1.png imagen2.png imagen3.png

Obteniendo así una nueva imagen (imagen3.png) completamente “igual” a la anterior, pero con la imagen2.png oculta en su interior. Cuando la otra persona reciba la imagen3.png, podrá obtener su imagen oculta ejecutando el segundo script de la siguiente forma (donde OBLIGATORIAMENTE deberá indicar la imagen utilizada como token):

php obtener.php imagen1.png imagen3.png imagen4.png

Para aclarar un poco más el ejemplo dado, se mostraran las diferentes imágenes que se han utilizado a lo largo del proceso:

Imagen 1: Imagen en la cual se ocultará la segunda imagen. Podríamos decir que esta imagen funcionaría como password, ya que únicamente la deberían poseer las dos partes de la comunicación.

Imagen 2: Imagen que queremos enviar a la otra parte de forma secreta y que ocultaremos en la imagen 1.

Imagen aux: Superponiendo ambas imágenes, podríamos ver cuales serán los píxeles que se modificarán en la imagen original (imagen1.png) al ocultar la imagen 2.

Imagen 3: Esta será la imagen que deberemos enviar a la otra persona y que contendrá la imagen 2 oculta en ella, sin que nadie más pueda obtenerla sin poseer la imagen 1.

Como se puede observar, no se aprecia ninguna diferencia entre la imagen1.png y la imagen3.png, pero si las comparamos, vemos como son archivos diferentes.

Imagen 4: Está será la imagen que obtendrá el receptor cuando la extraiga de la imagen 3. Como se ve, a pesar de que “pierde” calidad, el mensaje oculto puede leerse perfectamente.

Con este ejemplo, hemos podido comprobar como modificando algunas de las técnicas básicas de esteganografía, se pueden obtener resultados bastante más seguros y potentes para ocultar información secreta sin dar indicios de que existe información oculta en nuestros archivos ;)