
Инструмент стеганографии для изображений JPG
jdvrif — это быстрый и удобный инструмент командной строки для стеганографии, позволяющий скрывать и извлекать файлы любого типа с помощью изображения JPG.
Также доступна веб-версия, которую можно использовать сразу же, как удобную альтернативу загрузке и компиляции исходного кода CLI. Загрузка файлов в веб-версии ограничена 20MB.
Для тех, кто интересуется языком Rust, доступен экспериментальный порт jdvrif-rs.

Демонстрационное изображение: «Место сокрытия» / PIN: 2190398302048725932
В отличие от распространённого метода стеганографии, при котором данные скрываются в пикселях изображения-контейнера (LSB), jdvrif скрывает файлы в служебных сегментах изображения JPG.
Вы можете скрыть файл любого типа размером до 2GB, хотя у совместимых сайтов (перечисленных ниже) есть свои, гораздо меньшие лимиты и *другие требования.
Для увеличения ёмкости хранилища и повышения безопасности ваш встроенный файл данных сжимается с помощью libdeflate/zlib — если только это не уже сжатый тип файла размером более 10 МБ — и шифруется с помощью XChaCha20-Poly1305 с использованием криптографической библиотеки libsodium.
jdvrif частично основан на методе, реализованном исследователем безопасности Дэвидом Бьюкененом.
$ sudo apt update
$ sudo apt install g++ cmake ninja-build util-linux libsodium-dev libturbojpeg0-dev zlib1g-dev libdeflate-dev
$ chmod +x compile_jdvrif.sh
$ ./compile_jdvrif.sh
$ sudo cp jdvrif /usr/bin
$ jdvrif
Usage: jdvrif conceal [-b] <cover_image> <secret_file>
jdvrif recover <cover_image>
jdvrif --info
$ jdvrif conceal your_cover_image.jpg your_secret_file.doc
Platform compatibility for output image:-
✓ X-Twitter
✓ Tumblr
✓ Mastodon
✓ Pixelfed
✓ PostImage
✓ ImgBB
✓ ImgPile
✓ Flickr
Saved "file-embedded" JPG image: jrif_4e87c566c.jpg (143029 bytes).
Recovery PIN: [***2166776980318349924***]
Important: Keep your PIN safe, so that you can extract the hidden file.
Complete!
$ jdvrif recover jrif_4e87c566c.jpg
PIN: *******************
Extracted hidden file: your_secret_file.doc (6165 bytes).
Complete! Please check your file.
******************
Примечание: Bluesky теперь сохраняет изображения в формате WEBP по умолчанию.
Чтобы сохранить изображение как JPG и по-прежнему иметь возможность извлекать скрытые данные с помощью jdvrif, сначала щёлкните по изображению в посте, чтобы открыть его, затем щёлкните по нему правой кнопкой мыши. В меню выберите Открыть изображение в новой вкладке.
Перейдите на новую вкладку и в адресной строке перейдите в конец адреса, добавьте @jpg и нажмите Enter.
Щёлкните по изображению правой кнопкой мыши и в меню выберите Сохранить изображение...
Теперь изображение должно загрузиться как JPG, и оно будет работать с jdvrif.
Если вам нужен инструмент для скрытия данных в изображениях WEBP для публикации в Bluesky, вы можете использовать мой CLI-инструмент для стеганографии WEBP — wbpdv
******************
Лимит размера при публикации измеряется суммарным размером изображения-контейнера + сжатого файла данных:
● Flickr (200MB), ImgPile (100MB), ImgBB (32MB),
● PostImage (32MB), Pixelfed (15MB).
Лимит размера измеряется только по размеру сжатого файла данных:
● Mastodon (~6MB), Tumblr (~64KB), X-Twitter (~10KB).
Например, в случае с Mastodon, если ваше изображение-контейнер имеет размер 1MB, вы всё равно можете встроить файл данных размером до ~6MB.
Другое: платформа Bluesky имеет отдельные лимиты размера для изображения-контейнера и сжатого скрытого файла данных:*
● Bluesky (опция -b). Максимальный размер изображения-контейнера: (2,000,000 bytes / ~1.9MB). Максимальный размер вашего сжатого скрытого файла данных (полезной нагрузки): (~171KB). Итоговое встроенное изображение-контейнер (изображение-контейнер + скрытый файл) не должно превышать 2,000,000 байт (~1.9MB).
● Для публикации изображений в Bluesky требуется скрипт "create_bsky_post.py". Более подробная информация приведена ниже на этой странице.
Для таких платформ, как X-Twitter и Tumblr, у которых небольшие лимиты размера, возможно, стоит сосредоточиться на данных, которые хорошо сжимаются, например на текстовых файлах и т.д.
https://github.com/user-attachments/assets/c8c38e6d-ea23-4d67-98d9-cebdcd82b449
https://github.com/user-attachments/assets/88aaa5f7-3272-4d0c-aa59-1a5bfe2f08dc
Аргументы режима jdvrif:
conceal — сжимает, шифрует и встраивает ваш секретный файл данных в изображение-контейнер JPG.
recover — расшифровывает, распаковывает и извлекает скрытый файл данных из изображения-контейнера JPG.
Параметры платформы для режима conceal jdvrif:
"-b" Для создания совместимых изображений JPG со встроенным файлом для публикации на платформе Bluesky необходимо использовать опцию -b в режиме conceal.
$ jdvrif conceal -b my_image.jpg hidden.doc
Эти изображения совместимы только для публикации в Bluesky. Если опубликовать их на другой платформе, встроенный файл данных будет удалён.
Вам также необходимо использовать Python-скрипт create_bsky_post.py (находится в папке src/bsky репозитория) для публикации изображения в Bluesky. Это не будет работать, если вы публикуете изображения в Bluesky через веб-сайт или мобильное приложение.
Для использования скрипта вам потребуется создать пароль приложения в своей учётной записи Bluesky.
Базовые примеры использования приведены в скрипте create_bsky_post.py в папке src/bsky.
https://github.com/user-attachments/assets/b4c72ea7-40e3-49b0-89aa-ae2dd8ccccb9
libsodium — генерация криптографических случайных чисел, деривация ключей Argon2id и секретные потоки XChaCha20-Poly1305. Динамически подключается как системная библиотека.
Лицензия: ISC License
Copyright (c) 2013–2026 Frank Denis.
libjpeg-turbo — обработка JPEG и преобразование без потерь. Динамически подключается как системная библиотека.
Это программное обеспечение частично основано на работе Independent JPEG Group.
Лицензии: Independent JPEG Group License, Modified BSD 3-Clause License, and zlib License.
Copyright © 1991–2020 Thomas G. Lane and Guido Vollbeding.
Copyright © 2009–2023 D. R. Commander. All Rights Reserved.
Copyright © 2015 Viktor Szathmáry. All Rights Reserved.
zlib — поточное сжатие и распаковка zlib. Динамически подключается как системная библиотека.
Лицензия: zlib License
Copyright (C) 1995–2026 Jean-loup Gailly and Mark Adler.
libdeflate — быстрое сжатие всего буфера в формате zlib. Динамически подключается как системная библиотека.
Лицензия: MIT
Copyright 2016 Eric Biggers.
Copyright 2024 Google LLC.
base64simd — кодировщик Base64 AVX2 адаптирован из векторной реализации Base64 Войцеха Мулы.
Лицензия: BSD 2-Clause
Copyright (c) 2015–2018, Wojciech Muła. All rights reserved.
Compact ICC Profiles — встроенный ICC-профиль, совместимый с Adobe.
Лицензия: CC0 1.0 Universal
Bryan Newbold / ATProto Hacker Cookbook — create_bsky_post.py — основа для форкнутого помощника публикации в Bluesky (src/bsky/bsky_post.py). Для справки см. копию из Cookbook
Лицензия: CC0 1.0 Universal.
Requests — HTTP-запросы и запросы к API Bluesky.
Лицензия: Apache 2.0 / NOTICE
Copyright 2019 Kenneth Reitz.
Beautiful Soup 4 — разбор HTML и метаданных Open Graph.
Лицензия: MIT
Copyright (c) Leonard Richardson.
Pillow — проверка изображений, работа с размерами и соотношением сторон.
Лицензия: MIT-CMU
PIL copyright © 1997–2011 Secret Labs AB and © 1995–2011 Fredrik Lundh and contributors.
Pillow copyright © 2010 Jeffrey “Alex” Clark and contributors.