Вне поля зрения - это неуместно - они никогда не узнают!

Стеганография - это практика сокрытия сообщений или информации в другом несекретном тексте или данных. Используя следующий код Python, вы можете скрыть текстовые сообщения в файлах изображений, и человеческий глаз не сможет увидеть никаких изменений в изображении файла. Они не будут знать того, чего не знают.

Всего лишь крошечное изменение

Итак, как вообще можно скрыть сотни строк текста на картинке, чтобы никто не заметил изменения? Если вы проверите свойства файла изображения, вы обнаружите, что его ширина и высота выражены в пикселях - мельчайших точках визуальной информации. При загрузке в память с помощью NumPy каждый пиксель содержит три байта информации: по одному для красного, зеленого и синего цветов. Мы можем разделить наш секретный текст на крошечные биты, или единицы и нули, и сохранить эти биты в младших битах каждого байта цвета.

Почему вы не видите никаких изменений в изображении?

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

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

Гайки и болты Кодекса

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

Вот первая программа под названием txt_hide.py. Некоторое объяснение того, как это работает, следует за этим листингом кода:

В эту программу импортированы три библиотеки. Tkinter является частью стандартной установки Python, но два других (PIL и NumPy) необходимо установить, если вы еще этого не сделали. Самый простой способ установить их - использовать pip install Pillow и pip install numpy в командной строке или в окне терминала. Я добавил эти две команды в комментарии в верхней части списка для удобства.

При запуске программы появляются два диалоговых окна, оба из которых предоставляются библиотекой tkinter. Первый запрашивает файл изображения PNG для вставки секретного сообщения, а другой запрашивает текст секретного сообщения. Я выбрал диалоговое окно askstring() вместо оператора input() Python, потому что он позволяет вставлять блок из многих строк текста из буфера обмена с символами новой строки в конце каждой строки.

NumPy спешит на помощь

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

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

Примечание. Я предлагаю сделать копию файла изображения PNG во время экспериментов с этим кодом. Любые опечатки могут испортить ваш файл изображения.

Извлечение секретного сообщения

Вторая программа, названная txt_show.py, обращает процесс извлечения секретного сообщения из файла изображения PNG. Вот исходный код:

Некоторые части этой программы очень похожи на то, что находится в первом списке. Импортируются те же библиотеки, и тот же диалог tkinter используется для запроса файла PNG. Код с изменением битов, лежащий в основе этой программы, извлекает младшие биты из массива байтов изображения и перестраивает секретное текстовое сообщение.

Это конец нашей передачи

Если вы внимательно посмотрели на исходный код, вы могли заметить специальный символ, добавленный в конец секретного сообщения, и наблюдали за ним в процессе извлечения. End of xmit обозначается в стандартном коде ASCII символом с числовым значением 4. Я выбрал это как специальный маркер, чтобы обозначить конец секретного текста. В нормальных условиях этот символ не должен отображаться ни в каком обычном тексте, который вы вводите или копируете и вставляете в качестве ввода.

Повторно используемые изображения

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

Спасибо за прочтение!