
Outil de stéganographie d'images simple en C++ pour chiffrer et cacher des fichiers dans des images en utilisant l'encodage du bit de poids faible.
Outil simple en C++ de chiffrement et stéganographie qui utilise un chiffrement protégé par mot de passe pour sécuriser le contenu d'un fichier, puis l'incruste dans les données de pixels d'une image en utilisant l'encodage du bit de poids faible. Pour les systèmes Linux, MacOS et Windows.
$ ./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
Image originale :

Image avec un ZIP incrusté contenant l'intégralité du livre « Dr Jekyll and Mr Hyde » :

$ ./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.
Le programme commence par générer aléatoirement un sel de mot de passe de 128 bits et un vecteur d'initialisation AES de 128 bits en lisant des données binaires depuis /dev/urandom.
Il utilise ensuite ce sel de mot de passe comme paramètre pour générer une clé de chiffrement, en utilisant PBKDF2-HMAC-SHA-256 sur une chaîne saisie par l'utilisateur.
Un hachage CRC32 du fichier à incruster est ensuite calculé et stocké dans l'en-tête pour servir de somme de contrôle de la validité des données.
Il remplit ensuite les données binaires du fichier à incruster à l'aide de l'algorithme PKCS #7, puis chiffre à la fois l'en-tête et les données remplies, avec AES-256 en mode CBC, en utilisant le vecteur d'initialisation généré précédemment.
Les données sont ensuite encodées dans l'image en choisissant d'abord un décalage aléatoire, puis en parcourant chaque bit de données et en le stockant dans les données de pixels de l'image, ce qui est accompli en définissant le bit de poids faible de chaque octet de canal de chaque pixel.
Le processus de décodage fonctionne exactement comme le processus d'encodage décrit précédemment, mais en sens inverse.
La seule différence est que lors du décodage, après que le programme tente d'extraire et de déchiffrer les données, il compare certaines informations de l'en-tête pour tenter de valider le processus d'extraction. Les champs de l'en-tête comparés sont : la signature de fichier de 4 octets propre à ce programme et le hachage CRC32 des données déchiffrées.
Si l'un de ces champs ne correspond pas à ses valeurs correctes, le processus de déchiffrement échoue. Cela ne devrait se produire que si le fichier que vous tentiez de déchiffrer ne contient pas réellement une incrustation, si le mot de passe saisi est incorrect, ou si le fichier image a été corrompu.
Bien que la détection de données incrustées dans une image soit une tâche triviale, il n'existe théoriquement aucun moyen de savoir que c'est ce programme qui l'a fait, et théoriquement, il ne devrait y avoir aucun moyen connu de déchiffrer les données sans connaître le mot de passe, c'est-à-dire sans passer des millions d'années à le faire.
N'utilisez pas ce programme pour chiffrer et cacher des données importantes que vous souhaitez soustraire aux regards indiscrets. Il s'agit simplement d'un programme de démonstration que j'ai réalisé pour m'amuser. Je ne suis pas cryptographe, je ne suis qu'un amateur. Utilisez-le à vos propres risques.
Ce logiciel est sous licence MIT. Copyright © 2022 Zach Collins