
Простой инструмент стеганографии изображений на C++ для шифрования и сокрытия файлов внутри изображений с использованием кодирования младшего значащего бита.
Простой инструмент на C++ для шифрования и стеганографии, который использует шифрование с защитой паролем для защиты содержимого файла, а затем встраивает его в пиксельные данные изображения с помощью кодирования наименьшего значащего бита (LSB). Для систем Linux, MacOS и 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
Исходное изображение:

Изображение с встроенным ZIP-архивом, содержащим полное содержимое книги «Доктор Джекил и мистер Хайд»:

$ ./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.
Программа работает следующим образом: сначала случайным образом генерируется 128-битная соль пароля и 128-битный вектор инициализации AES путем чтения двоичных данных из /dev/urandom. Затем эта соль пароля используется как параметр при генерации ключа шифрования с помощью PBKDF2-HMAC-SHA-256 на основе введенной пользователем строки. Затем вычисляется хеш CRC32 встраиваемого файла, который сохраняется в заголовке для проверки целостности данных. После этого двоичные данные встраиваемого файла дополняются с помощью алгоритма PKCS #7, а затем как заголовок, так и дополненные данные шифруются с помощью AES-256 в режиме CBC с использованием ранее сгенерированного вектора инициализации. Затем данные фактически кодируются внутри изображения: сначала выбирается случайное смещение, а затем каждый бит данных последовательно сохраняется в пиксельных данных изображения путем установки наименьшего значащего бита каждого байта канала каждого пикселя.
Процесс декодирования работает точно так же, как и процесс кодирования, описанный выше, только в обратном порядке. Единственное отличие заключается в том, что при декодировании после попытки извлечения и расшифровки данных программа сравнивает некоторую информацию из заголовка, чтобы проверить корректность извлечения. Сравниваемые поля заголовка: 4-байтовая сигнатура файла, уникальная для этой программы, и хеш CRC32 расшифрованных данных. Если хотя бы одно из этих полей не соответствует правильным значениям, процесс расшифровки завершится ошибкой. Это может произойти только в том случае, если файл, который вы пытаетесь расшифровать, на самом деле не содержит встроенных данных, если введен неверный пароль или если файл изображения каким-либо образом поврежден.
Хотя обнаружение факта встраивания данных в изображение является тривиальной задачей, теоретически невозможно узнать, что это сделала именно эта программа, и теоретически не должно быть известного способа расшифровать данные без знания пароля, то есть без затрат миллионов лет на этот процесс.
Не используйте эту программу для шифрования и сокрытия важных данных, которые вы хотите уберечь от посторонних глаз. Это всего лишь простая программа для демонстрации концепции, которую я сделал для развлечения. Я не криптограф. Я всего лишь любитель, используйте на свой страх и риск.
Это программное обеспечение лицензировано по лицензии MIT. Copyright © 2022 Zach Collins