Изучите искусство стеганографии изображений

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

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

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

Но прежде чем углубиться в это, давайте посмотрим, из чего состоит изображение.

  1. Пиксели - это строительные блоки изображения.
  2. Каждый пиксель содержит три значения: (красный, зеленый, синий), также известные как значения RGB.
  3. Каждое значение RGB находится в диапазоне от 0 до 255.

Этого количества информации достаточно, чтобы начать работу.

Теперь давайте посмотрим, как мы можем кодировать и декодировать данные в нашем изображении.

Кодирование

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

Алгоритм следующий:

  1. Для каждого символа в данных берется его значение ASCII и преобразуется в 8-битный двоичный код [1].
  2. Одновременно считываются три пикселя, что в сумме дает 3 * 3 = 9 значений RGB. Первые восемь значений RGB используются для хранения одного символа, который преобразуется в 8-битный двоичный файл.
  3. Соответствующее значение RGB и двоичные данные сравниваются. Если двоичная цифра равна 1, то значение RGB преобразуется в нечетное, а в противном случае - в четное.
  4. Девятое значение определяет, нужно ли читать больше пикселей или нет. Если есть еще данные, которые нужно прочитать, то есть закодировать или декодировать, то девятый пиксель изменится на четный. В противном случае, если мы хотим перестать считывать пиксели дальше, сделайте это странным.

Повторяйте этот процесс, пока все данные не будут закодированы в изображение.

Пример

Предположим, что сообщение, которое нужно скрыть, ‘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.

Точно так же 64gets преобразуется в 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)]

Расшифровка

Для декодирования мы попытаемся найти, как изменить предыдущий алгоритм, который мы использовали для кодирования данных.

  1. Опять же, одновременно считываются три пикселя. Первые 8 значений RGB дают нам информацию о секретных данных, а девятое значение говорит нам, двигаться вперед или нет.
  2. Для первых восьми значений, если значение нечетное, то двоичный бит равен 1, в противном случае - 0.
  3. Биты объединяются в строку, и через каждые три пикселя мы получаем байт секретных данных, что означает один символ.
  4. Теперь, если девятое значение четное, мы продолжаем считывать пиксели по три за раз, иначе мы останавливаемся.

Например

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

Рассмотрим наше ранее закодированное изображение.

[(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 использует сжатие с потерями, что означает, что пиксели изменяются для сжатия изображения и снижения качества, поэтому происходит потеря данных.

Ссылки

  1. Https://www.geeksforgeeks.org/program-decimal-binary-conversion/
  2. Https://www.geeksforgeeks.org/working-images-python/
  3. Https://dev.to/erikwhiting88/let-s-hide-a-secret-message-in-an-image-with-python-and-opencv-1jf5
  4. Код вместе с зависимостями можно найти здесь: https://github.com/goelashwin36/image-steganography

Не забывайте оставлять аплодисменты, если вам понравился блог :)

Давайте подключимся?

LinkedIn: https://linkedin.com/in/ashwigoel

Сайт: https://ashwingoel.com

Электронная почта: [email protected]