Esteganografía | Steganography

Repo: https://github.com/umarquez/100DaysOfC0D3/tree/master/13-steganography

Del griego στεγανος steganos, “cubierto” u “oculto”, y γραφος graphos, “escritura”, trata el estudio y aplicación de técnicas que permiten ocultar mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia. https://es.wikipedia.org/wiki/Esteganograf%C3%ADa

Esta es una técnica de ocultamiento, que a diferencia de un cifrado, no realiza cambios al mensaje original sino que trata de hacerlo pasar desapercibido haciendo uso de un portador que pueda ser modificado, de tal forma que las diferencias entre el portador vacío y el portador con el mensaje incluido no puedan ser detectadas a simple vista.

Una de las técnicas más utilizadas es hacer uso de imágenes como portadores, modificando el bit menos significativo de cada byte de color y almacenándolas en formatos planos o que soporten compresión sin pérdida de manera que la información pueda ser recuperada sin alteraciones.

Es importante resaltar que el objetivo de la esteganografía no es proteger los datos de accesos no autorizados, por lo que sería una buena práctica almacenar datos que ya hayan sido protegidos por algún sistema de cifrado si el objetivo es que solo el receptor que conozca el método y las claves correspondientes pueda tener acceso a ella.

Ejemplo

En esta ocasión vamos tratar de cifrar un texto plano dentro de un grupo de píxeles que compondrían una imagen supuesta. para ello vamos a tomar como mensaje el texto: Hola y una serie de píxeles de color RGB #F0A834 como parte portador.

Ingredientes

  • 1 Mensaje original
  • 1 Imagen portadora (cualquier formato), de tamaño > (len()*8)/3 en píxeles. Puede ser sustituido por un archivo de audio o video realizando los ajustes correspondientes.

Paso 1

Tomamos el mensaje original y lo convertimos en su equivalente binario con el fin de extraer cada bit que lo compone.

Paso 2

Tomamos una serie de píxeles de la imagen portadora, la cantidad necesaria será igual a la longitud del mensaje original * 8 bits de cada byte que lo compone / 3 bytes que conforma cada píxel RGB.

Deberemos obtener el color de cada píxel de forma que contemos con un byte por cada valor RGB, en el caso del ejemplo convertiremos #F0A834 en: **R**= 0xF0, **G**= 0xA8, **B**= 0x34

1px = 3 bytes (RGB)
1px = 3 bytes (RGB)

Paso 3

A continuación estableceremos el bit menos significativo de cada octeto RGB de cada píxel con el valor de cada bit del mensaje original.

Como resultado obtenemos la misma serie de píxeles apenas alterados que a simple vista no podrían distinguirse.

Este resultado lo podemos almacenar usando algún formato de compresión sin pérdidas como TIFF, BMP, PNG

Recuperando el mensaje

Finalmente, para recuperar el mensaje, solo deberemos recorrer de la misma manera cada octeto de cada píxel, extrayendo el valor del bit menos significativo y almacenándolo en la posición correspondiente.

Nota: Una buena idea sería colocar una secuencia de valores que indiquen el fin del mensaje, para que al momento de recuperarlo, solo sea necesario leer hasta obtener esa secuencia, evitando recorrer el resto del contenido.

Implementación en Go