stegify — консольное приложение и C-библиотека для встраивания и извлечения данных в изображениях методом LSB (Least Significant Bit).
Проект состоит из:
- CLI-инструмента (
src/main.c) для практического использования. - Библиотеки (
src/stegify.c,src/stegify.h) с API для загрузки/сохранения изображений и операций стеганографии. - Реализации
stb_image/stb_image_write(src/stbi_impl.c) для работы с PNG, BMP и JPEG.
Основной принцип — запись битов полезной нагрузки в младший бит каждого байта пиксельных данных.
- 1 байт полезных данных требует 8 байт контейнера (по 1 биту на байт контейнера).
- В режиме с атрибутом
STEGIFY_ATTR_WITH_SIZEбиблиотека сначала записываетuint32_tразмер полезной нагрузки, а затем сами данные. - При извлечении размер сначала читается из изображения, затем читаются данные заданной длины.
- Встроить строку в изображение.
- Встроить содержимое файла в изображение.
- Извлечь данные из изображения:
- в файл;
- в консоль в виде hex+ASCII таблицы (по флагу
-p).
- Узнать максимальную ёмкость изображения для полезной нагрузки (
size).
CMakeLists.txt— сборка проекта через CMake.src/main.c— CLI и парсинг аргументов.src/stegify.h— публичный API библиотеки.src/stegify.c— реализация стеганографии и image I/O.src/stbi_impl.c— компиляция реализацийstb_imageиstb_image_write.
- CMake >= 3.14
- C-компилятор с поддержкой C99
- Доступ в сеть на первом конфигурировании CMake (для загрузки
stbчерезFetchContent)
cmake -S . -B build
cmake --build buildПосле сборки бинарник:
./build/stegifystegify embed <image_path> (-m <secret_message> | -f <data_file_path>) -o <output_image_path> [-p] [-n]
stegify extract <image_path> [-o <output_file_path>] [-p] [-s <size>]
stegify size <image_path>
./build/stegify embed input.png -m "secret message" -o output.pngЧто делает команда:
- загружает
input.png; - встраивает строку;
- сохраняет результат в
output.png; - выводит служебное сообщение об успешном выполнении.
./build/stegify embed input.png -f /path/to/data.bin -o output.pngОграничения:
-mи-fвзаимоисключающие;- обязательно указывать
-oдляembed. -nотключает запись размера payload в стегоконтейнер.
./build/stegify extract output.png -o extracted.bin./build/stegify extract output.png -pБез -p команда extract выводит только служебную информацию о результате.
При -p выводится формат hex-таблицы с параллельным ASCII-представлением, например:
00000000 48 65 6c 6c 6f 2c 20 73 74 65 67 69 66 79 21 |Hello, stegify!|
./build/stegify size input.pngПример вывода:
1864 bytes (0.002 MB)
Поддерживаются:
- PNG
- BMP
- JPEG/JPG
Формат определяется по расширению файла.
Максимальная полезная нагрузка рассчитывается как:
(width * height * channels) / 8 - 4
Где:
-4— резерв под хранениеuint32_tразмера в режимеSTEGIFY_ATTR_WITH_SIZE.- при
embed -nрезерв под размер не используется. - при
extract -s <size>размер берется из флага, а не из контейнера.
Объявлен в src/stegify.h.
Ключевые функции:
stegify_image_load(...)— загрузить изображение.stegify_image_save(...)— сохранить изображение.stegify_image_free(...)— освободить память изображения.stegify_get_max_capacity(...)— максимальная ёмкость для payload.stegify_embed(...)— встроить данные.stegify_extract(...)— извлечь данные.stegify_error_string(...)— строка с описанием статуса.
Статусы ошибок представлены в stegify_status_t:
STEGIFY_OKSTEGIFY_ERR_INVALID_INPUTSTEGIFY_ERR_INVALID_IMAGESTEGIFY_ERR_UNSUPPORTED_FORMATSTEGIFY_ERR_INSUFFICIENT_CAPACITYSTEGIFY_ERR_MEMORY_ALLOCSTEGIFY_ERR_FILE_IOSTEGIFY_ERR_CORRUPTED_DATA
- Метод LSB чувствителен к преобразованиям изображения.
- JPEG — формат с потерями: повторное перекодирование может повредить скрытые данные.
- Для надёжной передачи скрытых данных предпочтительнее PNG или BMP.
- Библиотека не использует шифрование, только скрытие данных.
- Извлечение корректно работает, если контейнер не был изменён после встраивания.
# 1) Проверяем ёмкость
./build/stegify size cover.png
# 2) Встраиваем файл
./build/stegify embed cover.png -f secret.bin -o stego.png
# 3) Извлекаем обратно
./build/stegify extract stego.png -o restored.bin
# 4) Сравниваем
cmp -s secret.bin restored.bin && echo "OK"Если команда завершилась с ошибкой:
- проверьте путь к входному файлу;
- проверьте корректность расширения (
png,bmp,jpg,jpeg); - проверьте, что payload помещается в контейнер (
size); - проверьте права на запись в выходной путь.
Проект распространяется под лицензией MIT. Полный текст находится в файле LICENSE.
В проекте используется stb (stb_image, stb_image_write), подключаемая во время сборки через CMake FetchContent из официального репозитория nothings/stb.