Skip to content

atomskz/stegify

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

stegify

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/stegify

Использование CLI

stegify 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>

1) Встроить строку

./build/stegify embed input.png -m "secret message" -o output.png

Что делает команда:

  • загружает input.png;
  • встраивает строку;
  • сохраняет результат в output.png;
  • выводит служебное сообщение об успешном выполнении.

2) Встроить данные из файла

./build/stegify embed input.png -f /path/to/data.bin -o output.png

Ограничения:

  • -m и -f взаимоисключающие;
  • обязательно указывать -o для embed.
  • -n отключает запись размера payload в стегоконтейнер.

3) Извлечь в файл

./build/stegify extract output.png -o extracted.bin

4) Извлечь данные в консоль (hex+ASCII)

./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!|

5) Узнать ёмкость изображения

./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> размер берется из флага, а не из контейнера.

Публичный API библиотеки

Объявлен в 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_OK
  • STEGIFY_ERR_INVALID_INPUT
  • STEGIFY_ERR_INVALID_IMAGE
  • STEGIFY_ERR_UNSUPPORTED_FORMAT
  • STEGIFY_ERR_INSUFFICIENT_CAPACITY
  • STEGIFY_ERR_MEMORY_ALLOC
  • STEGIFY_ERR_FILE_IO
  • STEGIFY_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.

About

A CLI tool and C library for hiding and extracting data in images using LSB steganography

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Contributors