La esteganografía es una técnica para ocultar mensajes en un canal encubierto. Hay muchas formas de hacerlo, y hoy veremos cómo es que se hace en imágenes. Sólo explicaremos la teoría, no haremos nada práctico por el momento.
Actualización: aquí un ejemplo.
Una imagen tiene pixeles. Y cada pixel tiene un nivel de rojo, verde y azul. Dichos niveles van desde 0 hasta 255, y se les conoce como colores RGB.
Podemos combinar de cualquier forma estos colores
Por lo tanto, cada pixel puede alojar 3 bytes de información, uno por cada nivel de color. Recordemos que un byte son ocho bits, o sea, 8 ceros o unos.
Y el mayor número decimal que podemos representar con 8 bits (un byte) es 255, que en binario es 11111111.
Así que los niveles de los colores ocupan un byte. Si su valor es 0, el byte es 00000000. Si es 1, 00000001, y así.
Ya dijimos que 11111111 es 255, y 00000001 es 1. Ahora vamos a ver el bit más y menos significativo. El menos significativo (LSB) es el que, al cambiar su valor, no afecta mucho. Es el último bit de izquierda a derecha.
Pongamos el ejemplo de 255, que es 11111111:
Si cambio su último bit por un 0, entonces será 11111110. Al convertirlo a decimal, será 254, no es una gran diferencia.
El MSB es el primer bit si ordenamos de izquierda a derecha. Siguiendo el ejemplo de 255, que es 11111111 vamos a cambiarlo.
Cambiamos 11111111 por 01111111. Al convertirlo en decimal, tenemos el número 127; es decir, de 255 pasó a 127. Eso sí fue un gran cambio.
Ya vimos que no afecta mucho si cambiamos el LSB, pues sólo aumentará o disminuirá 1. Entonces descomponemos una cadena, la convertimos en bits y escondemos un bit por cada nivel de color.
Escondamos la palabra “Ho”. El número o código ascii que le corresponde a cada letra es como se ve abajo:
Ahora vamos a convertir esos números a binario:
Supongamos que tenemos algunos pixeles de una imagen así como se ve abajo. El orden es R, G, B o Rojo, Verde, Azul. Sin alterar, se ven así:
Su representación binaria es esta:
Ahora, por cada bit de la palabra “Ho” vamos a alterar un byte de un nivel de color los pixeles.
“Ho” en bits, es esto (el 72 y el 111 en binario):
01001000 01101111
Comenzamos con el primer bit (0), lo acomodamos en el valor R del primer pixel. El segundo bit (1) en el valor G del primer pixel, el tercero (0) en el valor B del primer pixel. Luego, el cuarto bit (0) en el valor R del segundo pixel y así sucesivamente.
Los pixeles, ya modificados y en binario, lucen así como se ve abajo. Notar por favor que en el nivel B del tercer pixel comenzamos a escribir el primer bit de la letra “o”.
Los últimos dos niveles del sexto pixel los dejamos intactos, pues ya escondimos lo que era necesario. Ahora vamos a ver lo más interesante de esto.
Ya tenemos nuestros pixeles modificados, vamos a convertirlos a decimal. Se ven así:
Y los originales eran estos:
Viéndolo como números, claro que se ve la diferencia. Veamos ahora cómo se ven en colores.
Tomemos el primer pixel. El original era 80, 20, 55. El modificado es 80, 21, 55. Aquí los colores:
Izquierda color original. Derecha color modificado (lo saqué de aquí). Al menos yo no veo alguna diferencia, y de hecho esta es una imagen grande. Recordemos que un pixel es mucho mucho más pequeño, así que… ¿quién notaría la diferencia?
Así podemos esconder información en cada pixel. Para recuperarla, hay que hacer el proceso inverso, con la diferencia de que cada que llevemos ocho bits tenemos que calcular su valor en decimal, y luego convertir ese decimal al carácter que le corresponde.
Claro que lo es, pero no de este modo. Tenemos que aprender a no ser tan predecibles. Por ejemplo, modificar pixeles pero no en un orden, sino aleatoriamente. Rotar el texto antes de escribirlo, cosas de esas.
Es importante notar que también podemos (y lo recomiendo ampliamente) encriptar el texto antes de esconderlo. Así, aunque alguien descubra que hay texto ahí, no sabrá cuál es el mensaje original.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios