Случайный контейнер. Метод Куттера

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

Руководство пользователя

Задача

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

записать произвольно выбранное стего методом Куттера.

  • Востановить стего по известному ключу.
  • Отфильтровать "загруженный" контейнер с помощью фильтра с гаусовским откликом:

  • Восстановить стего по известному ключу. Оценить качество восстановления.
  • Определить допустимый интервал значений параметра r.

Исходные файлы

1. Записываемое стего сообщение находится в файле 1.txt
2. В качестве контейнера используется изображение 1.bmp
3. ν – параметр определяющий энергию встраиваемого сигнала. Чем больше ν ,

тем выше устойчивость встроенной информации к искажениям, однако и тем сильнее ее заметность. Установлено, что результат встраивания визуально незаметен при значениях ν меньше 0.05.

4. Результат встраивания стего сообщения можно посмотреть в файле Stego_Krest.bmp.
5. В файле маткада в конце шага 2 приведено побитовое сравнение исходного сообщения(M_b) и сообщения после расшифровки(M_b_decod) .
6. Результат восстановления исходного сообщения находится в файле 2.txt.
7. С помощью переменной r изменяем параметры фильтра.
8. Результат применения фильтра можно посмотреть в файле Stego_Krest_Filter.bmp.
9. Результат восстановления сообщения после применения фильтра к "загруженному" контейнеру можно посмотреть в файле 3.txt. Также можно побитово сравнить исходное сообщение(M_b) и восстановленное сообщение(M_b_decod2) после применения фильтра к "загруженному" контейнеру.

Текст выполненной программы

Основная идея этого метода, предложенного Куттером, Джорданом и Боссеном, заключается в следующем: стего встраивается в канал синего цвета (зрительная система человека наименее восприимчева именно к синему цвету) изображения, имеющего RGB кодирование путем модифкации яркости. Более подробно алгоритм будет описан в ходе реализации.

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

Считываем изображение: C:=READRGB("1.bmp") Выделяем три цветовые состовляющие: R:=READ_RED("1.bmp") G:=READ_GREEN("1.bmp") B:=READ_BLUE("1.bmp") Импортируем текстовое сообщение: M:=READBIN("1.txt","byte") Исходное изображение:

1bmp.PNG

Исходное изображение в трех цветовых составляющих:

R.PNG G.PNG B.PNG

Модуль для преобразования двоичного числа х в дясятичное:

B D(x)10.PNG

Модуль для преобразования десятичного числа в двоичное:

D B.PNG

Модуль для преобразования сообщения записанного в 1.txt из 10-ной системы в 2-ную. Каждая строка преобразуется с помощью ранее описанного модуля D_B и записывается в M_b.

M b.PNG

M= 0
0 84
1 104
2 101
3 111
4 114
5 121
6 32
7 104
8 ...

Исходное сообщение в 2-ном варианте:

M_b= 0
0 0
1 0
2 1
3 0
4 1
5 0
6 1
7 0
8 ...

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

Зададим: γ:=0.05 Секретный бит Mi встраивается в канал синего цвета путем модификации яркости λ(x,y)


Встраиваем бит информации в канал синего цвета. b - бит записываемой информации.

 γλ

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

σ - Количество пикселей сверху (снизу,слева,справа) от оцениваемого пискселя. В случае креста 7*7 σ=3 Зададим: σ:=3 Пример:

λ(6,6)=27.053 SV(6,6,0)=37

Запись исходного сообщения осуществляется по главной диагонали в канал синего цвета. Хотя для записи сообщения можно использовать значительно более сложный способы записи (например запись методом псевдослучайной перестановки). Но так как основная задача заключается в использовании метода Куттера для записи стего, выбран именно такой способ реализации.

Модуль для записи исходного сообщения в канал синего цвета. Встраиваем каждый бит информации по главной диагонали начиная с 4й строки и 4го столбца. Получаем значение SV для каждого пикселя и записываем в B_cod. В случае если значения яркости больше 255 или меньше 0 записываем 255 и 0 соответственно:

B cod.PNG

Синяя цветовая состовляющая до кодирования и после:

B= 0 1 2 3 4
0 37 38 38 38 38
1 38 38 38 39 39
2 38 39 39 39 39
3 39 39 39 40 40
4 39 39 40 40 40
5 43 43 43 46 46
6 41 41 41 40 38
7 42 42 41 41 43
8 38 41 42 41 43
9 39 44 38 27 ...


B_cod= 0 1 2 3 4
0 37 38 38 38 38
1 38 38 38 39 39
2 38 39 39 39 39
3 39 39 39 39 40
4 39 39 40 40 39
5 43 43 43 46 46
6 41 41 41 40 38
7 42 42 41 41 43
8 38 41 42 41 43
9 39 44 38 27 ...

Записываем значения матрицы B_cod вместо значений B в изображение "Stego_Krest.bmp" ("Загруженный контейнер"). WRITERGB("Stego_Krest.bmp"):=augment(R,G,B_cod) Синяя цветовая состовляющая до встраивания исходного сообщения и после:

Bdo.PNG Bposle.PNG

Изображение до встраивания информации и после:

1bmp.PNG Stegokrest.PNG

2. Восстановление записанного сообщения.

C1:=READRGB("Stego_Krest.bmp") Разложение на цветовые компоненты: R1:=READ_RED("Stego_Krest.bmp") G1:=READ_GREEN("Stego_Krest.bmp") B1:=READ_BLUE("Stego_Krest.bmp") Синий цвет до записи в "Stego_Krest.bmp" и после записи и разложения на компоненты:

Bposle.PNG B1posle.PNG

Модуль для декодирования стего. Зная, что сообщение записывалось по диагонали восстанавливаем его. В модуле вычисляются значения яркостей креста: 3 пикселей сверху, снизу, слева и справа (для = 3 ) от оцениваемого пикселя на диагонали и сравниваются со значениеми яркости оцениваемых пикселей. Результат сравнения записывается побитово в M_b_decod: 1 если значение яркости оцениваемого пикселя больше значений яркости в кресте, 0 в противоположном случае.

M b decod.PNG

Исходное сообщение в двоичном варианте до записи и после извлечения:

M_b= 0
0 0
1 0
2 1
3 0
4 1
5 0
6 1
7 0
8 0
9 0
10 0
11 1
12 0
13 1
14 1
15 ...
M_b_decod= 0
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 0
9 0
10 1
11 1
12 0
13 1
14 1
15 ...



















Bin2dec.PNG

L:=Bin2dectfunk(M_b_decod) Сравниваем исходное сообщение M с сообщением L, полученным после извлечения из контейнера:

M= 0
0 84
1 104
2 101
3 111
4 114
5 121
6 32
7 104
8 105
9 103
10 104
11 32
12 108
13 101
14 118
15 ...


L= 0
0 192
1 108
2 101
3 206
4 32
5 7
6 254
7 82
8 137
9 231
10 191
11 4
12 0
13 61
14 114
15 ...

Записываем декодированное сообщение в файл "2.txt". WRITEBIN("2.txt","byte",0):=L

3. Отфильтруем загруженный контейнер фильтром с гауссовским импульсным откликом:

Считываем "загруженный" контейнер: image:=READRGB("Stego_Krest.bmp") Задаем параметры фильтра: r:=0.1 n:=3 Описываем фильтр:

Gauss2d.PNG

Gaussfilter.PNG

Применяем фильтр к "загруженному" контейнеру:

Filterimage.PNG C2:=FilterImage(image,GaussFilter(n,r)) WRITERGB("Stego_Krest_Filter.bmp"):=C2 Результат применения фильтра:

Stegokrest.PNG Stegokrestfilter.PNG

4. Извлекаем сообщение из "загруженного" контейнера после применения фильтра.

C3:=READRGB("Stego_Krest_Filter.bmp") Разложение на цветовые компоненты: R3:=READ_RED("Stego_Krest_Filter.bmp") G3:=READ_GREEN("Stego_Krest_Filter.bmp") B3:=READ_BLUE("Stego_Krest_Filter.bmp") Синий цвет до записи в "Stego_Krest.bmp" и после записи и разложения на компоненты:

Bposle.PNG B3Posle.PNG

Mbdecod2.PNG

Исходное сообщение в двоичном варианте до записи и после извлечения:

M_b= 0
0 0
1 0
2 1
3 0
4 1
5 0
6 1
7 0
8 0
9 0
10 0
11 1
12 0
13 1
14 1
15 ...
M_b_decod2= 0
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 0
9 0
10 1
11 1
12 0
13 1
14 1
15 ...

Bin2dec2.PNG L2:=bin2decfunc(M_b_decod2) Сравниваем исходное сообщение M с сообщением L2, полученным после извлечения из фильтрованного контейнера:

M= 0
0 84
1 104
2 101
3 111
4 114
5 121
6 32
7 104
8 105
9 103
10 104
11 32
12 108
13 101
14 118
15 ...


L= 0
0 192
1 108
2 101
3 206
4 32
5 7
6 254
7 82
8 137
9 231
10 191
11 4
12 0
13 61
14 114
15 ...

Записываем декодированное сообщение (L2) в файл "3.txt". WRITENBIN("3.txt","byte",0):=L2

5. Определяем предельно допустимые значения параметра r.

Следует отметить, что фильтр применялся при рекомендованном значении константы v = 0.05. Для параметра r подбирались различные значения в пределах от [0.1,9]. При значениях от 0.1 до 1 фильтр не оказывал никакого воздействия на конечный результат. При значениях >1 результат становился хуже чем до применения фильтра. Это связано с тем, что пиксели с битами зашифрованного сообщения размывается при больших значениях парметра r. Возможно, если бы контейнер был сильнее зашумлен фильтр бы оказал положительное воздействие на конечный результат.

Вывод

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

Файлы