Г Ф Конахович - Комп'ютерна стеганографія теорія і практика - страница 13

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51 

7

224

 

7

11100000b

8

246

М =

8

11110110b

9

179

 

9

10110011b

10

255

 

10

11111111b

11

32

 

11

100000b

12

186

 

12

10111010b

13

32

 

13

100000b

14

238

 

14

11101110b

15

228

 

15

11100100b

16

237

 

16

11101101b

Рис.5.5. Фрагмент повідомлення, яке підлягає прихованню

Розширюємо ключ на довжину повідомлення (Nm), використовуючи програмний (МЛ). У даному модулі функція

strZvec(K)

(М.1)

М cod :=

for j ё1 for і m

Nm є 1 Na

<- і if

г + M

NT = А. К\ = А. mod(m + n ,Na)

п

if

(М.2)

cod.

М cod.

М cod

Na

if г > О if г = О

модуль

str2vec(K) перетворює рядок символів K на вектор їх ASCII-кодів. Програмний оператор for організовує цикл зміни i (змінна циклу) із заданою кількістю повторів (у даному випа­дку - від 1 до Nm). Функція mod(i,Nk) повертає залишок від ділення i на Nk.

Проводимо кодування повідомлення, використовуючи модуль (М.2).

4) Для того, щоб при розпакуванні контейнеру з отриманої множини символів можна було чітко визначити початок і кінець саме прихованого повідомлення, доцільно ввести відповідні секретні мітки, які б об­межували цей корисний зміст.

Для унеможливлення прийняття за мітки символів випадкового утворення перші повинні складатися з достатньої кількості символів. Крім того, для зниження імовір­ності виявлення міток при проведенні стега-ноаналізу бажано, щоб коди цих символів

були достатньо рознесені на ASCII-вісі (наприклад, використовувати поруч з латинськими сим­волами символів кирилиці та службових символів - так звана транслітерація; застосування псевдовипадкових послідовностей кодів символів тощо). Нехай мітки мають наступний вигляд: ц<5 := "п0ч@гтЮк"; цє := "KiHeu,6".

Обмежуючі мітки додаємо до тексту закодованого повідомлення, для чого викорис­товуємо функцію stack(A,B,...), яка дозволяє об'єднувати записані через кому масиви. Об'єд­нання відбувається шляхом "насадження" матриці А на матрицю В; отриманої таким чином матриці - на наступну матрицю (якщо така є) і т. д. Зрозуміло, що початкові матриці повинні мати однакову кількість стовпців, тому необхідно перетворити мітки з рядків на вектори ASCII-кодів. Отже, sMe := stack(str2vec(|j,s), M_cod, str2vec(^e)).

Загальна кількість символів в приховуваному повідомленні: rows(sMe) = 5404 симв. Кількість НЗБ контейнера, яка для цього потрібна (8 біт/символ): 8-rows(sMe) = 43232 біт. Загальна кількість НЗБ контейнера: rows(C)-cols(C) = 3-128-128 = 49152 > 43232 біт. Таким чи­ном, файл зображення має достатній об' єм для того, щоб приховати повідомлення.

5) Для подальших обчислень буде необхідним переведення десяткового числа (яким за умовчуванням кодується кожен символ) у формат двійкового. Також знадобиться і зворотне перетворення. Оскільки дані функції в MathCAD є відсутніми (існує, як це було показано вище, лише можливість перетворення формату відповіді, що для наших цілей не є прийнятним), пропонується використати наступні модулі, зміст яких є цілком очевидним.

Перетворення двійкового числа х, яке задане матрицею-стовпцем, причому 1-й елемент матриці -наймолодший розряд числа, на десяткове виконується за допомогою модуля (М.3).

Перетворення десяткового числа на двій­кове реалізується модулем (М.4). Причому функ­ція mod(x,2) повертає залишок від ділення х на 2 ^ («0», якщо х парне, і «1», якщо х непарне). Функція floor(...) повертає найбільше ціле число, яке менше або дорівнює дійсному значенню аргу­менту.

8

B2D(x) :=2*. і = 1

-1

(М.3)

floor

.4)

 (М.5)

6) Для більшої зручності і наочності подальших дій, розгорнемо матрицю C у вектор, тимчасово змінивши порядок колірних матриць з R-G-B на B-G-R, що підвищить захищеність прихованої інформації (у даному випадку можна використати більш надійні, але й складніші, алгоритми). У нашому випадку застосуємо модуль (М.5), в якому функція augment(A,B,...)

об' єднує матриці A, B, ... , що мають однакову кількість рядків (об'єднання проводиться стов­пець до стовпця, матриці повинні мати однакову кількість рядків). Операція C'^ i ^ дозволяє оби­рати i стовпець з матриці C', кожен з яких

згодом додається до результуючого вектора Cv. |    fjv stack1.

Функція cols(C')  повертає кількість стовпців масиву C'.

7) На основі вектора Cv формуємо новий вектор, що вже міститиме приховане закодоване повідомлення (модуль (М.6)).

Кожен символ закодованого повідомлення (операція циклу for ц є 1..rows(sMe)) переводиться у двійковий формат (змінна b), кожен з 8 розрядів якого записується замість НЗБ числа, яке відповідає інтенсивності того чи іншого кольору відповідного пікселя (останнє також попередньо переводиться у двійковий формат (змінна P)).

Після проведеної зміни модифі­коване двійкове число Р переводиться у формат десяткового і записується до від- Sv :=

повідної позиції вектора Sv.

Після обробки останнього сим­волу повідомлення sMe проводиться модифікація елементів масиву Cv, які ще не зазнали змін. Молодшим бітам кож­ного з таких елементів присвоюються | | | Sv.^R ( ^ B2D(P) (М.6) значення 0 або 1 (у даному випадку - за рівномірним законом розподілу (функція round(...) повертає округлене до найбли­жчого цілого значення аргументу), хоча більш правильно було б провести дослі­дження закону розподілу значень вже модифікованих молодших бітів і відпо­відним чином змінювати ті, що лиши­лися (дана процедура є темою окремого

дослідження і в рамках даної роботи не приводиться). Це унеможливлює згодом виявити факт модифікованості зображення. В іншому випадку, проаналізувавши зображення, побудоване з одних лише НЗБ контейнеру, порушник у більшості випадків (якщо символів повідомлення "не вистачило" на весь контейнер) виявить границю введення даних і при певних зусиллях зможе видобути приховану інформацію. Звичайно, цю інформацію ще необхідно розшифрувати, але факт її наявності вже буде розкрито і питання захисту повернеться до криптографічної стійкості використаного кодування. На рис.5.6 в якості прикладу наведено графічні інтерпретації масивів колірних компонентів, відтворені лише за НЗБ (0/1) контейнера-оригіналу (а), контейнера-результату без модифікації (б) і з модифікацією (в) надлишкових бітів. Як видно, за відсутності "дописування" при неповному заповненні контейнера чітко простежується границя введення повідомлення (рис.5.6) - слід нагадати, що підмасиви R і B були поміняні місцями, тому останньою модифікувалася матриця R, яка, зрештою, і виявилася заповненою не до кінця. "Дописування" рівноімовірними 0 і 1 дещо виправляє ситуацію, хоча при додатковому стега-ноаналізі на закон розподілу значень НЗБ невідповідність відразу буде виявлена, що ще раз каже про необхідність попереднього аналізу розподілу значень вже модифікованих бітів або ж хоча б продублювати частину повідомлення для заповнення всього контейнеру. Також очеви­дна відмінність між рисунками а і в. Тому бажаною є унікальність зображення, яке планується

rowsfвикористати в якості контей­нера. Тут треба зауважити, що всі графічні контейнери умовно поділяються на "чи­сті" і "зашумлені" [95]. У пе­рших простежується зв'язок між молодшим й іншими сі­мома бітами колірних компо­нентів, а також залежність між наймолодшими бітами. Пакування повідомлення в "чисте" зображення руйнує існуючі залежності, що, як було показано вище, легко виявляється. Якщо ж зобра­ження вже початково зашум-лене (скановане зображення, цифрова фотографія тощо), то визначення стороннього вкладення стає на порядок важчим, хоча й можливим при використанні теорії імо­вірностей і математичної ста­тистики.

Також можна зазна­чити, що для більшої прихо-ваності біти повідомлення слід вносити не послідовно, а

лише до кожного 2-го чи навіть 3-го пікселя, або ж підпорядкувати внесення певному, відомому лише авторизованим особам, закону. Відповідні модифікації легко здійснити шляхом внесення відповідних незначних змін до модуля (М.6).

8) Отриманий за допомогою модуля (М.6) вектор Sv згортаємо в матрицю S, що має розмірність первинної матриці C (модулі (М.7) і (М.8)).

б)

в)

Рис.5.6. Масиви колірних компонентів, відтворені за НЗБ

(М.7)

Функція submatrix(A, x, X, y, Y) повертає частину матриці A, яка складається з елемен­тів, спільних для рядків від x до X та стовпців від y до Y включно.

9) Користуючись цією ж функцією, виокремлюємо з масиву S' колірні матриці та розставляємо їх по своїх місцях (R-^-B), одержуючи контейнер-результат S (М.8).

На рис.5.7 по­казана графічна інтер­претація масиву S у ви­гляді зображення з градаціями сірого та від­творене за колірними складовими зображення-контейнер з прихованим повідомленням.

(М.8)

Порівнюючи рис.5.7 з рис.5.3 і 5.4 можна зробити висновок про відсутність помітних візуальних відхилень.

Рис.5.7. Контейнер-результат та його інтерпретація у вигляді масиву колірних компонентів

Залишається лише записати масив S у файл: WRITERGB("S_LSB.bmp") := S. Цілком очевидно, що об' єм отриманого файлу відповідатиме об' єму файлу зображення-оригіналу.

10) Для дослідження впливу на ступінь прихованості того, до якого з розрядів числа, яке характеризує ту або іншу властивість пікселя (у нашому випадку - інтенсивність певного кольору), заноситиметься секретна інформація, у модулі (М.6) у помічених зірочкою рядках слід замість індексу "1" внести індекс, який відповідає розряду, що модифікуватиметься. На рис.5.8 зображено результат, отриманий при внесенні даних до 8-го (найстаршого) біта числа, яке відповідає інтенсивності кольорів.

Рис.5.8. Кольорове зображення та масив колірних складових в разі внесення приховуваних

даних до 8-го біту інтенсивностей кольорів.

Встановлено, що візуально не є помітним, якщо в якості "носіїв" використовувати не лише наймолодший, але й наступний за ним біт кожного із зазначених вище чисел (особливо, якщо в зображенні відсутні великі однотонні ділянки). Отже, в якості одного з можливих ступенів захисту бачиться використання змінюваного за певним законом почергового запису до цих двох бітів. Або ж, жертвуючи прихованістю, можна вдвічі збільшити ємність контейнера.

11) Розглянемо процес розпакування прихованого повідомлення. Попередньо знаючи, що повідомлення було поміщене до масиву колірних компонентів, виділяємо відповідні кож­ному кольору підмасиви, переводячи значення колірних характеристик кожного пікселя зобра­ження, що містить у собі скрите закодоване повідомлення, у числові матриці 6):

R* := READ_RED("S_LSB.bmp");   G* := READ_GREEN(»);   B* := READ_BLUE(»).

З   отриманих   матриць, відповідним чином змінюючи їх порядок, подібно до (М.5) Sv* := S1 «- augment'.в* =G* = R*}

формуємо вектор Sv* (модуль (М.9)). Належ- ^ ^_

ним чином обробляючи кожні вісім елементів ^or j є 2  colsfS'} (М.9)

отриманого вектора, розпаковуємо приховане і повідомлення, використовуючи модуль (МЛО). Sv* «— stack'. Sv* = S' ..'

Слід зазначити, що оскільки наперед невідомо, яку частину вектора Sv* займає саме

Тут і надалі символом * позначатимуться параметри, що відносяться до приймальної сторони. Також за умовчанням вважатиметься, що приймальна сторона обізнана з алгоритмом вбудовування.

(М.10)

корисна інформація, до уваги бе­руться всі його елементи. Значення кожного елементу формованого при цьому вектора Mf* являють собою коди символів "квазіповідо-млення", які обчислюються у зво­ротному до (М.6) порядку: кожен молодший розряд вісімки перетво­рених у двійковий формат елемен­тів вектора Sv* формує двійкове число коду символу, формат якого згодом перетворюється на десят­ковий. Отримане число присвою­ється ц-му елементу вектора Mf*.

12) У зв'язку з неможливістю оброблення рядковими функціями 12-ї версії MathCAD символів, ASCII-коди яких мають значення від 0 до 31 включно (за винятком службових символів LF (код 10) і CR (код 13)), додатково вноситься заміна значень 0, 1, 2, 31 елементів вектора Mf* відповідним додаванням до кожного з них коефіцієнту 32.5 (коефіцієнт є дробом для того, щоб у подальшому було можливим відрізнити "справжні" значення елементів масиву від тих, що перед цим мали неформатні значення). Таку заміну, звичайно, відповідним чином необхідно врахувати у подальшому, для чого запам' ятаємо номери рядків вектору Mf*, елеме­нти яких мають дробові значення (модуль (М.11)).

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51 


Похожие статьи

Г Ф Конахович - Оцінка ефективності систем захисту інформації в телекомунікаційних системах

Г Ф Конахович - Комп'ютерна стеганографія теорія і практика