# Tecnologías multimedia e interacción/Curso 2015-2016: Caso 2
## Presentación

https://drive.google.com/open?id=0B25URHn5C174NDg1Ym85VW9EeGc

## Esteganografía

Vamos a elaborar un proyecto de esteganografía, esto es, ocultar información en ficheros. Estos ficheros podrán ser ficheros de imágenes, audio o video.
¿Cómo funciona la esteganografía?
El funcionamiento es sencillo.
* Primero debemos encontrar un "portador" donde ocultar el mensaje que queremos enviar.
* Luego utilizamos una estego-función (un algoritmo de ocultación) para ocultar el mensaje en el portador. En este paso también se puede añadir una estego-clave para aumentar la seguridad del envío.
* Una vez aplicada la estego-función obtendremos el estego-objeto, el cual podremos enviar por un canal inseguro.
* Cuando recibamos el estego-objeto deberemos utilizar la estego-función inversa (con la estego-clave en caso de que la tuviera) para obtener el mensaje original.

## Desarrollo del proyecto

Este apartado se irá rellenando en forma de "Cuaderno de actividades" en donde se podrá visualizar el avance del proyecto. Es también una visualización de las decisiones tomadas por el grupo.
Al comienzo del curso realizamos una presentación explicando las posibilidades de la Esteganografía al profesor. Para todos aquellos que deseen verla pueden hacerlo en el siguiente enlace de Google Drive:
https://docs.google.com/a/ucm.es/presentation/d/1MyCt4HME59IvR6M37QhI9rJCLWhgmllEmnGW0Houpv8/edit?usp=sharing
En cualquier caso nuestro proyecto se centrará en el desarrollo de una aplicación capaz de ocultar información en imágenes. Para ello comenzaremos estudiando los distintos formatos de imágenes más frecuentes en Internet:
* JPG, Tras estudiar largamente este formato de imagen decidimos no utilizarlo como estego-objeto
* BMP
* PNG
* GIF, Tras estudiar largamente este formato de imagen decidimos no utilizarlo como estego-objeto
Para ocultar información en estos formatos es necesario el desarrollo de un algoritmo capaz de modificar la imagen original de forma imperceptible por el ojo humano. Para comenzar crearemos una implementación propia del LSB (Least Significant Bit)
Se puede ocultar cualquier tipo de información que queramos en las imágenes. En nuestro caso comenzamos con la ocultación de texto plano. Esto se hará únicamente para comprobar el buen funcionamiento del algoritmo en cuestión. Posteriormente se procede a ocultar la información directamente como un array de palabras (byte). Con esto podremos ocultar no solo texto plano sino cualquier otro tipo de ficheros (documentos, otras imágenes etc)
Hemos incluido un formato de encriptación (AES). Una vez que obtenemos el archivo que queremos ocultar y lo transformamos en un array de bytes aplicamos sobre él un algoritmo de crifrado (Chipher) generando claves mediante una password introducida por el usuario. Esto provocará un nuevo array con las mismas dimensiones pero indescifrable sin la contraseña. Ahora ocultaremos este mismo array cifrado que añadirá más protección a la información enviada.
En cuanto a la implementación, la Figura 1 muestra el diagrama de clases que hemos diseñado. Éste ha sido orientado a facilitar lo máximo posible la integración de nuevos algoritmos de esteganografía. Simplemente habría que añadir la nueva clase y hacer que implemente los métodos de la interfaz StegoAlgorithm.

## Formatos de imagen

Bitmap Image File .BMP
Formato de imágenes especialmente usado por Microsoft en Windows y otros Sistemas Operativos. Sus características lo hacen especialmente sencillo a la hora de analizar la imagen y ocultar información.
En la cabecera de este tipo de ficheros podremos encontrar el Ancho y el Alto de la imagen así como los píxeles y su compresión (por lo general, ninguna). Después de la cabecera se encuentra una matriz de AnchoXAlto píxeles donde la posición (0,0) se encuentra en la esquina inferior izquierda de la imagen, creciendo en las x's sobre el ancho y en las y's sobre el alto.
Joint Photographic Experts Group .JPEG o .JPG
Es el formato de imágenes más frecuente en Internet debido a su escaso tamaño en relación a la imagen presentada.
Una imagen está compuesta de píxeles. Cada píxel esta compuesto de 3 componentes Rojo, Verde y Azul (RGB). Estas componentes se representan como números dentro del rango [0,255] por lo que cada componente necesita 1 byte (8bits) para ser representada, en total 3 bytes por píxel. Esto nos dejaría, por ejemplo en una imagen de 100 píxeles con un tamaño de 300 bytes, sin contar con cabeceras y final de fichero. Sin embargo en jpg el algoritmo de compresión aplicado a la matriz de imagen reducirá drásticamente su tamaño final.
Jpeg reúne bloques de píxeles de 8x8 y tranforma su matriz RGB en una matriz de luminosidad, gama cromática b y r (Y, Cb, Cr). Para posteriormente utilizar un función especifica que cambiará la luminosidad de ciertos píxeles para posteriormente ordenarlos en zig zag desde la esquina superior izquierda hasta la esquina inferior derecha. Para una comprensión matemática y profunda de dicho algoritmo se aconseja visitar la wiki de JPEG al efecto en las referencias.
Portable Network Graphics .PNG
Creado para intentar reemplazar a .gif es un formato no patentado capaz de almacenar imágenes sin algoritmo de compresión (como jpg) en mapas de bits (.bmp). Este formato de imagen permite una mayor profundidad de contrastes. También permite almacenar una gran cantidad de metadatos; fondo por defecto, paleta de color, balance de blancos, gammas etc.
Las imágenes de tipo png tienen unas secciones principales:
* IHDR, debe ser la primera sección, contiene la cabecera.
* PLTE, contiene la paleta (lista de colores).
* IDAT, contiene la imagen que debe ser dividida en múltiples secciones IDAT, haciendo esto se incrementa el tamaño de la imagen ligeramente
* IEND, marca el final de la imagen.
Para nuestro enfoque de trabajo nos interesa los IDAT, las secciones que representan la matriz de color no comprimido de la imagen.
Graphics Interchange Format .gif
Es un formato propio de animación (leer https://es.wikiversity.org/wiki/Formatos_y_procesamiento_de_animaci%C3%B3n). Esto quiere decir que no es un formato de imagen propiamente dicho. Consiste en una sucesión de imágenes separadas por un time-lapse y mostradas en bucle una y otra vez. Este formato de animación no tiene pérdida de calidad como el jpg sin embargo las imágenes solo pueden representar una paleta de 256 colores. Esto quiere decir que el bitmap (la matriz de colores) sobre la que realizamos el estego-algoritmo no es aplicable ya que nosotros trabajamos con una profundidad de 256 en cada componente de color (256*256*256).

## Algoritmos de ocultación

Least Significant Bit (LSB)
Es el algoritmo más simple de esteganografía. Consiste en cambiar el bit menos significativo de ciertos píxeles de la imagen. Al reunir todos los píxeles modificados obtendremos el mensaje oculto.
En nuestra primera implementación hemos cambiado el bit menos significativo de la componente roja en una imagen con formato BMP. Con esto ocultamos un mensaje de forma que el ojo humano no sea capaz de apreciar la diferencia entre una imagen y otra
Mensaje: Hello world, stegojava is here! Be ready for me!
Las imágenes .bmp no pueden ser subidas a las wikis así que os las compartimos a través de Google Drive.
https://drive.google.com/open?id=0B25URHn5C174U3ZBRFIwNmlJLWM
Este algoritmo tan solo codificaba utilizando la componente roja de los píxeles. En la siguiente carpeta los mensajes van codificados en las 3 componentes del píxel, lo cual amplia el tamaño del fichero a codificar.
Codificamos un texto.txt dentro de img.bmp => img.bmp_secret_TXT.bmp => Lo recuperamos en DecodedFile_TXT.txt
Codificamos una imagen imagen.bmp dentro de img.bmp => img.bmp_secret_BMP.bmp => La recuperamos en DecodedFile_BMP.bmp
https://drive.google.com/folderview?id=0B25URHn5C174TkhiamJPMEhKUmc&usp=sharing
Para ampliar se seguridad y hacer los datos ocultos más robustos se utiliza un algoritmo de encriptación sobre los mismos. De esta forma no solo la distribución de la información es inconsistente sino que además la reunificación de la información produce un archivo ilegible.

## Conclusiones

-- Cuando se presente --

## Glosario

* Objeto contenedor: se trata de la entidad que se emplea para portar el mensaje oculto. En nuestro caso imágenes.
* Estego-objeto: se trata del objeto contenedor más el mensaje encubierto. En nuestro caso, otra imagen.
* Estego-Función: operación que se realiza sobre el objeto contenedor para ocultar la información y formar así el estego-objeto.
* Estego-Función inversa: operación que se realiza sobre el estego-objeto para obtener la información oculta.
* Estego-Clave: llave o parámetro necesario para la s estego-funciones con el fin de ocultar/descifrar la información. Semejante a criptografía.
* Estegoanálisis: disciplina que estudia la detección (ataques pasivos) y/o anulación (ataques activos) de información oculta en distintos portadores, así como la posibilidad de localizar la información útil dentro de los mismos (existencia y tamaño).