
Einfaches C++-Tool zur Bildsteganographie zum Verschlüsseln und Verstecken von Dateien in Bildern mittels Least-Significant-Bit-Kodierung.
Einfaches C++ Verschlüsselungs- und Steganographie-Tool, das passwortgeschützte Verschlüsselung verwendet, um den Inhalt einer Datei zu sichern, und diesen dann mithilfe der Least-Significant-Bit-Kodierung in die Pixeldaten eines Bildes einbettet. Für Linux-, MacOS- und Windows-Systeme.
$ ./steganography encode -i data/orig.png -e data/jekyll_and_hyde.zip -o output.png
Password: 1234
* Image size: 640x426 pixels
* Encoding level: Low (Default)
* Max embed size: 132.38 KiB
* Embed size: 61.77 KiB
* Encrypted embed size: 61.78 KiB
* Generated CRC32 checksum
* Generated encryption key with PBKDF2-HMAC-SHA-256 (20000 rounds)
* Encrypted embed with AES-256-CBC
* Embedded jekyll_and_hyde.zip into image
* Sucessfully wrote to output.png
Originalbild:

Bild mit eingebettetem ZIP-Archiv, das den gesamten Inhalt des Buches „Dr. Jekyll und Mr. Hyde“ enthält:

$ ./steganography decode -i output.png -o "out - jekyll_and_hyde.zip"
Password: 1234
* Image size: 640x426 pixels
* Generated decryption key with PBKDF2-HMAC-SHA-256 (20000 rounds)
* Sucessfully decrypted header
* File signatures match
* Detected embed jekyll_and_hyde.zip
* Encoding level: Low (Default)
* Encrypted embed size: 61.78 KiB
* Successfully decrypted the embed
* Decrypted embed size: 61.77 KiB
* CRC32 checksum matches
* Successfully wrote to out - jekyll_and_hyde.zip
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ..
$ make -j 4
Usage: steganography [-h] {decode,encode}
Optional arguments:
-h, --help shows help message and exits
-v, --version prints version information and exits
Subcommands:
decode Decodes and extracts an embed-file from an image
encode Encodes an embed-file into an image
Usage: encode [-h] --input VAR --output VAR --embed VAR [--passwd VAR]
Encodes an embed-file into an image
Optional arguments:
-h, --help shows help message and exits
-v, --version prints version information and exits
-i, --input specify the input image. [required]
-o, --output specify the output image. [required]
-e, --embed specify the file to embed. [required]
-p, --passwd specify the encryption password.
Usage: decode [-h] --input VAR [--output VAR] [--passwd VAR]
Decodes and extracts an embed-file from an image
Optional arguments:
-h, --help shows help message and exits
-v, --version prints version information and exits
-i, --input specify the input image. [required]
-o, --output specify the output file. [default: ""]
-p, --passwd specify the encryption password.
Das Programm funktioniert, indem es zunächst zufällig einen 128-Bit-Passwortsalz und einen 128-Bit-AES-Initialisierungsvektor generiert, indem es Binärdaten aus /dev/urandom liest. Es verwendet dann diesen Passwortsalz als Parameter zur Erzeugung eines Verschlüsselungsschlüssels, indem es PBKDF2-HMAC-SHA-256 auf eine vom Benutzer eingegebene Zeichenfolge anwendet. Ein CRC32-Hash der einzubettenden Datei wird dann berechnet und im Header gespeichert, um als Prüfsumme für die Gültigkeit der Daten zu dienen. Anschließend werden die Binärdaten der einzubettenden Datei mit dem PKCS #7-Algorithmus aufgefüllt, gefolgt von der tatsächlichen Verschlüsselung sowohl des Headers als auch der aufgefüllten Daten mit AES-256 im CBC-Modus unter Verwendung des zuvor generierten Initialisierungsvektors. Nun werden die Daten tatsächlich in das Bild kodiert, indem zunächst ein zufälliger Offset ausgewählt wird und dann jedes Datenbit durchlaufen und in den tatsächlichen Bildpixeldaten gespeichert wird, was dadurch erreicht wird, dass das Least-Significant-Bit jedes Kanal-Bytes jedes Pixels gesetzt wird.
Der Dekodierungsprozess funktioniert genauso wie der oben beschriebene Kodierungsprozess, nur in umgekehrter Reihenfolge. Der einzige Unterschied besteht darin, dass das Programm beim Dekodieren, nachdem es versucht, die Daten zu extrahieren und zu entschlüsseln, einige Informationen im Header-Bereich vergleicht, um den Extraktionsprozess zu validieren. Die verglichenen Header-Felder sind: Die 4-Byte-Dateisignatur, die für dieses Programm spezifisch ist, und der CRC32-Hash der entschlüsselten Daten. Wenn eines dieser Felder nicht mit den korrekten Werten übereinstimmt, schlägt der Entschlüsselungsprozess fehl. Dies sollte nur passieren, wenn die Datei, die Sie zu entschlüsseln versuchen, tatsächlich keine Einbettung enthält, wenn das eingegebene Passwort falsch ist oder wenn die Bilddatei irgendwie beschädigt wurde.
Während die Erkennung von in ein Bild eingebetteten Daten eine triviale Aufgabe ist, gibt es theoretisch keine Möglichkeit zu wissen, dass es dieses Programm war, das dies getan hat, und theoretisch sollte es keine bekannte Möglichkeit geben, die Daten ohne Kenntnis des Passworts zu entschlüsseln, das heißt, ohne Millionen von Jahren damit zu verbringen.
Verwenden Sie dieses Programm nicht, um wichtige Daten zu verschlüsseln und zu verstecken, die Sie vor neugierigen Blicken schützen möchten. Dies ist nur ein einfaches Proof-of-Concept-Programm, das ich zum Spaß erstellt habe. Ich bin kein Kryptograf. Ich bin nur ein Hobbyist, verwenden Sie es auf eigenes Risiko.
Diese Software ist unter der MIT-Lizenz lizenziert. Copyright © 2022 Zach Collins