Изучите искусство стеганографии изображений
Стеганография - это искусство сокрытия секретных данных в любом файле.
Секретные данные могут быть данными любого формата, такими как текст или даже файл. Вкратце, основной мотив стеганографии - скрыть предполагаемую информацию в любом файле, обычно в изображении, аудио или видео, без фактического изменения внешнего вида файла, то есть он должен выглядеть так же, как и раньше.
В этом блоге мы сосредоточимся на изучении стеганографии на основе изображений, то есть сокрытии секретных данных в изображении.
Но прежде чем углубиться в это, давайте посмотрим, из чего состоит изображение.
- Пиксели - это строительные блоки изображения.
- Каждый пиксель содержит три значения: (красный, зеленый, синий), также известные как значения RGB.
- Каждое значение RGB находится в диапазоне от 0 до 255.
Этого количества информации достаточно, чтобы начать работу.
Теперь давайте посмотрим, как мы можем кодировать и декодировать данные в нашем изображении.
Кодирование
Существует множество алгоритмов, которые можно использовать для кодирования данных в изображение, и, по сути, вы также можете создать один из них самостоятельно. Тот, который используется в этом блоге, также легко понять и реализовать.
Алгоритм следующий:
- Для каждого символа в данных берется его значение ASCII и преобразуется в 8-битный двоичный код [1].
- Одновременно считываются три пикселя, что в сумме дает 3 * 3 = 9 значений RGB. Первые восемь значений RGB используются для хранения одного символа, который преобразуется в 8-битный двоичный файл.
- Соответствующее значение RGB и двоичные данные сравниваются. Если двоичная цифра равна 1, то значение RGB преобразуется в нечетное, а в противном случае - в четное.
- Девятое значение определяет, нужно ли читать больше пикселей или нет. Если есть еще данные, которые нужно прочитать, то есть закодировать или декодировать, то девятый пиксель изменится на четный. В противном случае, если мы хотим перестать считывать пиксели дальше, сделайте это странным.
Повторяйте этот процесс, пока все данные не будут закодированы в изображение.
Пример
Предположим, что сообщение, которое нужно скрыть, ‘Hii’
.
Сообщение состоит из трех байтов, поэтому для кодирования данных требуются пиксели 3 x 3 = 9. Рассмотрим изображение 4 x 3 с общим количеством 12 пикселей, которых достаточно для кодирования данных.
[(27, 64, 164), (248, 244, 194), (174, 246, 250), (149, 95, 232), (188, 156, 169), (71, 167, 127), (132, 173, 97), (113, 69, 206), (255, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]
Шаг 1
Значение ASCII H
- 72, двоичный эквивалент которого - 01001000
.
Шаг 2
Прочтите первые три пикселя.
(27, 64, 164), (248, 244, 194), (174, 246, 250)
Шаг 3
Теперь измените значение пикселя на нечетное для 1 и на четное для 0, как в двоичном эквиваленте данных.
Например, первая двоичная цифра 0
, а первое значение RGB - 27
, его необходимо преобразовать в четное, что подразумевает 26
.
Точно так же 64
gets преобразуется в 63
, потому что следующая двоичная цифра - 1
, поэтому значение RGB следует сделать нечетным.
Итак, модифицированные пиксели:
(26, 63, 164), (248, 243, 194), (174, 246, 250)
Шаг 4
Поскольку нам нужно кодировать больше данных, последнее значение должно быть четным. Точно так же i
можно закодировать в этом изображении.
Делая значения пикселей нечетными / четными, выполняя +1 или -1, вы должны позаботиться о двоичных условиях. То есть значение пикселя должно быть больше или равно 0 и меньше или равно 255.
Новое изображение будет выглядеть так:
[(26, 63, 164), (248, 243, 194), (174, 246, 250), (148, 95, 231), (188, 155, 168), (70, 167, 126), (132, 173, 97), (112, 69, 206), (254, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]
Расшифровка
Для декодирования мы попытаемся найти, как изменить предыдущий алгоритм, который мы использовали для кодирования данных.
- Опять же, одновременно считываются три пикселя. Первые 8 значений RGB дают нам информацию о секретных данных, а девятое значение говорит нам, двигаться вперед или нет.
- Для первых восьми значений, если значение нечетное, то двоичный бит равен
1
, в противном случае -0
. - Биты объединяются в строку, и через каждые три пикселя мы получаем байт секретных данных, что означает один символ.
- Теперь, если девятое значение четное, мы продолжаем считывать пиксели по три за раз, иначе мы останавливаемся.
Например
Давайте начнем читать по три пикселя за раз.
Рассмотрим наше ранее закодированное изображение.
[(26, 63, 164), (248, 243, 194), (174, 246, 250), (148, 95, 231), (188, 155, 168), (70, 167, 126), (132, 173, 97), (112, 69, 206), (254, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]
Шаг 1
Сначала мы читаем три пикселя:
[(26, 63, 164), (248, 243, 194), (174, 246, 250)
Шаг 2
Чтение первого значения: 26
, которое четное, поэтому двоичный бит равен 0
. Точно так же для 63
двоичный бит равен 1
, а для 164
- 0
. Этот процесс продолжается до восьми значений RGB.
Шаг 3
Наконец, мы получаем двоичное значение: 01001000
после объединения всех отдельных двоичных значений. Конечные двоичные данные соответствуют десятичному значению 72, а в ASCII они представляют собой символ H
.
Шаг 4
Поскольку девятое значение четное, повторяем описанные выше действия. Мы останавливаемся, когда встречающееся девятое значение оказывается нечетным.
В результате мы получаем наше исходное сообщение, которое было Hii
.
Программа Python для вышеуказанного алгоритма выглядит следующим образом:
В программе используется модуль PIL , который расшифровывается как Python Imaging Library. Это дает нам возможность выполнять операции с изображениями в Python.
Выполнение программы
Входное изображение
Выходное изображение
Ограничения
Эта программа может не работать должным образом с изображениями JPEG , потому что JPEG использует сжатие с потерями, что означает, что пиксели изменяются для сжатия изображения и снижения качества, поэтому происходит потеря данных.
Ссылки
- Https://www.geeksforgeeks.org/program-decimal-binary-conversion/
- Https://www.geeksforgeeks.org/working-images-python/
- Https://dev.to/erikwhiting88/let-s-hide-a-secret-message-in-an-image-with-python-and-opencv-1jf5
- Код вместе с зависимостями можно найти здесь: https://github.com/goelashwin36/image-steganography
Не забывайте оставлять аплодисменты, если вам понравился блог :)
Давайте подключимся?
LinkedIn: https://linkedin.com/in/ashwigoel
Сайт: https://ashwingoel.com
Электронная почта: [email protected]