Стеганография - это открытая передача письма с зашифрованным тайным посланием при сокрытии факта передачи тайного послания. Например если отослать другу сообщение "Петя очень много ожесточённо говорил Илье" (ни на что другое фантазии не хватило), все подумают, что это обычное сообщение, но если прочитать первые буквы каждого слова, то вы поймёте настоящее, скрытое послание.
Так вот, послания можно зашифровывать не только в тексте, но и в изображениях, с помощью lsb шифрования. Сейчас я поэтапно расскажу как это работает.
Кодирование одного пикселя
Сначала разберёмся как работает шифровка на примере одного пикселя. В одном пикселе можно передать 3 бита, пусть это будут 110. Возьмём код цвета этого пикселя, пусть это будет (73, 12, 245), такой сине-фиолетовый цвет. Теперь поочерёдно с каждым из этих трёх значений проделаем несколько операций.
Возьмём сначала 73, преобразуем в двоичный код: 1001001. А теперь заменим младший бит этого числа на первый из битов, которые мы хотим зашифровать. Младший бит - это последняя цифра числа, то есть 1, первый бит, который мы шифруем - тоже 1, значит ничего менять не нужно.
Теперь 12, в двоичной: 1100. Меняем последнюю цифру на 1, получаем 1101, в десятичной - 13.
Далее 245, в двоичной: 10111111010101. Последнюю цифру меняем на 0, получим 10111111010100, это 244 в десятичной.
Теперь код нашего пикселя стал равен (73, 13, 244).
Кодировка текста в биты
Все символы текста в любой кодировке имеют свои номера, нужно только преобразовать эти номера в двоичный код. Например Hello world в UTF-8 выглядит как 00480065006c006c006f00200077006f0072006c0064, нам остаётся просто преобразовать каждые 4 символа этого числа из 16-ричной в двоичную систему и разбить на биты. Можно зашифровывать.
Процесс шифровки
Пусть мы зашифровываем строку "Hello world", тогда она сначала преобразуется в строку "11:Hello world", где 11 - это количество символов в строке. Это нужно для того, чтобы дешифровщик мог понять, на каком пикселе ему нужно закончить расшифровку.
Далее строка превращается в биты, в цикле берётся по 3 последовательных бита и зашифровываются в один пиксель. Все пиксели идут по заданному порядку.
Процесс дешифрации
Программа идёт по значениям цвета пикселей, с самого начала. Сначала она расшифровывает сколько всего пикселей ей нужно расшифровать, узнав длину сообщения, а потом расшифровывает их все и записывает в строку. Потом строка из бинарного кода декодируется обратно в текст. Вуаля! Передача сообщения прошла успешно.
Реализация на python
В python есть библиотека stegano для таких задач (а конкретно модуль lsb), сначала сделаем основную программу для шифровки:
Тут всё понятно, text_to_img() шифрует, а img_to_text() дешифрует.
Теперь напишем под это дело телеграм бота:
Конечно, реализация самая простая, изображение, в которое записываются данные только одно, оно лежит на сервере, пользователь не может выбрать. Но давайте проверим как бот работает. Буду использовать это изображение:
Запустим и напишем "Привет":
Работает!
Тут обязательно нужно отправлять изображения без сжатия, иначе вся кодировка слетит и послание будет не расшифровать.
В дальнейшем можно будет шифровать данные не в подряд идущие пиксели, а в разбросанные псевдо-рандомно, по сиду, а сид уже передать другу, который будет получать послание, он будет выступать в качестве пароля. Тогда шифровку сможет сломать только тот, у кого есть сид. Может быть я это как-нибудь реализую, но позже. Сейчас я просто хотел рассказать как работает lsb шифрование и как его использовать. Для большей информации можете покопаться в коде модуля lsb (я для написания статьи так и сделал), может чего интересного найдёте.
А я прощаюсь, ещё увидимся, пока!