esteganografía LSB

Érase una vez mi primera publicación en el centro. Y ese post estaba dedicado a un problema muy interesante: la esteganografía. Por supuesto, la solución propuesta en ese viejo tema no puede llamarse esteganografía en el verdadero sentido de la palabra. Es sólo un juego con formatos de archivo, pero de todos modos es un juego bastante interesante.

Hoy intentaremos profundizar un poco más y observar el algoritmo LSB. Si está interesado, es bienvenido en cat. (Debajo del corte está el tráfico: alrededor de un megabyte).

En primer lugar es necesario hacer una breve introducción. Todo el mundo sabe que el objetivo de la criptografía es hacer imposible la lectura de información secreta. Por supuesto, la criptografía tiene sus aplicaciones, pero existe otro enfoque para la protección de datos. No tenemos que cifrar la información, sino hacer como si no la tuviéramos. Precisamente por eso se inventó la esteganografía. Wikipedia nos asegura que la “esteganografía (del griego στεγανοσ - oculto y del griego γραφω - escribo, literalmente “escritura secreta”) es la ciencia de la transmisión oculta de información manteniendo en secreto el hecho mismo de la transmisión.

Por supuesto, nadie prohíbe combinar métodos criptográficos y esteganográficos. Además, en la práctica lo hacen, pero nuestra tarea es comprender los conceptos básicos. Si estudia detenidamente el artículo de Wikipedia, descubrirá que los algoritmos de esteganografía incluyen el llamado. contenedor y mensaje. Un contenedor es cualquier información que ayude a ocultar nuestro mensaje secreto.

En nuestro caso el contenedor será una imagen en formato BMP. Primero, veamos la estructura de este archivo. El archivo se puede dividir en 4 partes: encabezado del archivo, encabezado de la imagen, paleta y la imagen misma. Para nuestros propósitos, sólo necesitamos saber lo que está escrito en el encabezado.

Los primeros dos bytes del encabezado son la firma BM, luego el tamaño del archivo en bytes se escribe en una palabra doble, los siguientes 4 bytes están reservados y deben contener ceros y, finalmente, otra palabra doble contiene el desplazamiento desde el principio del archivo a los bytes reales de la imagen. En un archivo bmp de 24 bits, cada píxel está codificado con tres bytes BGR.

Ahora que sabemos cómo llegar a la imagen, solo queda entender cómo podemos escribir allí la información que necesitamos. Para ello necesitaremos el método LSB. La esencia del método es la siguiente: reemplazamos los bits menos significativos en los bytes responsables de la codificación de colores. Digamos que si el siguiente byte de nuestro mensaje secreto es 11001011, y los bytes de la imagen son...11101100 01001110 01111100 0101100111..., entonces la codificación se verá así. Dividiremos el byte del mensaje secreto en 4 partes de dos bits: 11, 00, 10, 11 y reemplazaremos los bits de orden inferior de la imagen con los fragmentos resultantes: ...11101111 01001100 01111110 0101100111…. Un reemplazo de este tipo generalmente no es perceptible para el ojo humano. Además, muchos dispositivos de salida más antiguos ni siquiera podrán mostrar cambios tan pequeños.

Está claro que puedes cambiar no sólo los 2 bits menos significativos, sino cualquier número de ellos. Existe el siguiente patrón: cuantos más bits cambiemos, más información podremos ocultar y más interferencias provocará esto en la imagen original. Por ejemplo, aquí hay dos imágenes:

esteganografía LSB
esteganografía LSB

A pesar de mis mejores esfuerzos, no pude ver la diferencia entre ellos, sin embargo, en la segunda imagen, usando el método descrito, se esconde el poema de Lewis Carroll “La caza del Snark”. Si ha leído hasta aquí, probablemente esté interesado en conocer la implementación. Es bastante sencillo, pero te advierto de inmediato que todo se hace en Delphi. Hay dos razones para esto: 1. Creo que Delphi es un buen lenguaje; 2. Este programa nació en el proceso de preparación de un curso sobre los conceptos básicos de la visión por computadora, y los chicos a quienes les estoy enseñando este curso aún no saben nada más que Delphi. Para aquellos que no están familiarizados con la sintaxis, es necesario explicar una cosa: shl x es un desplazamiento bit a bit hacia la izquierda por x, shr x es un desplazamiento bit a bit hacia la derecha por x.

Suponemos que estamos escribiendo texto almacenado en una cadena en el contenedor y reemplazando los dos bytes inferiores:
Código de grabación:

para i:=1 a longitud(cadena) hacer
    comenzar
      l1:=byte(cadena[i]) shr 6;
      l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
      l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
      l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
 
      f.ReadBuffer(tmp,1);
      f.Posición:=f.Posición-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posición:=f.Posición-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posición:=f.Posición-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posición:=f.Posición-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    fin;

código para leer:

para i:=1 a MsgSize hacer
    comenzar
      f.ReadBuffer(tmp,1);
      l1:=tmp shl 6;
      f.ReadBuffer(tmp,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      f.ReadBuffer(tmp,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      f.ReadBuffer(tmp,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      cadena:=cadena+char(l1+l2+l3+l4);
    fin;

Bueno, para los más vagos... enlace al programa y su código fuente.

Gracias.

Fuente: habr.com

Añadir un comentario