Предисловие
В последнее время я заметил, что людям на моем форуме стала интересна тема стеганографии различных текстов в изображениях, mp3-файлах и видео. И тут у меня возникла идея написать свой скрипт для стеганографии текста в изображениях. Скажу сразу прежде я ни разу не сталкивался с написанием подобных инструментов для стеганографии.
Прежде, чем познакомиться с LSB-стеганографией я рассматривал другие способы, точнее сказать придумывал свои. Но у меня не хватило сил придумать, что-то свое и я решил загуглить:
LSB — метод стеганографии, при котором меняются младшие биты одного из RGB цветов в пикселе на биты кодируемого текста.
Потом я познакомился с библиотекой Pillow для работы с изображениями и Cryptography. Вторая в моем случае была нужна для создания DES-шифрования, которое впоследствии будет закодировано побитно в изображение.
Кодирование
Свое детище я выложил на GitHub, поэтому для дальнейшей работы со StegoPy нам нужно будет просто склонировать проект с GitHub:
> git clone https://github.com/eBind/StegoPy
> cd StegoPy
> pip3 install -r requirements.txt
> python3 stegopy.py
Впрочем все как обычно в плане установки. А сейчас давайте разберем синтаксис команд запуска.
> python3 stegopy.py -e in.jpg data.txt
Данной командой мы закодируем текст из файла data.txt в изображение in.jpg
Но перед кодированием у нас запросят баланс, который может быть от 1 до 4. Это как раз одна из самых интересных вещей в программе.
Баланс — это количество младших битов задействованных в стеганографии. Оно колеблется от 1 до 4.
Соответственно, чем больше баланс, тем:
- Меньше пикселей будет задействованно в кодировании
- Заметнее изменения в цветовых каналах
Из этого можно сделать вывод о том, что чем меньше баланс, тем выше надежность стеганографии и она будет незаметна человеческому глазу.
Еще один немаловажный фактор это то, что изменяется лишь синий канал, оттенки которого наименее заметны для нашего глаза.
После того, как мы определились с балансом, наш скрипт создаст два дополнительных файла:
- out.png — изображение с закодированным текстом
- key.dat — файл с ключом, который нужен для расшифровки
Декодирование
Синтаксис команды в нашем случае:
> python3 ./stegopy.py -d out.png
Затем нас спросят ключ, который мы получили при кодировании. После декодирования расшифрованный текст сохранится в файле out.txt
Как вы могли заметить входное изображение имеет формат JPEG, а на выходе PNG. Это является недоработкой программы, которая в скором времени будет пофикшена и у вас будет возможность выбора выходного формата.
На входном изображении тестировались только JPEG и PNG, теоретически должно работать и на менее используемых, таких как bmp и так далее.
К слову pylint оценил StegoPy на 10/10. Приветствуются замечания к коду и функционалу поскольку я планирую развивать приложение.
> Проект доступен на GitHub
bungu
Понравился проект. Я пару лет назад делал подобное, но мой скрипт сильно «ломал» изображение и было понятно что с ним что-то не то. Хотелось бы узнать какое количество данных можно записать в картинку (например в вашу из примера)
Flork Автор
Количество данных зависит от выбранного баланса. Если выбрать 4, то на один символ будет приходиться по 2 пикселя. Если выбрать 1, то на каждый символ будет по 8 пикселей.
Что касается моего изображения, то максимум туда можно закодировать около 120000 символов.
Я подсчитал, если взять изображение 4096x4096, то в него можно закодировать текст, в три раза больше романа «Война и мир».
Еще конечно нужно учитывать последующее DES-шифрование, которое делает текст немного больше.