Друзья всем привет, вы на канале PYTHONTODAY, добро пожаловать в рубрику #tipsandtricks , в которой мы создаём интересные, полезные и весьма простые программы на языке Python.
Сегодня мы поговорим о стеганографии и напишем свою собственную программу для сокрытия текста в изображениях.
В век высоких технологий информация представляется наибольшей ценностью. Поэтому неудивительно, что в последнее время создаётся множество средств для её защиты.
Стеганография - это способ передачи или хранения информации с учётом сохранения в тайне самого факта такой передачи.
Идеей я вдохновился пересматривая сериал Мистер Робот. Главный герой с завидным постоянством скрывал данные как в изображениях так и в других медиа файлах.
Если вы прячете пароли от email в заметках или записываете на листке бумаги пряча в сейф, злоумышленник может прямо догадаться где их искать.
В случае же со стеганографией у него нет никаких зацепок где искать сокрытые и к тому же зашифрованные данные как и собственно нет никаких намёков на то, что где-то, что-то вообще спрятано, ведь всё перед глазами . Не придёт же ему в голову, что в папке с вашими выпускными фото, в одной из 300 фотографий записаны ваши секреты.
Окей. Думаю с теорией мало-мальски мы разобрались. Давайте напишем простую программу которая будет записывать и как следствие скрывать текст в изображении.
Знакомство со стеганографией я решил начать с готовых библиотек.
Установим необходимую нам сейчас библиотеку stegano:
И импортируем нужный нам модуль lsb:
lsb это метод стеганографии, при котором меняются младшие биты одного из RGB цветов в пикселе на биты кодируемого текста.
Давайте для начала поработаем с PNG изображением.
Создадим переменную secret, обращаемся к модулю lsb и вызываем у него метод hide:
Который будет принимать несколько параметров. Первый - это путь до нашего изображения. А второй параметр - это секретное сообщение или текст который мы хотим записать и сделать невидимым для посторонних глаз:
Далее вызываем метод save в который в качестве параметра передаём имя нового изображения:
Запустим наш код. И рядом с исходным файлом изображения появился только что нами созданный. Изображения полностью идентичны:
Отлично. Давайте напишем весьма простой код для чтения.
Обращаемся к модулю lsb и вызываем у него метод reveal передав в него путь до нашего изображения с изюминкой:
Распечатаем результат. И видим наш скрытый текст:
Отлично. При работе с библиотекой stegano и модулем lsb я столкнулся с проблемой кодировки. А точнее с восприятием кириллицы, данный метод наотрез отказывается работать с ней. Дошло до того, что уже приступил к написанию своего модуля. Хотя может где-то косячу и если у вас получится распознать кириллицу, обязательно напишите в комментариях, буду благодарен.
Данной проблемы нет при работе с jpg форматом и модулем exifHeader. Возможно стоит более детально покопаться у него в коде и получится решить задачу с кодировкой. Но, не сегодня.
Импортируем модуль:
Создадим переменную secret, обращаемся к модулю exifHeader и вызываем у него метод hide, он схож с методом модуля lsb с отличием в том, что вторым параметром мы передаём путь до изображения в котором будет скрыто сообщение, а третьим само сообщение.
Запускаем скрипт. Готово. Для того, чтобы распечатать сообщение также воспользуемся методом reveal, передав в него путь до изображения:
Воспользуемся методом decode и распечатаем результат.
Всё отлично отрабатывает.
Давайте дальше напишем код, который помимо записи текста в изображение, будет ещё генерировать ключ, расшифровка сообщения без которого становится весьма затруднительной. А может и невозможной, ведь среди 300 твоих фоток с выпускного надо ещё найти фото с любимой математичкой.
Установим библиотеки wheel и steganocryptopy:
Импортируем нужный нам модуль:
Первым делом давайте сгенерируем ключ, вызвав метод generate_key у модуля Steganography. В параметры передаём путь, куда мы хотим сохранить файл с ключом:
Запустим наш код. И видим что в директории появился файл key.key. Который содержит внутри сгенерированный модулем ключ.
Создаём экземпляр класса Steganography, вызываем метод encrypt и в качестве параметров передаём путь нашего ключа, затем наше изображение и путь до файла в котором будет содержаться секретное сообщение. Далее вызываем метод save передав в него имя нового файла, в котором будет содержаться зашифрованное сообщение и запускаем наш код:
Отлично. У нас появился новый файл с изображением, ничем не отличающимся от исходного. Давайте попробуем расшифровать сообщение.
Обращаемся к методу decrypt и в качестве первого параметра указываем путь до ключа, а вторым путь до нашего изображения и распечатаем результат:
Всё отлично работает. Код из видео доступен в телеграм канале. Enjoy!
Видео с подробным объяснением вы можете посмотреть На YouTube канале PYTHONTODAY на котором найдете видеоуроки:
- - по созданию ботов
- - парсингу сайтов
- - приложений на смартфон
- - машинному обучению и big data с нуля
Освой сетевую безопасность, и задавай вопросы в клубе.
Вступай в клуб Python разработчиков!
Читайте так-же:
Конвертер текста в аудио на Python
Полный гайд по строкам в Python
Числа в Python
Настраиваем свой VPN
Как узнать процент заряда батареи на Python
Установка Python на Windows
Списки и методы списков в Python
Спасибо, что дочитали до конца. Вы меня очень поддержите, если поставите "Лайк", оставите комментарий или ПОДПИШИТЕСЬ на мой канал :)