Criptografía, Robótica, Linux, como afectan a nuestra vida la tecnología y más.

27 ene 2011

Ocultar mensaje en una imagen: Esteganografia

1/27/2011 Posted by Unknown 1 comment
La Esteganografía es la disciplina que estudia las técnicas para ocultar mensajes pero a diferencia de la criptografía trata de ocultar la información dentro de otros objetos que parezcan inocuos como texto, imágenes, audio o incluso vídeo sin que al reproducir ese medio se pueda apreciar nada.

Aunque se suele confundir con la criptografía son dos cosas totalmente diferentes, incluso puede aplicarse juntas si ocultamos un mensaje cifrado, la esteganografia trata de ocultar un objeto o mensaje al que lo observa, en cambio la criptografía intenta que aunque se conozca de su existencia no seamos capaces de obtenerlo.

La parte teórica

Aunque hay muchas técnicas dentro de esta materia nos centraremos en la conocida como LSB (Least Significant Bit) que consiste en, sabiendo la representación que tiene un píxel en una imagen, modificar el bit menos significativo o de menor peso para esconder el mensaje.

Para utilizar este método tenemos que saber como está codificado un píxel en una imagen y aquí tenemos un problema ya que eso depende de su formato y de su calidad, si estas cambian la forma de esconder el mensaje también cambiará.

Aquí nos centraremos en los archivos .bmp que tienen 256 colores, es un formato sin perdidas (al comprimir no se pierden píxeles) y cada color está representado en dos bytes, normalmente, en la cabecera podremos comprobarlo realmente. Cuando tratemos el fichero tendremos que tener en cuenta la cabecera para no modificarla en el fichero destino. La cabecera del fichero nos interesa ya que no debemos modificarla, seria la siguiente:


offset

size

description

0

2

signature, must be 4D42 hex

2

4

size of BMP file in bytes (unreliable)

6

2

reserved, must be zero

8

2

reserved, must be zero

10

4

offset to start of image data in bytes

14

4

size of BITMAPINFOHEADER structure, must be 40

18

4

image width in pixels

22

4

image height in pixels

26

2

number of planes in the image, must be 1

28

2

number of bits per pixel (1, 4, 8, or 24)

30

4

compression type (0=none, 1=RLE-8, 2=RLE-4)

34

4

size of image data in bytes (including padding)

38

4

horizontal resolution in pixels per meter (unreliable)

42

4

vertical resolution in pixels per meter (unreliable)

46

4

number of colors in image, or zero

50

4

number of important colors, or zero



Un ejemplo:
Si queremos esconder el carácter 'A' que en ASCII tiene codificación como
(0110) (0001) en binario o 0x41 en hexadecimal. Teniendo una imagen así totalmente inventada:

(0110) (1111) , (0110) (1111) , (0110) (1111) , (0110) (1111),
(0110) (1111) , (0110) (1111) , (0110) (1111) , (0110) (1111).

Obtendríamos:

(0110) (1110) , (0110) (1111) , (0110) (1111) , (0110) (1110),
(0110) (1110) , (0110) (1110) , (0110) (1110) , (0110) (1111).

Esto aplicado a toda la imagen y copiando en el fichero de salida todo lo que no modificamos obtendríamos un fichero igual que el de entrada donde hemos modificado algunos píxeles inapreciable para el ojo humano.

En proximas entregas!

Para acabar de rematar el tema, y como de momento los humanos no tenemos la habilidad para modificar píxeles a voluntad, escribiremos un pequeño programa en C++ que introduzca un String en una imagen con formato .bmp.

Enlaces de interés:

http://www.fastgraph.com/help/bmp_header_format.html

http://en.wikipedia.org/wiki/Bitmap