
Steganographie in Python | Verstecke Dateien oder Daten in Bilddateien
Dieses Skript versteckt Dateien in Bildern und speichert das modifizierte Bild auf der Festplatte.
Die maximale Größe einer Datei, die in einem Bild versteckt werden kann, hängt von den Abmessungen des Bildes ab.
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
'100k words.txt' ist in 'original_image.png' versteckt und als 'image_with_100k words.png' benannt. Gehen Sie und prüfen Sie, ob Sie den Unterschied zwischen diesen beiden Bildern erkennen können. Sie können dieses Modul verwenden, um '100k words.txt' aus der 'image_with_100k words.png' zu extrahieren.
Originalbild

Modifiziertes Bild

Dieses Bild enthält 100k Wörter (eine Textdatei) versteckt!
Es basiert auf einem einfachen Prinzip: Wenn wir die LSB (Least Significant Bits) jedes Pixels ändern, wird die Änderung nicht signifikant sein und von den Augen nicht bemerkt werden.
Also nimmt dieses Modul 2 Bits der zu versteckenden Datei und ersetzt die letzten 2 Bits eines Pixels durch diese 2 Bits, und geht dann zum nächsten Pixel über. Die maximale Änderung eines Pixels kann 4 Einheiten betragen, und der Wertebereich in einem PNG-Bild ist (0,255), daher wird diese Änderung nicht signifikant sein.
In einem PNG-Bild hat jeder Pixel 3 Kanäle: Rot, Grün und Blau. (Manche PNG-Bilder haben 1 oder 4 Kanäle, aber dieses Programm wandelt sie in 3 Kanäle um) Ein typischer Pixel in einem PNG-Bild sieht wie folgt aus:
a_pixel = (17,32,11) # (RED, GREEN, BLUE)
Also können wir 3 mal 2 Bits in einem Pixel speichern, das bedeutet 6 Bits pro Pixel. Das führt uns zur Obergrenze der Dateigröße, die in einem Bild versteckt werden kann:
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
Lassen Sie es uns anhand eines Beispiels verstehen. Die zu versteckenden Daten sind:
binary_data = 0b100111
Nehmen wir die ersten beiden Bits und ersetzen sie mit dem RED-Kanal unseres '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
Nehmen wir erneut 2 Bits von binary_data und ersetzen die letzten 2 Bits des GREEN-Kanals damit.
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
Machen wir das noch einmal mit dem BLUE-Kanal und wir sind fertig.
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
So haben wir unsere 6-Bit-Nachricht in einem Pixel versteckt. Sehen wir uns die Änderungen im Pixel an:
a_pixel = (0b10001, 0b100000, 0b1011) = (17, 32, 11)
a_pixel_with_data = (0b10010, 0b100001, 0b1011) = (18, 33, 11)
Wie wir sehen können, ist die Änderung nicht einmal auf Pixelebene erkennbar. Das Modul wiederholt dies, bis alle unsere Daten im Bild gespeichert sind.

HINWEIS: Das Rauschen im Bild wird erhöht, und wenn wir eine Bildbearbeitungssoftware verwenden und es mit dem Originalbild vergleichen, wird dieses Bild viel mehr Rauschen aufweisen als das Originalbild.
Lösung für dieses Problem: Laden Sie das Originalbild niemals im Internet hoch/teilen Sie es nicht.
MIT
Kostenlose Software, Verdammt ja!