Розробка програми кодування інформації за методами стеганографії з використанням формату JPЕG

Автор работы: Пользователь скрыл имя, 03 Декабря 2013 в 16:48, курсовая работа

Краткое описание

Стеганографія (в перекладі із грецької steganos (секрет, таємниця) и graphy (запис)) — це наука про сховану передачу інформації шляхом збереження в таємниці самого факту передачі. На відміну від криптографії, що приховує вміст секретного повідомлення, стеганографія приховує саме його існування.
Стеганографія не замінює, а доповнює криптографію. Приховання повідомлення методами стеганографії значно знижує ймовірність виявлення самого факту передачі повідомлення. А якщо це повідомлення до того ж зашифроване, то воно має ще один, додатковий, рівень захисту.

Прикрепленные файлы: 1 файл

Розділ 1.doc

— 1,022.50 Кб (Скачать документ)

 

 

 

 

Розділ 2. Розробка програми

 

    1. . Створення алгоритму розгортання формату JPЕG

Алгоритм створений на дискретному косинусоїдальному перетворенні (надалі ДКП), вживаному до матриці зображення для отримання деякої нової матриці коефіцієнтів. Для отримання початкового зображення застосовується зворотне перетворення.

ДКП розкладає зображення по амплітудах деяких частот. Таким чином, при перетворенні ми отримуємо матрицю, в якій багато коефіцієнтів або близькі, або дорівнюють нулю. Крім того, завдяки недосконалості людського зору, можна апроксимувати коефіцієнти грубше без помітної втрати якості зображення.

Для цього використовується квантування  коефіцієнтів (quantization). У найпростішому  випадку — це арифметичне побітове зміщення вправо. При цьому перетворенні втрачається частина інформації, але можуть досягатися великі коефіцієнти .

Отже, розглянемо алгоритм докладніше. Нехай ми стискуєм 24-бітове зображення.

Крок 1.

Переводимо зображення з колірного простору RGB в колірний простір YCrCb ( називають YUV).

В ньому Y — складова яскравості, а Cr, Cb — компоненти, що відповідають за колір (хроматичний червоний і хроматичний синій). За рахунок того, що людське око менш чутливе до кольору, ніж до яскравості, з'являється можливість архівувати масиви для Cr і Cb компонент з великими втратами і, відповідно, великими коефіцієнтами стиснення. Подібне перетворення вже давно використовується в телебаченні. На сигнали, що відповідають за колір, там виділяється вужча смуга частот.

Спрощено перехід з колірного простору RGB в колірний простір YCrCb можна представити за допомогою матриці переходу:

Зворотне перетворення здійснюється множенням вектора YUV на зворотну матрицю:

Крок 2.

Розбиваємо вхідне зображення на матриці 8х8. Формуємо з кожної три робочі матриці ДКП — по 8 біт окремо для кожної компоненти. При великих коефіцієнтах цей крок може виконуватися трохи складніше. Зображення ділиться після компоненти Y — як і в першому випадку, а для компонент Cr і Cb матриці набираються через рядок і через стовпець. Тобто з початкової матриці розміром 16x16 виходить тільки одна робоча матриця ДКП. При цьому, як неважко замітити, ми втрачаємо 3/4 корисної інформації про колірні складові зображення і отримуємо відразу стиснення в два рази. Ми можемо зробити це все завдяки роботі в просторі YCrCb.

 

Крок 3.

Виконаємо ДКП до кожної робочої матриці. При цьому ми отримаємо матрицю, в якій коефіцієнти в лівому верхньому кутку відповідають низькочастотній складовій зображення, а в правому нижньому — високочастотній.

У спрощеному вигляді  це перетворення можна представити так:

,

де 

 

 

Крок 4.

Проводимо квантування. В принципі, це просто ділення робочої матриці на матрицю квантування поелементно. Для кожної компоненти (Y, U і V), в загальному випадку, задається своя матриця квантування q[u,v] (далі МК).

На цьому кроці здійснюється управління ступенем стиснення, і відбуваються найбільші втрати. Зрозуміло, що, задаючи матрицю квантування з великими коефіцієнтами, ми отримаємо більше нулів і, отже, великий ступінь стиснення.

Матриці для більшого або меншого коефіцієнтів стиснення отримують шляхом множення початкової матриці на деяке число gamma.

При великих значеннях  коефіцієнта gamma втрати в низьких частотах можуть бути настільки великі, що зображення розпадеться на квадрати 8х8. Втрати у високих частотах можуть виявитися в так званому “ефекті Гіббса”, коли навколо контурів різким переходом кольору утворюється своєрідний “німб”.

 

Крок 5.

Переводимо матрицю 8x8 в 64-елементний вектор за допомогою  “зигзаг”-сканувания, тобто беремо елементи з індексами (0,0) (0,1) (1,0) (2,0)...

 

 

Таким чином, на початку  вектору ми отримуємо коефіцієнти матриці, відповідні низьким частотам, а в кінці — високим.

Крок 6.

Згортаємо вектор за допомогою  алгоритму групового кодування. При цьому отримуємо пари типу (пропустити, число), де “пропустити” є лічильником нулів, що пропускаються, а “число” — значення, яке необхідно поставити в наступний осередок. Так, вектор 42 3 0 0 0 -2 0 0 0 0 1 ... буде згорнутий в пари (0,42) (0,3) (3-2) (4,1) ... .

 

Крок 7.

Згортаємо пари, що вийшли, кодуванням по Хаффману з фіксованою таблицею.

Процес відновлення  зображення в цьому алгоритмі  повністю симетричний.

Схематично алгоритм стиснення зображений на рис. 2.1.1.

Рис 2.1.1. Алгоритм стиснення JPG

 Позитивними сторонами  алгоритму є те, що:

  1. Задається ступінь стиснення.
  2. Вихідне кольорове зображення може мати 24 біта на точку.

Негативними сторонами  алгоритму є те, що:

  1. При підвищенні ступеня стиснення зображення розпадається на окремі квадрати (8x8). Це пов'язано з тим, що відбуваються великі втрати в низьких частотах при квантуванні, і відновити початкові дані стає неможливо.
Виявляється ефект Гіббса — ореоли по межах різких переходів кольорів.

Структура файлу JPЕG

Файл JPEG містить послідовність маркерів, кожен з яких починається з байта 0xFF, який свідчить про початок, і байта — ідентифікатора. Деякі маркери складаються тільки з цієї пари байтів, інші ж містять додаткові дані, що складаються з двобайтового поля з довжиною інформаційної частини маркера (включаючи довжину цього поля, але без врахування двох байтів початку маркера тобто 0xFF і ідентифікатора) і власне даних. В табл. 2.1.1 показані маркери файлу JPЕG.

Таблиця 2.1.1 Основні маркери формату JPЕG.

Маркер

Байти

Довжина

Призначення

Коментарі

SOI

0xFFD8

немає

Початок зображення

 

SOF0

0xFFC0

змінний розмір

Початок фрейму (базовий, ДКП)

Показує що зображення кодувалося в  базовому режимі з використанням  ДКП і коду Хаффмана. Маркер містить довжину, висоту, кількість компонентів, число біт на компонент і співвідношення компонентів (наприклад, 4:2:0).

SOF2

0xFFC2

змінний розмір

Початок фрейму (прогресивний, ДКП, код Хаффмана)

Показує що зображення кодувалося в прогресивному режимі з використанням ДКП і коду Хаффмана. Маркер містить довжину, висоту, кількість компонентів, число біт на компонент і співвідношення компонентів (наприклад, 4:2:0).

DHT

0xFFC4

змінний розмір

Містить таблиці Хаффмана

Задає одну або більше таблиць Хаффмана.

DQT

0xFFDB

змінний розмір

Містить таблиці квантування

Задає одну або більше таблиць квантування.

DRI

0xFFDD

4 байта

Вказує інтервал повторень

Задає інтервал між маркерами RST n, в макроблоках.

SOS

0xFFDA

змінний розмір

Початок сканування

Починає сканування зображення зверху вниз. Якщо використовувався базовий  режим кодування, використовується одне сканування. При використанні прогресивних режимів використовується декілька сканувань. Маркер SOS розділяє інформативну і закодовану частину зображення.

RSTn

0xFFDn

немає

Перезапуск

Вставляється в кожному r макроблоку, де r — інтервал перезапуску DRI маркера. Не використовується за відсутності DRI маркера. n, молодші 3 біта маркера коду, цикли від 0 до 7.


 

 Продовження табл. 2.1.1

APPn

0xFFEn

змінний розмір

Задається програмою

Наприклад, в Exif JPEG файлі використовується APP1 маркер для зберігання метаданих, розташованих в структурі, заснованій на TIFF.

COM

0xFFFE

змінний розмір

Коментарій

Містить текст коментаря.

EOI

0xFFD9

немає

Кінець закодованої частини зображення.

 

 

2.2. Створення  алгоритму кодування інформації

Методи, які застосовуються для кодування формату .BMP неможуть бути застосованими до формату .JPEG, оскільки в ньому використовується алгоритм стиснення.  

В структурі файлу JPEG міститься маркер APPn – в цей маркер, деякі програми, які працюють з графікою дописують деякі свої дані, які не впливають на якість зображення. Я буду також використовувати цей маркер, але записувати туди буду свої дані, які потрібно зашифрувати.

Структура маркера APPn має вигляд:

- маркер APPn (2 байти)

- довжина (2 байти)

- ідентифікатор JFIFn (5 байт)

- код розширення (1 байт) - (10 - кодування методом JPEG, 11 - 1 байт на піксель, 12 - 3 байти на піксель)

Розмір поля APPn не може перевищувати 64 Кб.

Спершу я розтисну зображення і в маркер APP запишу свої дані. Далі стисну зображення назад і дані залишаться в зображенні без змін. Таким чином виявлення прихованої інформації буде майже неможливе, оскільки маркер APP в структурі JPEG використовується для запису інформації з інших програм. Можна також і записувати інформацію в молодші біти кожної складової(так як в .bmp), але при стиснені вони затираються і витягнути з них вже нічого не можна.

 

2.3. Розробка  головного коду програми

В цьому підрозділі я  наведу текст процедури, яка здійснює пошук сектора APP.

// пошук сектора APP

while(pCurrPos - pData < FileLength - 6){

if(pCurrPos[0] != 0xff){

// неможливо знайти  початок сектора:

free(pData);

 

return -2;

}

 

unsigned short SectLen = GET_WORD(pCurrPos + 2);

 

switch(pCurrPos[1]){

case 0xC0:

case 0xC2:

case 0xC4:

case 0xDB:

case 0xDA:

case 0xFE:

case 0xD9:

case 0xE0:

case 0xE1:

case 0xE2:{

// можливий розмір:

pCurrPos += SectLen + 2;

}; break;

case 0xDD:{

// розмір 2 байти:

pCurrPos += 2 + 2;

}; break;

case JFIF_WORK_SECTION_ID:{

// можливий розмір:

unsigned short SectID = GET_WORD(pCurrPos + 4);

 

if(SectID != JFIF_WORK_SECTION_ID1){

// не сектор АPP, вихід:

free(pData);

return 0;

}

 

SectID = GET_WORD(pCurrPos + 6);

 

if(SectID != JFIF_WORK_SECTION_ID2){

// не сектор АPP, вихід:

free(pData);

return 0;

}

 

Розділ 3. Розробка інтерфейсу програми

 

Моя програма написана на мові С і розроблена за допомогою програмного середовища C++ Builder 6. Для керуванням програмою я використав наступні компоненти:

  • Button 1 – кнопка «Відкрити зображення» - відкриває зображення для запису або витягнення з нього інформації;
  • Button 2 – кнопка «Відкрити файл» - відкриває вибраний для запису файл;
  • Button 3 – кнопка «Переглянути закодоване зображення» - відкриває зображення для порівняння його з оригіналом;
  • Button 4 – кнопка «Виконати» - виконує запис/витягнення інформації;
  • RadioButton 1 і RadioButton 2 – перемикачі для вибору користувачем запису чи витягнення інформації;
  • Image 1 – компонент, призначений для перегляду зображення до запису в нього тексту;
  • Image 2 – компонент, призначений для перегляду зображення після запису в нього тексту;
  • Label 1 – текст «Інформація для витягнення»;
  • Label 2 – текст «Назва файлу»;
  • Label 3 – текст «Інформація для запису»;
  • Edit 1 – поле, в якому відображається потрібна інформація для запису в або витягнення з зображення;
  • Edit 2 – поле, в яке потрібне ввести назву файлу;
  • OpenPictureDialog1 – компонент, призначений для відкриття зображень;
  • OpenDialog1 – компонент, призначений для відкриття файлів для запису;
  • StatusBar1 – рядок стану, розділений на дві панелі. В одній вказується шлях до відкритого зображення, а в другій – моє прізвище, ім’я і група.

 

 

 

Розділ 4. Опис роботи програми

 

Моя програма складається з 3 частин: інтерфейсу і двох підпрограм, які  здійснюють запис і витягнення інформації. Програма працює наступним чином:

  1. Запускаємо програму;

  1. Натискаємо кнопку «Відкрити зображення» і вибираємо потрібне зображення;

  1. Після вибору зображення воно відобразиться у лівій верхній частині вікна програми і з’являться два перемикачі для вибору подальших дій;

Информация о работе Розробка програми кодування інформації за методами стеганографії з використанням формату JPЕG