Міні-проект CS-107 1 Стеганографія - Завантажити PDF безкоштовно
CS-107: Міні-проект 1 Стеганографія B. Goullet, B. Jobstmann, J. Sam Зміст 1 Презентація 3 2 Структура та наданий код 4 3 Пряме кодування 6 3.1 Перетворення у двійкове зображення. 6 3.1.1 Кодування пікселя. 7 3.1.2 Кодування повного зображення. 8 3.1.3 Тести. 9 3.2 Приховування зображення. 9 3.2.1 Інкрустація. 9 3.2.2 Розкриття. 10 3.2.3 Приклад. 10 3.2.4 Тести. 10 4 Кодування тексту 11 4.1 Перетворення рядка в бітовий масив і навпаки. 11 4.1.1 Ціле до бітової таблиці. 11 4.1.2 Рядок до масиву булевих значень через масив цілих чисел. 12 4.1.3 Таблиця бітів до таблиці цілих чисел. 12 4.1.4 Масив цілих чисел до рядка. 12 4.2 Приховування та розголошення. 12 4.2.1 З бітової таблиці. 13 4.2.2 З рядка. 13 4.3 Тести. 14 1

5 Спіральне кодування 15 5.1 Приховування спіралі. 16 5.1.1 Перетворення бінарного зображення в одновимірний масив. 16 5.1.2 Кодування. 17 5.2 Розкриття кодованого по спіралі повідомлення. 17 5.2.1 Перетворення одновимірного масиву у двійкове зображення. 17 5.2.2 Розкриття зображення. 17 5.3 Тести. 18 6 Теоретичне доповнення Кольори, пікселі та двійкові символи 19 6.1 Бінарне подання цілих чисел. 20 6.2 Посилання. 20 2
getred (кольоровий); // -> 240 (0xF0) грігрін (колір); // -> 15 (0x0F) getblue (колір); // -> 85 (0x55) int grey = getgray (колір); // -> 113 getbw (сірий, 128); // -> false // Кодуємо кольори getrgb (0, 0, 255); // -> 255 (0 x0000ff) getrgb (127); // -> 8355711 (0 x7f7f7f) getrgb (істина); // -> 16777215 (0 xffffff) // Зверніть увагу, що компоненти обмежені в [0, 255] getrgb (-175, 0, 255); // -> 255 (0 x0000ff) getrgb (-255); // -> 0 (0x000000) 3.1.2 Кодування повного зображення Використовуючи попередні функції, реалізуйте togray (int [] [] image), який перетворює дане зображення у форматі RGB у зображення у градаціях сірого (int [] []); tobw (int [] [] сірий, поріг int), який перетворює зображення у відтінках сірого у бінарне чорно-біле зображення (ми використовуємо як тип повернення логічне значення [] [], де вхідні дані false представляють чорний, а той - справжній білий ). torgb (логічне значення [] [] bw), яке перетворює в іншому напрямку двійкове зображення на зображення у форматі RGB torgb (int [] [] сіре) і яке робить те саме для зображення у відтінках сірого. Для цього потрібно створити масив потрібного розміру та використовувати getgray, getbw або getrgb для кожного пікселя. // Кольорове зображення 2x2 int [] [] image = <, >; // Перетворюємо його в сірий колір int [] [] grey = togray (зображення); // -> < //, // // >; // Повертаємось до RGB int [] [] back = torgb (сірий); 8
Щоб реалізувати embedbwimage (int [] [] обкладинка, логічне [] [] повідомлення), вам потрібно буде закодувати embedinlsb (значення int, логічне значення m), яке приймає RGB-піксель (значення) та логічне значення m, і повертає цей піксель з найправішим бітом, встановленим на 0, якщо m хибне, або на 1, якщо це істина. Наприклад, ви можете використовувати двійкові оператори, такі як &, оператор і двійковий (див. Доповнення, а також слайди, представлені в класі). 3.2.2 Розкриття Щоб мати можливість розшифрувати приховане зображення, ви реалізуєте файлbbimage (int [] [] обкладинка), який утворює двійкове зображення, зчитуючи значення найменш значущого (крайнього правого) біта кожного пікселя в Обкладинка зображення RGB. Як і раніше, ви реалізуєте додатковий метод getlsb (int value), який, отримуючи значення RGB-пікселя, повертає true, якщо останній біт дорівнює 1, і false, якщо дорівнює 0. 3.2.3 Приклад int [] [] cover = Helper . читати ("cover.jpg"); int [] [] message = Helper.read ("message.jpg"); int [] [] сірий = ImageMessage. togray (повідомлення); логічне значення [] [] bw = ImageMessage. tobw (сірий, 240); int [] [] hidden = Стеганографія. embedbwimage (обкладинка, bw); // повертаємо носій, що містить приховане повідомлення логічне значення [] [] decoded = Стеганографія. розкритиbwimage (приховано); 3.2.4 Тести Для цієї частини продовжуйте, як і для попередньої, але з файлом LinearEncodingTests.java. На цьому етапі в тесті getlsbtest, embedinlsbtest, identifybwimagetest та embedbwimagetest повинні бути зеленими. Щоб графічно протестувати цю частину, ви можете скористатися програмою, наданою в MainImages.java, яку, звичайно, можете збільшити, як завгодно. 10
Рис. 2: 4 біти першого символу вбудовані в біти найслабших крапок перших 4 пікселів, ті, що знаходяться в другому символі, вбудовані в найслабші бітові крапки наступних 4 пікселів тощо (у цьому прикладі ми хочемо приховати 6 символів, закодованих по 4 біти кожен замість 16) 4.2.1 З бітової таблиці Тепер потрібно мати можливість приховати цю бінарну таблицю в опорі. Впровадити embedbitarray (int [] [] обкладинка, логічне [] повідомлення), який вбудовує масив повідомлень у біти нижчого порядку перших 8 пікселів зображення обкладинки, де X - довжина масиву повідомлень. Потім реалізовуйте показчикbitbitarray (int [] [] cover), який повертає одновимірний булев масив, що відповідає найменш значущим бітам покриття. 4.2.2 З рядка Тепер реалізуйте embedtext (int [] [] cover, String message) і identifytext (int [] [] cover), які за допомогою кодованих вами методів або приховують, або виявляють 8 Починаючи з піксель і перетин зліва направо, потім зверху вниз. 13
Рядок у/із зображення обкладинки. 4.3 Тести Тепер всі тести TextMessageTests.java, а також testembedbitarray, testrevealbitarray, testembedtext і testrevealtext LinearEncodingTests.java повинні пройти (якщо ви правильно виконали частину 1, усі тести LinearEncodingTests.java тепер повинні бути успішними. Зеленим кольором). Цю частину можна перевірити графічно, використовуючи основну програму, надану в MainStrings.java (або MainChocolate.java!). 14
5.3 Тести Усі тести SpiralEncodingTests.java, а також bwimagebitarraytest файлу ImageMessage.java тепер повинні пройти. Отже, якщо ви правильно застосували інші дві частини, усі тести 4 файлів тестового пакету повинні пройти. Ви можете перевірити цю частину графічно, використовуючи додану програму MainSpiral.java. 18