
Semplice strumento di steganografia per immagini in C++ per crittografare e nascondere file all'interno di immagini utilizzando la codifica del bit meno significativo.
Semplice strumento C++ di crittografia e steganografia che utilizza crittografia protetta da password per proteggere il contenuto di un file, e poi lo incorpora nei dati dei pixel di un'immagine utilizzando la codifica del bit meno significativo. Per sistemi Linux, MacOS e 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
Immagine originale:

Immagine con ZIP incorporato contenente l'intero contenuto del libro "Dr Jekyll e 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.
Il programma opera generando prima casualmente un Sale per password a 128 bit e un Vettore di inizializzazione AES a 128 bit leggendo dati binari da /dev/urandom. Utilizza poi quel Sale per password come parametro per generare una chiave di crittografia, usando PBKDF2-HMAC-SHA-256 su una stringa inserita dall'utente. Viene quindi calcolato un hash CRC32 del file da incorporare, e memorizzato nell'intestazione per fungere da checksum per la validità dei dati. Successivamente, allinea i dati binari del file da incorporare usando l'algoritmo PKCS #7, seguita dalla crittografia effettiva sia dell'intestazione che dei dati allineati, con AES-256 in modalità CBC, utilizzando il Vettore di inizializzazione generato in precedenza. Ora i dati vengono effettivamente codificati all'interno dell'immagine scegliendo prima un offset casuale, poi esaminando ogni bit di dati e memorizzandolo nei dati effettivi dei pixel dell'immagine, cosa che si ottiene impostando il bit meno significativo di ogni byte di canale di ogni pixel.
Il processo di decodifica funziona esattamente come il processo di codifica descritto in precedenza, ma al contrario. L'unica differenza è che per la decodifica, dopo che il programma tenta di estrarre e decrittare i dati, confronta alcune informazioni nella sezione dell'intestazione nel tentativo di validare il processo di estrazione. I campi dell'intestazione che vengono confrontati sono: la firma del file di 4 byte personalizzata di questo programma, e l'hash CRC32 dei dati decrittati. Se uno qualsiasi di questi campi non corrisponde ai valori corretti, il processo di decrittazione fallirà. Questo dovrebbe accadere solo se il file che si stava tentando di decrittare non contiene effettivamente un incorporato, se la password inserita è sbagliata, o se il file immagine è stato in qualche modo corrotto.
Sebbene la rilevazione di dati incorporati in un'immagine sia un compito banale, teoricamente non c'è modo di sapere che sia stato questo programma a farlo, e teoricamente non dovrebbe esserci alcun modo noto per decrittare i dati senza conoscere la password, cioè senza passare milioni di anni nel processo.
Non utilizzare questo programma per crittografare e nascondere dati importanti che desideri tenere lontani da occhi indiscreti. Questo è solo un semplice programma proof-of-concept che ho creato per divertimento. Non sono un crittografo. Sono solo un hobbista, usalo a tuo rischio.
Questo software è concesso in licenza MIT. Copyright © 2022 Zach Collins