[PYTHON:TODAY]
472 subscribers

Стеганография Python | Скрываем текст в изображении

435 full reads
964 story viewsUnique page visitors
435 read the story to the endThat's 45% of the total page views
2 minutes — average reading time

Друзья всем привет, вы на канале PYTHONTODAY, добро пожаловать в рубрику #tipsandtricks , в которой мы создаём интересные, полезные и весьма простые программы на языке Python.

Сегодня мы поговорим о стеганографии и напишем свою собственную программу для сокрытия текста в изображениях.

pythontoday
pythontoday

В век высоких технологий информация представляется наибольшей ценностью. Поэтому неудивительно, что в последнее время создаётся множество средств для её защиты.

Стеганография - это способ передачи или хранения информации с учётом сохранения в тайне самого факта такой передачи.

Идеей я вдохновился пересматривая сериал Мистер Робот. Главный герой с завидным постоянством скрывал данные как в изображениях так и в других медиа файлах.

Mr.Robot
Mr.Robot

Если вы прячете пароли от email в заметках или записываете на листке бумаги пряча в сейф, злоумышленник может прямо догадаться где их искать.

В случае же со стеганографией у него нет никаких зацепок где искать сокрытые и к тому же зашифрованные данные как и собственно нет никаких намёков на то, что где-то, что-то вообще спрятано, ведь всё перед глазами . Не придёт же ему в голову, что в папке с вашими выпускными фото, в одной из 300 фотографий записаны ваши секреты.

Окей. Думаю с теорией мало-мальски мы разобрались. Давайте напишем простую программу которая будет записывать и как следствие скрывать текст в изображении.

Знакомство со стеганографией я решил начать с готовых библиотек.

Установим необходимую нам сейчас библиотеку stegano:

pythontoday
pythontoday

И импортируем нужный нам модуль lsb:

pythontoday
pythontoday

lsb это метод стеганографии, при котором меняются младшие биты одного из RGB цветов в пикселе на биты кодируемого текста.

Давайте для начала поработаем с PNG изображением.

Создадим переменную secret, обращаемся к модулю lsb и вызываем у него метод hide:

pythontoday
pythontoday

Который будет принимать несколько параметров. Первый - это путь до нашего изображения. А второй параметр - это секретное сообщение или текст который мы хотим записать и сделать невидимым для посторонних глаз:

pythontoday
pythontoday

Далее вызываем метод save в который в качестве параметра передаём имя нового изображения:

pythontoday
pythontoday

Запустим наш код. И рядом с исходным файлом изображения появился только что нами созданный. Изображения полностью идентичны:

pythontoday
pythontoday

Отлично. Давайте напишем весьма простой код для чтения.

Обращаемся к модулю lsb и вызываем у него метод reveal передав в него путь до нашего изображения с изюминкой:

pythontoday
pythontoday

Распечатаем результат. И видим наш скрытый текст:

pythontoday
pythontoday

Отлично. При работе с библиотекой stegano и модулем lsb я столкнулся с проблемой кодировки. А точнее с восприятием кириллицы, данный метод наотрез отказывается работать с ней. Дошло до того, что уже приступил к написанию своего модуля. Хотя может где-то косячу и если у вас получится распознать кириллицу, обязательно напишите в комментариях, буду благодарен.

Данной проблемы нет при работе с jpg форматом и модулем exifHeader. Возможно стоит более детально покопаться у него в коде и получится решить задачу с кодировкой. Но, не сегодня.

Импортируем модуль:

pythontoday
pythontoday

Создадим переменную secret, обращаемся к модулю exifHeader и вызываем у него метод hide, он схож с методом модуля lsb с отличием в том, что вторым параметром мы передаём путь до изображения в котором будет скрыто сообщение, а третьим само сообщение.

pythontoday
pythontoday

Запускаем скрипт. Готово. Для того, чтобы распечатать сообщение также воспользуемся методом reveal, передав в него путь до изображения:

pythontoday
pythontoday

Воспользуемся методом decode и распечатаем результат.

pythontoday
pythontoday

Всё отлично отрабатывает.

Давайте дальше напишем код, который помимо записи текста в изображение, будет ещё генерировать ключ, расшифровка сообщения без которого становится весьма затруднительной. А может и невозможной, ведь среди 300 твоих фоток с выпускного надо ещё найти фото с любимой математичкой.

Установим библиотеки wheel  и steganocryptopy:

pythontoday
pythontoday

Импортируем нужный нам модуль:

pythontoday
pythontoday

Первым делом давайте сгенерируем ключ, вызвав метод generate_key у модуля Steganography. В параметры передаём путь, куда мы хотим сохранить файл с ключом:

pythontoday
pythontoday

Запустим наш код. И видим что в директории появился файл key.key. Который содержит внутри сгенерированный модулем ключ.

Создаём экземпляр класса Steganography, вызываем метод encrypt и в качестве параметров передаём путь нашего ключа, затем наше изображение и путь до файла в котором будет содержаться секретное сообщение. Далее вызываем метод save передав в него имя нового файла, в котором будет содержаться зашифрованное сообщение и запускаем наш код:

pythontoday
pythontoday

Отлично. У нас появился новый файл с изображением, ничем не отличающимся от исходного. Давайте попробуем расшифровать сообщение.

Обращаемся к методу decrypt и в качестве первого параметра указываем путь до ключа, а вторым путь до нашего изображения и распечатаем результат:

pythontoday
pythontoday

Всё отлично работает. Код из видео доступен в телеграм канале. Enjoy!
Видео с подробным объяснением вы можете посмотреть
На YouTube канале PYTHONTODAY на котором найдете видеоуроки:

  • - по созданию ботов
  • - парсингу сайтов
  • - приложений на смартфон
  • - машинному обучению и big data с нуля

Освой сетевую безопасность, и задавай вопросы в клубе.

Вступай в клуб Python разработчиков!

Читайте так-же:

Конвертер текста в аудио на Python

Полный гайд по строкам в Python

Числа в Python

Настраиваем свой VPN

Как узнать процент заряда батареи на Python

Установка Python на Windows

Списки и методы списков в Python

Спасибо, что дочитали до конца. Вы меня очень поддержите, если поставите "Лайк", оставите комментарий или ПОДПИШИТЕСЬ на мой канал :)