
Мультиплатформенное приложение для стеганографии с графическим интерфейсом, командной строкой и веб-сервисом, поддерживает WEBP и AES.
В двух словах, стеганография — это искусство скрывать сообщения в другом носителе на виду, не вызывая подозрений. Данная реализация считывает изображения в популярных веб-форматах (WEBP, PNG, GIF, JPEG), прячет в них (необязательно зашифрованный) текст и сохраняет результат в виде WEBP-изображения. Затем вы можете загрузить это новое изображение на любой публичный сайт, форум, Instagram, чат Facebook, прикрепить к электронным письмам и так далее. Никто ничего не заподозрит, никто не узнает, что в картинке на самом деле есть сообщение, если вы явно не скажете им (и если использовалось шифрование, им также понадобится правильный пароль, конечно).
выберите исходное изображение (либо по URL, либо из локального файла)
при желании введите пароль (если хотите дополнительное шифрование военного уровня)
3/а. чтобы проверить сообщение в изображении, нажмите Загрузить. Если сообщения нет или ваш пароль неверен, вы можете увидеть бессмыслицу.
3/б. введите ваше сообщение и нажмите Сохранить. Будет сохранено новое изображение (со скрытым внутри сообщением), используйте этот файл по своему усмотрению.
Перейдите на сайт.
Скачайте для Linux (GTK) и Windows (GDI). Это портативные исполняемые файлы, не требующие установки, и они не оставляют никаких следов на вашем компьютере. Графический интерфейс выглядит и работает точно так же, как веб-сервис.

Скачайте для Linux и Windows (оба используют только libc). Затем введите
./stegano-cli <файл изображения>
./stegano-cli -p <пароль> <файл изображения>
чтобы вывести сообщение из изображения в stdout, и
./stegano-cli <файл изображения> <сообщение>
./stegano-cli -p <пароль> <файл изображения> <сообщение>
чтобы закодировать сообщение в новый файл .webp (это может перезаписать исходный файл). Как и в веб-сервисе, пароль необязателен. В отличие от версии с графическим интерфейсом выше, версия командной строки не имеет абсолютно никаких зависимостей и просто работает(tm) везде.
Просто выполните make в каталоге src, он следует принципам suckless.
Для компиляции требуются только emcc от Emscripten и gcc (версия для Linux с GUI также требует pkg-config и GTK, GDK, pango, cairo
и прочие типичные GTK-навороты).
make wasm если вы хотите скомпилировать только версию WebAssembly (необходимый шаблонный HTML находится в каталоге public).make cli если вы хотите скомпилировать только версию командной строки (полностью без зависимостей, должна работать на любой POSIX-системе).make gui если вы хотите скомпилировать только версию с графическим интерфейсом (для Windows GDI, в противном случае зависит от GTK).Если вы указали пароль, ваш текст сначала шифруется. Затем изображение распаковывается в пиксельный буфер, где биты вашего (зашифрованного) сообщения сохраняются в яркости цветовых каналов. Это создает очень слабые волновые паттерны на изображении, которые абсолютно незаметны невооруженному человеческому глазу (а при отсутствии сравнения с оригинальным изображением, абсолютно незаметны и для компьютеров).
При загрузке изображение снова распаковывается в пиксельный буфер, и эти волны яркости в цветовых каналах преобразуются в конкатенированный битовый блок. Если указан пароль, битовый блок расшифровывается. Итоговое сообщение проверяется на валидность UTF-8, и если оно валидно, отображается. (Эта проверка UTF-8 необходима, потому что никто не может сказать, есть ли на самом деле сообщение в изображении, или правильный ли был указан пароль.)
Сообщение хранится как нуль-терминированный многобайтовый поток UTF-8, в котором разрешены только управляющие последовательности \t (горизонтальная табуляция), \r (возврат каретки)
и \n (новая строка). При обратной загрузке версия GUI для Windows преобразует одиночные символы \n
в последовательности \r\n CRLF. При сохранении версия CLI принимает двухбайтовые последовательности символов \+t, \+r, \+n и
преобразует их в соответствующие однобайтовые управляющие символы.
Для шифрования сообщение дополняется нулями, чтобы его длина была кратна 16, а затем вычисляется
sha256(salt+sha256(password)), что даёт 32 двоичных байта, из которых 16 последовательных байтов используются как
вектор инициализации AES-256-CBC, начиная со значения 4-го байта по модулю 16. Ключ AES-256-CBC затем инициализируется как
sha256(sha256(salt+sha256(password))+salt) (использование sha от sha делает чрезвычайно сложной, если не невозможной, атаку по
радужным таблицам на пароль). Соль — Libre Steganography Standard.
Для пикселей все изображения преобразуются в 32-битные упакованные буферы пикселей RGBA. Младшие 2 бита каждого из четырёх каналов используются для хранения 8 бит сообщения (что даёт 1 байт сообщения на 1 несущий пиксель). Для хранения используются только пиксели с альфа-каналом больше 3, и все версии сообщают количество таких пикселей как "Емкость N байт."
Биты 1 байта сообщения (7 старший, 0 младший): 76543210
1 несущий пиксель (альфа последняя, красный первый байт): rrrrrr76 gggggg32 bbbbbb54 aaaaaa10 (a!=0)
(Этот хак с непрозрачностью необходим, потому что кодек WEBP не так уж и без потерь, как утверждается. При альфа-канале больше 3 гарантируется, что пиксель не прозрачен, даже если закодированные биты равны нулю.)
Этот инструмент стеганографии лицензирован на условиях GPLv3+ (или любой более поздней версии этой лицензии). Он статически скомпонован с stb_image (общественное достояние) и libwebp (лицензия BSD-3-Clause). Части SHA-хэша и AES-кодировщика/декодировщика встроены (написаны мной), никакой сторонней криптографической библиотеки не требуется.
С наилучшими пожеланиями, bzt