Download Esteganografía En Imágenes Basado En Mascaras de Convolución
Document related concepts
no text concepts found
Transcript
Esteganografía En Imágenes Basado En Mascaras de Convolución Espacial Universidad Nacional de Trujillo Resumen La Esteganografía toma su mayor auge a partir de la aparición de los ordenadores. En el caso de imágenes y sonido la idea central es pasar a binario los datos originales y sobre estos aplicar las múltiples técnicas esteganográficas para ocultar nuestra información. Las técnicas clásicas toman los datos de forma lineal (secuencialmente), en este documento nosotros proponemos que los datos sean tomados en forma de pequeños kernels (matrices) y sobre este bloque de datos aplicar las técnicas clásicas. Los resultados son bastantes fiables ya que incorporamos una capa previa mucho más compleja que la lineal, permitiendo múltiples configuraciones para el usuario. Palabras Claves: Esteganografía, ocultación, kernel, matriz, binario, seguridad. 1. Introducción Son Pocas las publicaciones que podemos encontrar en internet sobre Esteganografía, pero sin embargo ha sido aplicado desde siglos antes, en diversas técnicas, y hoy en día muestra su mayor auge gracias a la computación, y a la aparición del internet. Es mucha la información que vemos pasar por nuestros ordenadores, la pregunta es ¿Toda esa información es analizada y captada en su totalidad?, ¿La información es original o se ha introducido cierto ruido?; son preguntas que en su mayoría la respuesta es No, por lo tanto es posible alterar la información original, introduciendo información personalizada, sin que el receptor pueda distinguirlo. Esto se logra con la Esteganografía. En el presente documento daremos a conocer conceptos claves de la Esteganografía, luego explicaremos en qué consiste la técnica lineal en imágenes, para después explicar a detalle la nueva propuesta basada en kernels; mostraremos también algunos resultados obtenidos y discutiremos sobre los mismos. 2. Esteganografía Proviene del griego: steganos encubierto -con el sentido de oculto. graphos escritura. Que traducido es “El arte de escribir en forma oculta” [1]. Mediante la Esteganografía podemos hacer que la información pase inadvertida, pero la seguridad para datos muy importantes no es mucha. La Esteganografía y la Criptografía están muy relacionadas, pero son técnicas diferentes, mientras que la primera oculta información sobre la original pasando inadvertida, la segunda altera la información original para hacerla ininteligible. En un sistema de seguridad se puede utilizar la combinación de ambas técnicas para aumentar su complejidad. 2.1. Métodos Métodos Clásicos: La historia nos relata que durante siglos a los esclavos se les tatuaba un mensaje en la cabeza afeitada y luego se le dejaba crecer el pelo y enviar así el mensaje oculto. En la antigua Grecia los mensajes se escribían en tablas y luego se les pasaba con cera para pasar inadvertidos. Tinta Invisible: En una carta normal se escribe entre líneas el texto importante con cualquier tinte químico especial, luego para desocultar el texto solo se acerca la carta al fuego para que se note el texto enviado. Bits no significativos: Acercándonos mas a la actualidad, con la ayuda del ordenador podemos ocultar información en los bits no significativos de un byte, este es el método que ahora se utiliza en el caso de imágenes y sonido. [2] 2.2. Bases de la Esteganografía Death Master indica en su publicación [1], 4 reglas básicas para esteganografiar: 1. Toda información (texto ASCII, hexadecimal, código morse...) que queramos introducir, debe ser primero convertida a binario. Si bien cualquier base numérica es válida, la comodidad trabajando con binario es mucho mayor. 2. Nunca hay que permitir que un supuesto atacante obtenga el fichero original (anterior a la modificación), pues permitiría, mediante comparación, establecer pautas de cambios en la información. Esto podría llevar en última instancia a desentrañar el mensaje oculto. 3. Las cabeceras de los ficheros -salvo excepciones- NO deben ser modificadas. 4. No transmitir la clave o algoritmo esteganográfico por un medio inseguro. que hacemos es tomar los pixeles necesarios, separar cada pixel en sus tres capas en RGB obteniendo de esta manera 3 valores los cuales convertimos a binario (Figura 2), teniendo los valores originales en bits y la información a ocultar (letra “L”) también en bits, procedemos a aplicar diversas técnicas aritméticas o lógicas entre ambos valores, produciendo un valor nuevo que es el que se enviara al receptor. Como se puede apreciar en la figura 2, debemos asegurarnos que los bits a alterar estén entre los 4 menos significativos, para producir una imagen muy parecida al original. Lo adecuado sería tomar solo el primer bit no significativo para producir la mínima alteración visual en caso de que las imágenes sean de mucha importancia. 2.3. Esteganografía en Imágenes Consiste en ocultar información en imágenes, normalmente se oculta texto y el formato escogido para este fin es Windows Bitmap (BMP) y es el que hemos seleccionado para nuestro fin. El formato BMP está compuesto por una matriz de pixeles que pueden ocupar entre 4, 8, 16, 24 y 32 bits. Nosotros utilizaremos el de 24 bits, ya que nos permite trabajar exactamente con la estructura RGB (Red, Green, Blue), son tres capas de 8 bits cada una. 3. Técnica lineal Denominada así por el orden secuencial de toma los pixeles para su manipulación (Figura 1). Supongamos que tenemos la letra “L” y su código ASCII 76 y su código en binario 1001100. Deseamos ocultarlo en una imagen; lo primero Figura 1: Orden lineal de tomar los pixeles y tomar sus valores en RGB. Figura 2: Tomar los bits no significativos de los valores RGB. 4. Técnica basado en Kernels La mayoría de técnicas esteganográficas en imágenes toman a los pixeles en orden lineal, pero que pasa si en lugar de tomar los pixeles en orden lineal la hacemos dentro de una matriz de n xm. 4.1. Fuente de Inspiración Esta forma de tomar los pixeles se nos ocurrió cuando llevamos el curso de procesamiento de imágenes, específicamente en el tema de Convolución espacial. Esto consiste en partir la imagen en pequeñas matrices (divide y venceras) de dimensión impar, de igual dimensión que una matriz base escogida denominada kernel espacial; generalmente se utiliza para evaluar al pixel central del kernel, por ello es que estas matrices se solapan. Dependiendo la transformación que quisiéramos hacer a la imagen, existen diversas formas de evaluar a los pixeles dentro del kernel. Los pixeles continuos al central se denominan “Vecinos”, si están en dirección vertical y horizontal se denominan: “4 Vecinos” y si están en dirección diagonal: “Vecinos Diagonales” y en conjunto toman el nombre de “8 vecinos”. Figura 3: Dividir la imagen original en matrices de 3x3. Paso 3: Obtener un kernel a evaluar, en este caso lo obtenemos secuencialmente, Y seleccionar un orden para tomar los pixeles dentro del kernel. En la figura 4 muestra una forma de cómo tomar los pixeles, primero toma los 4 vecinos para insertar los bits mas significativos, en los vecinos diagonales los bits menos significativos y el bit de signo lo inserta en la posición central, todo en sentido anti horario. 4.2. Proceso de Ocultación Trabajamos con una imagen en escala de Grises para hacer más simple la explicación. Paso 1: Recorrer todo el texto carácter por carácter, transformándolo a su equivalente en binario. 9 bits en total=1 bit de signo + 8 bits de datos, Bit de signo:1 si es negativo , 0 si es positivo. Ejemplos: Figura 4: Orden para tomar los pixeles de acuerdo a la posición de los bits del carácter tomado (de izquierda a derecha). A =+65. Ñ=-47. El compilador de C++ asigna valores negativos a los símbolos que no están comprendidos entre 0 y 255. Paso 2: Dividir la imagen en kernels de 3x3, a diferencia del método especial, aquí las matrices no se solapan y no se evalúa el pixel central, sino todos los pixeles contenidos dentro de la matriz (Figura 3). Paso 4: Una vez que tenemos el orden, alteramos los pixeles de acuerdo a un patrón establecido (cuadro 1). . Si bit=0 la salida debe ser par. . Si bit = 1 la salida debe ser impar Cuadro 1: Patrón de alteración en la ocultación. Si no corresponde a la condición se suma un bit al resultado como se puede observar con el ejemplo de la figura 5, en donde solo los valores de color rojo han sido modificados a un bit de su valor original. Figura 5: Resultado después de ocultar la letra Ñ en el kernel. Paso 5: Formar la nueva imagen con los kernels transformados, los pixeles que sobraron se pueden utilizar para otros propósitos. 4.3. Proceso de Desocultación Pasos generales: El proceso de desocultación es inverso al proceso de ocultación. Paso 1: Descomponer la Imagen en kernels de 3x3 y aplicar el patrón de alteración a los pixeles (Figura 6). El Orden debe ser el mismo que se uso en el proceso de ocultación, esta es la clave que debe mantenerse privada y el patrón inverso al patrón de ocultación (cuadro 2). . Si es par el bit=0. . Si es impar el bit=1 Cuadro 2: Patrón de alteración en la desocultación. Figura 6: texto resultante después de aplicar la desocultacion. Paso 2: Formar el texto enviado con los caracteres extraídos de los kernels. 4.4. Algoritmo: El algoritmo ha sido diseñado para imágenes en formato BMP de 24 bits de profundidad. El pixel se divide en tres capas RGB. A continuación describimos el algoritmo de ocultación de texto. Algoritmo: OcultarTexto ENTRADA: - imagen: imagen de entrada de dimensión MxN. - texto: texto a ocultar. - terminal: carácter de terminación del texto (para indicar final del texto). - tamKernel: tamaño del kernel (trabajamos con 3x3). SALIDA: - imagenS: imagen con el texto ocultado. INICIO bytesKernelfloor((tamKernel^2)/9); maxBytescalcularMaxCaracteres(bytesKenel, tamKernel); lenText tamañoTexto(texto); IF lenText > maxBytes THEN retonar Error(“ Texto muy grande”); END IF kernels[3] crear tres Matrices de (tamKernel x tamKernel); bits[9* bytesKernel] Final=false; posT=1; FOR i0; i<=N – tamKernel AND NOT Final; i=i+tamKernel DO FOR j0; j<=M –tamKernel AND NOT Final; j=j+tamKernel DO copiarAKernels(imagen, kernels, i, j, tamKernel); FOR c0; c<3 AND NOT Final ; c++ DO limpiarBits(bits, 9 x bytesKernel); FOR b0; b<bytesKernel; b++ DO IF post <= lenText THEN cartexto[posT]; ELSE FINAL true; Car terminal; END IF convertirABits(car, bits, b*9); posT posT + 1; END FOR colocarBistEnKernel(kernel[c], bits, tamKernel); END FOR pegarDesdeKernels(imagenS, kernels, i, j, tamKernel); END FOR END FOR retornar imagenS; FIN Algoritmo: DesocultarTexto ENTRADA: - imagen: imagen de entrada de dimensión MxN. - terminal: carácter de terminación del texto (para indicar final del texto). - tamKernel: tamaño del kernel (trabajamos con 3x3). SALIDA: - texto: texto a desocultar. INICIO bytesKernelfloor((tamKernel^2)/9); kernels[3] crearTresMatrices de (tamKernel x tamKernel); bits[9* bytesKernel] Final=false; FOR i0; i<=N – tamKernel AND NOT Final; i=i+tamKernel DO FOR j0; j<=M –tamKernel AND NOT Final; j=j+tamKernel DO copiarAKernels(imagen, kernels, i, j, tamKernel); FOR c0; c<3 AND NOT Final ; c++ DO sacarBistDeKernel(kernel[c], bits, tamKernel); FOR b0; b<bytesKernel; b++ DO carconvertirACaracter(bits, b*9); IF car != terminal THEN texto texto +car; ELSE Final=true; END IF END FOR END FOR END FOR END FOR retornar texto; FIN Descripción de sub módulos: - calcularMaxCaracteres: calcula el máximo número de caracteres que se pueden admitir según el tamaño de la imagen y el tamaño del kernel. - copiarAKernels: copia los valores de los pixeles de la imagen original a las tres matrices(kernels); en la matriz kernel[0] se copia los valores RED, en la matriz kernel[1] los valores GREEN y en la matriz kernel[2] los valores BLUE de todos los pixeles que empiezan en la posición (i, j) y de dimension (tamKernel x tamKernel); - limpiarBits: inicializa en cero el vector de bits “bits” de tamaño 9*bytesKernel. - convertirABits: convierte el caracter “car” a bits y lo almacena en el vector “bits” a partir de la posición b*9. - colocarBistEnKernel: aquí se insertan los bits desde “bits” en el kernel “kernel[c]”, el orden es elegido por el usuario. - pegarDesdeKernels: copiamos los valores del kernel transformado en la imagen de salida “imagenS” desde la posición (i, j) hasta una dimensión (tamKenel x tamKernel). - sacarBistDeKernel: se extrae desde el kernel los bits correspondientes al carácter, el orden debe ser el mismo que se utilizo para ocultarlos. - convertirACaracter: convierte 9 bits a caracter los valores del vector “bits” desde la posición b*9. Algoritmo: colocarBits (para kernel de 3x3) ENTRADA: - bits: vector de bits. - kernel: matriz a transformar SALIDA: - kernel: matriz con los valores transformados por los bits de entrada. INICIO setParidad(kernel,0,0,bits[6]); setParidad(kernel,0,1,bits[2]); setParidad(kernel,0,2,bits[5]); setParidad(kernel,1,0,bits[3]); setParidad(kernel,1,1,bits[0]);//bit de signo setParidad(kernel,1,2,bits[1]); setParidad(kernel,2,0,bits[7]); setParidad(kernel,2,1,bits[4]); setParidad(kernel,2,2,bits[8]); FIN Algoritmo: setParidad (1: impar, 0: par) ENTRADA: - kernel: matriz a transformar - (i, j): posición del valor a transformar - bit: bit a evaluar SALIDA: - kernel: matriz con el valor de la posición (i,j) transformado por el bit de entrada. INICIO Valorkernel[i, j]; IF bit==1 THEN valorvalor + mod(valor+1,2); ELSE valorvalor + mod(valor,2); END IF IF valor>255 THEN valorvalor - 2; END IF kernel[i, j] valor; En donde H y W son las dimensiones de la imagen. El orden de complejidad para el proceso de desocultación es equivalente. FIN 4.5. Análisis del Algoritmo: Análisis del tiempo de ejecución del algoritmo de ocultación de texto: - Los dos primeras iteraciones en cascada: (H/tamkernel)*(W/tamKernel). - Para copiar los valores de la imagen a los kernels: tamKernel * tamKernel. - Para recorrer las capas RGB: 3. - Al limpiar el vector de bits: 9*bytesKernel - Para convertir cada carácter a bits: bytesKernel. - colocar los bits en el kernel: 9*bytesKernel. - Para pegar desde el kernel a la imagen de salida: tamKernel * tamKernel. El algoritmo es muy rápido pues la imágenes con las que se trabaja no tienden a tener una dimensión muy grande. El rango promedio de las imágenes varía desde 600x600 hasta 1000x1000; 5. Experimentos y resultados Para calcular el total de caracteres se utiliza la siguiente fórmula: En Donde: En la Tabla 1 se muestra algunos resultados al calcular el total de caracteres en 3 imágenes diferentes con kernels de 3x3, 5x5, 6x6, 8x8 y 9x9. . Pero: Tamaño de la Imagen M N 369 563 223 297 900 1200 Entonces: 3x3 69006 21981 360003 Total de Caracteres 5x5 6x6 8x8 49059 68079 67623 15579 21759 20982 259203 360003 352803 9x9 68637 21387 359103 Tabla 1: Total de caracteres como máximo, en 3 dimensiones de imágenes. ) Tiempo de Ejecución: Ejemplo: tomemos a la imagen de la figura 7 de dimensión 20x20 y el texto del cuadro 3 de 108 caracteres. Con un kernel de 3x3 el máximo de caracteres es 111. Orden de Complejidad: Figura 7: Imagen original de 20x20. Esposa querida si muero, aquí te dejo mí número de cuenta: 1002-90326459. Y de la caja fuerte es: 23647666 Cuadro 3: Texto a ocultar Figura 7: Imagen resultante. Total Opciones= 81!*2*2*2 =4.6377*10121. Si tomamos un kernel de 5x5, entonces podemos ocultar solo 2 caracteres=18 bits, en un total de 25 pixeles. El total de Opciones es: Las opciones se reducen a demás que perdemos muchos pixeles, por ello es preferible tomar kernels múltiplos de 9. 6. Discusión de experimentos El máximo de caracteres que se puede ocultar en una imagen depende del tamaño del kernel que se seleccione y de la dimensión de la imagen. En la tabla1 nos podemos dar cuenta que en los kernels 3x3, 6x6 y 9x9 los resultados son más favorables debido a que el total de pixeles de dichos kernels es múltiplo de 9 que el total de bits de un carácter. 3x3=9º, 6x6=9º y 9x9= 9º Pero 5x5=9º+7 y 8x8=9º + 1. Como vemos, Mientras más se desperdicie pixeles en el kernel, el máximo de caracteres se reduce. Por otro lado analicemos cuantas opciones diferentes puede realizar el interceptor para desocultar el verdadero texto de la imagen. Las opciones de configuración son diversas. Por ejemplo: 1. Podemos considerar los bits reales de la imagen o su complemento (2 opciones). 2. Se puede cambiar el patrón de alteración. (2 opciones). 3. Podemos considerar al bit de signo positivo como 0 ó 1 (2 opciones). En un kernel de 3x3 hay 9! Posibles formas de posicionar 9 bits (9! Opciones). Total Opciones= 9!*2*2*2 =2 903 040. Para un kernel de 6x6 Total Opciones= 36!*2*2*2 =2.976*1042. Si tomamos un kernel de 9x9 En la tabla 2 hacemos una comparación con la técnica lineal en cuanto al máximo de caracteres. Aquí nos podemos dar cuenta que el desperdicio es nulo cuando las dimensiones de la imagen es múltiplo de 3. M 369 223 900 N 3x3 Lineal Desperdicio 563 69006 69252 246 297 21981 22080 99 1200 360003 360003 0 Tabla 2: comparación con el método lineal. 7. Conclusiones La principal ventaja sobre la técnica lineal es la gran variedad de opciones de configuración que se puede tomar para hacer más seguro la ocultación. Si el tamaño del kernel utilizado se eleva, también se eleva el total de configuraciones. La complejidad del algoritmo es equivalente a los realizados con el método lineal: O(mn). El usuario puede añadir más complejidad al introducir otras técnicas clásicas como por ejemplo encriptar el texto antes de ocultarlo. Al tomar solo un bit del pixel, permite que la imagen no se vea muy afectado por la alteración. Pero si queremos introducir mucho mas texto, entonces podemos tomar hasta el cuarto bit menos significativo. 8. Referencias [1] Death Master, V.(2004). Introducción a la Esteganografía http://www.death-master.tk/ GNU Free Documentation License. [2] Maurício. Gestão da Segurança da Informação. AULA 06– Critografia e Esteganografia. www.projetoderedes.com.br.