Запись произвольного стего методом LSB в контейнер, содержащей случайный сигнал, полученный с помощью функции rnd

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:38, 1 июня 2017.
Open book.svg Авторство
А. Дудин
Согласовано: 2011

Описание задачи

Решаемая задача

  1. В контейнере в виде файла управляемого объема, содержащего реализацию случайного сигнала, полученной с помощью функции rnd(.) записать произвольно выбранное стего методом LSB. (см. конспект и материалы кафедральной энциклопедии)
  2. Восстановить стего по известному ключу.

Исходные данные

  1. LSB_with_rndpicture.xmcd - MathCad 14 файл, содержащий исполняемый код
  2. stego.txt – текстовый файл, в который помещается исходный текст для сокрытия

Сам код очень подробно прокомментирован, и скорее всего вопросов возникнуть не должно.

В stego.txt помещается текст, в зависимости от его размера создаются 2 изображения:

  • RGB_before_stego.bmp – псевдослучайное изображение, размера необходимого для сокрытия текста из stego.txt
  • RGB_stego.bmp – изображение RGB_before_stego.bmp со скрытым в нем текстом из stego.txt

Все промежуточные результаты демонстрируются по тексту кода, конечное стего сравнивается с исходным в конце программы.

Решение задачи

LSB (Least Significant Bit, наименьший значащий бит) — суть этого метода заключается в замене последних значащих битов в контейнере (изображения, аудио или видеозаписи) на биты скрываемого сообщения. Разница между пустым и заполненным контейнерами должна быть не ощутима для органов восприятия человека.

Суть метода заключается в следующем: Допустим, имеется 8-битное изображение в градациях серого. 00h (00000000b) обозначает черный цвет, FFh (11111111b) — белый. Всего имеется 256 градаций (28). Также предположим, что сообщение состоит из 1 байта — например, 01101011b. При использовании 2 младших бит в описаниях пикселей, нам потребуется 4 пикселя. Допустим, они черного цвета. Тогда пиксели, содержащие скрытое сообщение, будут выглядеть следующим образом: 00000001 00000010 00000010 00000011. Тогда цвет пикселей изменится: первого — на 1/255, второго и третьего — на 2/255 и четвертого — на 3/255. Такие градации, мало того что незаметны для человека, могут вообще не отобразиться при использовании низкокачественных устройств вывода.

В контейнере в виде файла управляемого объема записать произвольно выбранное стего методом LSB

Первоначально производим чтение текста из файла и сохранение его в массив битов, что будет гораздо удобнее для обработки

Чтение файла stego.txt, который содержит исходный текст byte_string := READBIN("stego.txt", "byte")

OiRS Dudin LSB byte stringT.png

Проверка корректного чтения из файла K := vec2str(byte_string)

OiRS Dudin LSB K2.png

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

OiRS Dudin bit vector.png
OiRS Dudin bit vectorT.png

На втором шаге создадим изображение(контейнер) управляемого объема. Объем будет зависеть от размера исходного текста. В нашем случае в каждый байт контейнера будет сокрыт один бит исходного текста.

Определяем количество пикселей, которые потребуются для сокрытая текста. Также учитываем последний байт - флаг завершения текста. size := 8*(rows(bit_vector) + 8) = 7.245 * 10^4

Определяем сторону

OiRS Dudin LSB side.png

Задаем функцию, содержащюю реализацию случайного сигнала, полученную с помощью функции rnd(.)

OiRS Dudin LSB f row col.png

Создаем матрицы, размером side*side, которые будут содержать случайные значения интенсивности для каждого из цветов RGB R := f(side, side) G := f(side, side) B := f(side, side)

Объединяем их вместе - собираем изображение RGB := augment(R, G, B)

OiRS Dudin LSB Rtable.png
R
OiRS Dudin LSB Gtable.png
G
OiRS Dudin LSB Btable.png
B


RGB

Производим запись в файл для проверки правильности создания изображения WRITERGB("RGB_before_stego.bmp") := RGB

На третьем шаге производим непосредственное сокрытие текста в созданном ранее изображении

Непосредственное сокрытие информации.

В циклах строка-столбец в каждом байте изображения (пикселе) происходит удаление последнего значащего бита, а потом запись информационного бита, полученного ранее из текста. Цикл заканчивается, когда оканчивается битовая информационная последовательность

OiRS Dudin LSB LSB.png

Записываем в файл полученное изображение со скрытым в него текстом WRITERGB("RGB_stego.bmp") := LSB

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

Восстановление информации из изображения

Восстановление информации

  1. Загружаем стего-изображение
  2. Производим обнуление внутренних переменных
  3. Запускаем 2 цикла (строка-столбец) - т.е. для каждого байта.

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

OiRS Dudin LSB Txt from stego.png

Отображение восстановленной последовательности, ниже представленна начальная последовательность

OiRS Dudin LSB Txt from stegoT.png
OiRS Dudin LSB byte stringT.png

Как можно заметить вектора абсолютно одинаковые, что означает, что восстановление стего произошло без ошибок. txt_to_file := vec2str(Txt_from_stego)

OiRS Dudin LSB txt to file.png
OiRS Dudin LSB K2-2.png

Аналогично видно и для самого текста, что данные идентичны. (К - изначально считанный текст)

Вывод: Алгоритм LSB реализован корректно и исправно работает. Динамическое создание псевдослучайного файла помогает избежать лишних затрат по объему используемого изображения, т.к. изображение создаем мы, согласно нашим интересам. Следует заметить, что изображение мы создаем псевдослуайной функцией, что значит, что мы может изменять не обязательно один последний бит в интенсивности цвета, а к примеру 2,3, а то и 4. Ведь "враг" получивший наше изображение и так визуально ничего не поймет. Минусом данного алгоритма является его давольно простое раскрытие, но если применить к исходной информации самый простейший криптографический алгоритм(к примеру алгоритм простой замены) мы сможем заметно поднять его стойкость. Плюсом данного алгоритма является его довольно простая реализация и малая ресурсоёмкость

Изображения