Esteganografía en Python
Este Módulo ocultará los archivos dentro de las imágenes (actualmente PNG) y exportará la imagen modificada al disco.
El tamaño máximo del archivo que se puede ocultar dentro de una imagen depende de la dimensión de la misma.
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
#tamñao=(altura*ancho*6/8)bytes
‘100k words.txt‘ está escondido en ‘original_image.png’ lamado como ‘image_with_100k words.png‘. Mira y comprueba si puedes detectar la diferencia entre estas dos imágenes. Puedes usar este Módulo para extraer ‘100k words.txt’ de la imagen ‘image_with_100k words.png’
Ejemplo
Imagen Original
Imagen Modificada
¡Esta imagen tiene 100 mil palabras escondidas en su interior!
¿Cómo Funciona?
Se basa en un simple principio de que si cambiamos el LSB (Least Significant Bits) de cada Píxel, entonces el cambio no será significativo y no será notado por los ojos.
Así que, este Módulo toma 2 bits de datos del archivo para ocultarlos y reemplaza los últimos 2 bits de un píxel con esos 2 bits, y luego pasa al siguiente píxel. El cambio máximo en el píxel puede ser de 4 unidades, y el rango de valores en una Imagen PNG es (0,255), por lo que este cambio no será significativo.
En una imagen PNG, cada píxel tiene 3 canales: Rojo (Red), Verde (Green) y Azul (Blue). (Algunas Imágenes PNG tienen 1 o 4 canales, pero este Programa las convertirá en 3 canales) Un pixel típico en una Imagen PNG se ve como:
a_pixel = (17,32,11) # (RED, GREEN, BLUE)
Entonces, podemos ahorrar 3 veces 2 bits en un Pixel, eso significa 6 bits por pixel. Eso nos lleva al límite superior del tamaño del archivo, que se puede ocultar en una imagen:
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
Entendamos tomando un ejemplo. Los datos a ocultar son:
binary_data = 0b100111
Tomemos los dos primeros bits y reemplacémoslos con el Canal Red de nuestro ‘a_pixel’.
a_pixel = (0b10001, 0b100000, 0b1011) # binary representation of a_pixel values
# Let's change a_pixel's RED Channel
# 0b10001 -> 0b10010 ( First 2 bits are 10 )
a_pixel = (0b10010, 0b100000, 0b1011) # modified pixel
Tomemos otra vez 2 bits de binary_data y reemplacemos los últimos 2 bits del Canal GREEN con ellos.
a_pixel = (0b10010, 0b100000, 0b1011)
# Let's change a_pixel's GREEN Channel
# 0b100000 -> 0b100001 ( The 2 bits are 01 )
a_pixel = (0b10010, 0b100001, 0b1011) # modified pixel
Hagámoslo una vez más con el Canal BLUE y habremos terminado.
a_pixel = (0b10010, 0b100001, 0b1011)
# Let's change a_pixel's BLUE Channel
# 0b1011 -> 0b1011 ( The 2 bits are 11 ) ; Notice that the value wasn't changed this time
a_pixel = (0b10010, 0b100001, 0b1011) # pixel wasn't modified this time
Así que, hemos escondido nuestro mensaje de 6 bits en un píxel, veamos los cambios en el píxel
a_pixel = (0b10001, 0b100000, 0b1011) = (17, 32, 11)
a_pixel_with_data = (0b10010, 0b100001, 0b1011) = (18, 33, 11)
Como podemos ver, el cambio no es ni siquiera perceptible a nivel de píxeles. El Módulo hace esto repetidamente hasta que todos nuestros datos son guardados en la imagen.
Por Hacer
- Añadir soporte para imágenes JPEG
- Añadir la opción de cifrado
- Añadir la auto detección del nombre del archivo a extraer
Licencia
MIT
steganographer (este enlace se abre en una nueva ventana) por priyansh-anand (este enlace se abre en una nueva ventana)
Steganograpy in Python | Hide files or data in Image Files
Software Libre, ¡Diablos, sí!