Автор работы: Пользователь скрыл имя, 03 Декабря 2013 в 16:48, курсовая работа
Стеганографія (в перекладі із грецької steganos (секрет, таємниця) и graphy (запис)) — це наука про сховану передачу інформації шляхом збереження в таємниці самого факту передачі. На відміну від криптографії, що приховує вміст секретного повідомлення, стеганографія приховує саме його існування.
Стеганографія не замінює, а доповнює криптографію. Приховання повідомлення методами стеганографії значно знижує ймовірність виявлення самого факту передачі повідомлення. А якщо це повідомлення до того ж зашифроване, то воно має ще один, додатковий, рівень захисту.
Розділ 2. Розробка програми
Алгоритм створений на дискретному косинусоїдальному перетворенні (надалі ДКП), вживаному до матриці зображення для отримання деякої нової матриці коефіцієнтів. Для отримання початкового зображення застосовується зворотне перетворення.
ДКП розкладає зображення по амплітудах деяких частот. Таким чином, при перетворенні ми отримуємо матрицю, в якій багато коефіцієнтів або близькі, або дорівнюють нулю. Крім того, завдяки недосконалості людського зору, можна апроксимувати коефіцієнти грубше без помітної втрати якості зображення.
Для цього використовується квантування
коефіцієнтів (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
Позитивними сторонами алгоритму є те, що:
Негативними сторонами алгоритму є те, що:
Структура файлу JPЕG
Файл JPEG містить послідовність маркерів, кожен з яких починається з байта 0xFF, який свідчить про початок, і байта — ідентифікатора. Деякі маркери складаються тільки з цієї пари байтів, інші ж містять додаткові дані, що складаються з двобайтового поля з довжиною інформаційної частини маркера (включаючи довжину цього поля, але без врахування двох байтів початку маркера тобто 0xFF і ідентифікатора) і власне даних. В табл. 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. Для керуванням програмою я використав наступні компоненти:
Розділ 4. Опис роботи програми
Моя програма складається з 3 частин: інтерфейсу і двох підпрограм, які здійснюють запис і витягнення інформації. Програма працює наступним чином: