
Ferramente simples de esteganografia de imagens em C++ para criptografar e ocultar arquivos dentro de imagens usando codificação de bit menos significativo.
Ferramenta simples em C++ de Criptografia e Esteganografia que usa criptografia protegida por senha para proteger o conteúdo de um arquivo e, em seguida, o incorpora dentro dos dados de pixel de uma imagem usando codificação de bit menos significativo. Para sistemas 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
Imagem original:

Imagem com ZIP incorporado contendo todo o conteúdo do livro "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.
O programa opera primeiro gerando aleatoriamente um Salt de senha de 128 bits e um Vetor de Inicialização AES de 128 bits lendo dados binários de /dev/urandom. Em seguida, usa esse Salt de senha como parâmetro na geração de uma chave de criptografia, usando PBKDF2-HMAC-SHA-256 em uma string fornecida pelo usuário. Um hash CRC32 do arquivo a ser incorporado é então calculado e armazenado no cabeçalho para atuar como uma soma de verificação da validade dos dados. Em seguida, ele preenche os dados binários do arquivo a ser incorporado usando o algoritmo PKCS #7, seguido pela criptografia real tanto do cabeçalho quanto dos dados preenchidos, com AES-256 no Modo CBC, usando o Vetor de Inicialização gerado anteriormente. Agora os dados são realmente codificados dentro da imagem, primeiro escolhendo um deslocamento aleatório e, em seguida, percorrendo cada bit de dados e armazenando-o dentro dos dados de pixel reais da imagem, o que é feito definindo o Bit Menos Significativo de cada byte de canal de cada pixel.
O processo de decodificação funciona exatamente da mesma forma que o processo de codificação descrito anteriormente, apenas ao contrário. A única diferença é que para a decodificação, após o programa tentar extrair e descriptografar os dados, ele compara algumas informações na seção do cabeçalho na tentativa de validar o processo de extração. Os campos do cabeçalho que são comparados são: a assinatura de arquivo de 4 bytes personalizada deste programa e o hash CRC32 dos dados descriptografados. Se algum desses campos não corresponder aos seus valores corretos, o processo de descriptografia falhará. Isso deve acontecer apenas se o arquivo que você estava tentando descriptografar não contiver realmente um dado incorporado, se a senha inserida estiver errada ou se o arquivo de imagem estiver de alguma forma corrompido.
Embora a detecção de dados incorporados em uma imagem seja uma tarefa trivial, teoricamente não há como saber que foi este programa que o fez, e teoricamente não deve haver nenhuma maneira conhecida de descriptografar os dados sem conhecer a senha, ou seja, sem gastar milhões de anos nesse processo.
Não use este programa para criptografar e ocultar dados importantes que você deseja manter longe de olhos curiosos. Este é apenas um programa simples de prova de conceito que fiz por diversão. Não sou criptógrafo. Sou apenas um amador, use por sua conta e risco.
Este software está licenciado sob MIT. Copyright © 2022 Zach Collins