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
bytesKernelfloor((tamKernel^2)/9);
maxBytescalcularMaxCaracteres(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 i0; i<=N – tamKernel AND NOT Final; i=i+tamKernel DO
FOR j0; j<=M –tamKernel AND NOT Final; j=j+tamKernel DO
copiarAKernels(imagen, kernels, i, j, tamKernel);
FOR c0; c<3 AND NOT Final ; c++ DO
limpiarBits(bits, 9 x bytesKernel);
FOR b0; b<bytesKernel; b++ DO
IF post <= lenText THEN
cartexto[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
bytesKernelfloor((tamKernel^2)/9);
kernels[3] crearTresMatrices de (tamKernel x tamKernel);
bits[9* bytesKernel]
Final=false;
FOR i0; i<=N – tamKernel AND NOT Final; i=i+tamKernel DO
FOR j0; j<=M –tamKernel AND NOT Final; j=j+tamKernel DO
copiarAKernels(imagen, kernels, i, j, tamKernel);
FOR c0; c<3 AND NOT Final ; c++ DO
sacarBistDeKernel(kernel[c], bits, tamKernel);
FOR b0; b<bytesKernel; b++ DO
carconvertirACaracter(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
Valorkernel[i, j];
IF bit==1 THEN
valorvalor + mod(valor+1,2);
ELSE
valorvalor + mod(valor,2);
END IF
IF valor>255 THEN
valorvalor - 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.