Hace mucho tiempo escribí mi . Ese post estaba dedicado a un tema muy interesante, a saber, la esteganografía. Por supuesto, la solución propuesta en aquel viejo tema no puede considerarse una esteganografía en el verdadero sentido de la palabra. Es solo un juego con formatos de archivos, pero, aun así, es un juego bastante interesante.
Hoy intentaremos profundizar un poco más y examinaremos el algoritmo LSB. Si te interesa, estás más que bienvenido a seguir leyendo. (Es necesario un tráfico de alrededor de un megabyte.)
Primero que todo, es necesario hacer una pequeña introducción. Todos saben que el propósito de la criptografía es hacer imposible la lectura de información secreta. Naturalmente, la criptografía tiene sus áreas de aplicación, pero también hay otro enfoque para la protección de datos. No es necesario cifrar la información, sino hacer como si no tuviéramos. Para esto se ha ideado la esteganografía. Wikipedia nos asegura que, "la esteganografía (del griego στεγανοσ — oculto y γραφω — escribir, literalmente 'escritura oculta') es la ciencia de la transmisión secreta de información mediante el secreto del propio hecho de la transmisión.
Por supuesto, nadie prohíbe combinar métodos criptográficos y esteganográficos. De hecho, en la práctica se hace así, pero nuestra tarea es entender los fundamentos. Si se estudia detenidamente el artículo de Wikipedia, se puede saber que en los algoritmos de esteganografía hay un llamado contenedor y un mensaje. El contenedor es cualquier información que ayuda a ocultar nuestro mensaje secreto.
En nuestro caso, el contenedor será una imagen en formato BMP. Para empezar, examinemos la estructura de este archivo. El archivo se puede dividir en 4 partes: encabezado del archivo, encabezado de la imagen, paleta y la propia imagen. Para nuestros fines, solo hay que saber lo que se encuentra en el encabezado.
Los primeros dos bytes del encabezado son la firma BM, a continuación en una palabra doble se registra el tamaño del archivo en bytes, los siguientes 4 bytes están reservados y deben contener ceros y, finalmente, en otra palabra doble se registra el desplazamiento desde el inicio del archivo hasta los bytes de la imagen. En un archivo BMP de 24 bits, cada píxel se codifica con tres bytes BGR.
Ahora sabemos cómo acceder a la imagen, solo nos falta entender cómo grabar en ella la información que necesitamos. Para eso nos servirá el método LSB. La esencia del método es la siguiente: reemplazamos los bits menos significativos en los bytes correspondientes a la codificación del color. Supongamos que si el siguiente byte de nuestro mensaje secreto es 11001011, y los bytes en la imagen son… 11101100 01001110 01111100 0101100111…, 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 menos significativos de la imagen: …11101111 01001100 01111110 0101100111…. Este tipo de reemplazo, en general, no es perceptible para el ojo humano. Además, muchos dispositivos de salida antiguos ni siquiera podrán mostrar tales cambios insignificantes.
Está claro que no solo se pueden cambiar 2 bits menos significativos, sino cualquier cantidad de ellos. Aquí hay una siguiente regla: cuanto mayor sea la cantidad de bits que cambiamos, mayor será la cantidad de información que podemos ocultar, y mayores interferencias causará en la imagen original. Por ejemplo, aquí tienen dos imágenes:


Con todo mi deseo, no pude ver la diferencia entre ellas, sin embargo, en la segunda imagen, mediante el método descrito, se ha ocultado el poema de Lewis Carroll "La caza del Snark". Si has llegado hasta aquí, seguramente te interesa saber también sobre la implementación. Es bastante simple, pero advierto de inmediato que todo está hecho en Delphi. Hay dos razones para esto: 1. Creo que Delphi es un buen lenguaje; 2. Este programa nació durante la preparación de un curso sobre fundamentos de visión por computadora, y los chicos a quienes enseño este curso aún no conocen nada más que Delphi. Para aquellos que no están familiarizados con la sintaxis, hay que aclarar una cosa: shl x – desplazamiento de bits a la izquierda en x, shr x – desplazamiento de bits a la derecha en x.
Supongamos que estamos escribiendo en un contenedor un texto que se almacena en una cadena y reemplazamos los dos bytes menos significativos:
Código para escribir:
for i:=1 to length(str) do
begin
l1:=byte(str[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.Position:=f.Position-1;
tmp:=((tmp shr 2) shl 2)+l1;
f.WriteBuffer(tmp,1);
f.ReadBuffer(tmp,1);
f.Position:=f.Position-1;
tmp:=((tmp shr 2) shl 2)+l2;
f.WriteBuffer(tmp,1);
f.ReadBuffer(tmp,1);
f.Position:=f.Position-1;
tmp:=((tmp shr 2) shl 2)+l3;
f.WriteBuffer(tmp,1);
f.ReadBuffer(tmp,1);
f.Position:=f.Position-1;
tmp:=((tmp shr 2) shl 2)+l4;
f.WriteBuffer(tmp,1);
end;
código para leer:
for i:=1 to MsgSize do
begin
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;
str:=str+char(l1+l2+l3+l4);
end;
Y para los completamente perezosos – .
Gracias.
Fuente: habr.com
