Куточок термінології:
Стеганографія — приховання факту передачі інформації.
Стегоповідомлення — повідомлення (інформація), факт передачі якої потрібно приховати.
Контейнер — інформація, яка містить у собі таємну інформацію, приховує її у собі.
Стеганографічний алгоритм — алгоритм, котрий приховує стегоповідомлення у контейнері. Або виявляє повідомлення в контейнері.
Стеганостійкість - умовний рівень захищеності стегоповідомлення.
Історичний куточок:
Можливо багато з подивом дізнаються, що стеганографія старіша за криптографію (шифрування). Саме слово стеганографія походить з грецької steganos (секрет) і graphy (запис). Український найкращий відповідник: тайнопис. Люди котрі займаються тайнописом — тайнописці. Перші писемні згадки про стеганографію датуються V ст. До н.е. Стеганографію активно використовували стародавні еліни і шумери. Шумери клинописні глиняні таблички покривали ще одним шаром глини, де робили ще один не таємний запис. В “Історії” Геродота згадується метод стеганографії, коли повідомлення наносилося на бриту голову раба. Коли той заростав, то його відправляли до адресата. Той його брив і читав повідомлення.
Після моєї першої публікації про стеганографію (стаття “Можна так просто взяти і приховати інформацію”), у мене було багато думок і в результаті багато цікавих ідей.
Я бачив проблеми стеганографії на прикладі попереднього алгоритму, а саме:
Спотворення контейнера при великих розмірах стегоповідомлення. У випадку, якщо контейнер замалий (або через якісь інші його характеристики), то його первинний вигляд спотворюється. У випадку з картинкою появляється багато шумів, спотворюється зображення.
Великий розмір контейнера. Щоб приховати більш-менше велике стегоповідомлення без значного спотворення контейнера потрібно вибирати і контейнер побільше. Це може нести різні проблеми. Наприклад, якщо потрібно передати надвелике повідомлення, то і розмір контейнера має бути у багато разів (сотні, можливо тисячі) раз більший за приховане повідомлення. А це у свою чергу може нести загрозу стеганостійкості, так як вірогідний супротивник буде у першу чергу перевіряти великі зображення. Хоча це можна обіграти і на власну користь, надсилаючи багато великих файлів. Таким чином супротивник буде завантажений пустою роботою і аналізом.
Це завжди було головною проблемою стеганографії. І я серйозно задумався над її вирішенням. Поділюся з читачами своїми результатами.
Ключ. Почну з того, що надумався створювати стеганографічні проги з наявністю ключа. Перша думка пов'язана щодо ключа і стеганографії була про те, щоб ключ міняв нерівномірно координати наступного пікселя (якщо це зображення), де буде міститься наступна частина інформації. Але тут я подумав про інше... А якщо координати, які підходять під наступну частину інформації будуть формувати ключ? Тобто не людина вводить ключ, а алгоритм видає ключ? Я відразу сів за реалізацію.
Зроблю невелику ремарку про те, що буду в процесі статті описувати алгоритм теоретично із посиланням на мою реалізацію в Інтернеті. Одна з причин: охопити і ту частину аудиторії, яка не є програмістами. Але у кінці статті дам вихідний код моїх програм.
Також прошу звернути увагу, що братиму за контейнер два приклади: зображення, текст.
Спочатку я подумав про те, щоб давати координати по двом осям х і у. Але маючи набори трьох кольорів в RGB, то потрібно ще й третю вісь z, де буде значення від 0 до 2. “Зайва координата — зайве значення ключа” - подумав я і зробив так як показано на ілюстрації.
Таким чином я розширив вісь х втричі, розділивши значення RGB по ширині. Зрештою я подумав, що і значення y можна перенести в х розмістивши все по ширині.
Таким чином маємо лише одну вісь х і відповідно лише одну координату.
Але це не принципово. Можна і 2 і 3 координати. Мені здалося, що із однією координатою розмір ключа буде менший.
Як і в попередній, опублікованій на НО, програмі я хотів би щоб одне із значень кольору відповідало значенню символу в таблиці ASCII. Я вважаю, що так контейнер може помістити більше інформації, згодом так виявилося зручніше і по інших причинах. Але в той же час використання ASCII є лише для наочності. У більш складних алгоритмах потрібен інший підхід.
Весь сенс алгоритму буде впиратися в те, що він буде шукати координату, значення якої буде відповідати значенню символу в ASCII. Тобто, ключ — це послідовність координат.
У випадку з приховуванні тексту в тексті, то аналогічно весь текст-контейнер можна уявити як одну строку, кожен елемент якого матиме свою координату по осі х.
Можна глянути стеганографічну програму і побачити її в дії (приховування тексту у тексті).
Вводимо URL зображення і повідомлення. У результаті отримуємо ключ. Можна залишити той же URL зображення, ввести ключ і отримати на виході стегоповідомлення. Таким чином контейнер зовсім не змінювався! Значить виявити у ньому впливів зі сторони стегоалгоритмів неможливо, так як їх не було!
Коли я почав тестувати програму, то мене бентежили два моменти.
По-перше, мене хвилювали великі розміри ключа. Вони більші за саме стегоповідомлення. Але стиснувши ключ будь-яким архіватором мене перестали бентежити розміри ключа. Ключ текстовий і тому навіть, якщо ключ ~60кб, то після стиснення близько 500 байт (архівація zip).
По-друге, так як ключ користувач не придумує, а його видає алгоритм, то виходить так, що при кожній новій передачі інформації потрібно передавати новий ключ, що є поганим тоном у стеганографії. Але тут я згодом побачив більше плюсів, аніж мінусів.
Перше. Не дивлячись на те, що алгоритм видає ключі — їх можна використовувати нескінчену кількість разів, обмежену лише побоюванням їх викриття. Для цього достатньо заміняти контейнер на інший таким чином щоб кожного разу в заданих координатах виявилося інше повідомлення. Це можна зробити будь-яким зручнішим для користувача методом: перебирати із вільного доступу зображення або створити таке зображення самому. У випадку, якщо контейнером є текст, то аналогічно можна взяти тексти із загального доступу або написати його самому. Подумайте тільки, кожен безневинний блог може бути паралельно джерелом таємної інформації. Кожна ілюстрація, кожна стаття (навіть звичайний SEO-текст) може містити за ключем секретне повідомлення!
Друге. Для того самого повідомлення у заданому зображенні може бути безліч кількість ключів. Моя показова програма обирає першу ліпшу координату, але алгоритм можна змінити так щоб обиралася координата із набору доступних випадковим чином. Таким чином, можна сформувати багато ключів на те ж повідомлення.
Це можна використати для різних цілей. Приведу декілька прикладів.
Приклад перший: виявити джерело витоку інформації. Це можна також поділити на декілька варіантів, але я розгляну один. Допустимо з першим повідомленням і контейнером всім передали різні ключі, але одне повідомлення. З другим контейнером за тими ж самими ключами кожен, хто має ключ отримає варіацію того ж самого повідомлення, але з певними змінами. Витік інформації вкаже на власника ключа, що “зливає інформацію” (ну або ключ був банально викритий). Далі за цим ключем буде надсилатися дезінформація для того щоб помістити зловмисника в інформаційний карантин.
Приклад другий. Він випливає із першого. Можливо нам необхідно інколи надсилати різну інформацію. Чим це спричинено (різним рівнем доступу, різними завданнями ітд) не важливо, але це може стати в нагоді. Ключ як не як відповідає різним координатам і за різними координатами може бути як однакова — так і зовсім різна інформація.
Крім того повідомлення може передаватися не лише одним контейнером і навіть не одним типом контейнера. Якщо стегоповідомлення передається, приміром через блог, то частина повідомлення може бути в зображенні, частина в тексті ітд (відео, аудіо...).
Третє, одночасне використання тих самих інформаційних ресурсів. Тобто, одна інформація може містити у собі іншу інформацію, а та у свою чергу у собі ще іншу ітд. Принцип матрьошки.
Таким чином у даного стеганографічного методу є надзвичайні переваги:
Контейнери є необмеженими. В одне зображення (наприклад фото) чи великий текст (наприклад реферат) може поміститися нескінчена кількість повідомлень. Звісно треба щоб зображення було різнокольоровим щоб там було все різноманіття варіантів. У “Чорному квадраті” Малєвіча стегоповідомлення передати буде тяжко. Хоча... для інших стеганографічних методів це і раніше було тяжко.
Наприклад, в такому маленькому зображенні як це помістилося повідомлення “Народний Оглядач”. Думаю може поміститися і більше. Щоправда в цілях посилення стеганостійкості слід контейнер брати значно більшим.
Контейнер не піддається деформації. Погодьтеся, що це значна перевага. Як дізнатися чи перед нами контейнер чи просто зображення/текст/аудіо/відео..., якщо контейнер не піддається ніяким змінам?
Тепер немає потреби знищувати оригінал, бо саме оригінал як контейнер і використовується!
Наявність багатьох ключів покращує стегостійкість. Як дізнатися чи передається у контейнері слово “Так” чи “Ні”, якщо як перше, так і друге там можна знайти?
Наводжу дві навчальні веб-програми згідно описаного мною алгоритму. Перша як контейнер використовує зображення, а друга текст.
Коментарі
Чомусь маленький малюнок котика 30 на 30 тут показався на всю довжину.
Це тому, що ввімкнулася вбудована галерея.
вона вмикається після того як вставляється будь яке зображення в текст, але зображення не повинно бути обгорнене в посилання
Щоб не вмикалась гелерея і не розтягувала маленьки фото, дость буде фото обернути в span. З часом це буде виправлено
span допоміг. Дякую.
Чудова стаття, ідея. Мені сподобалось.
Дякую. Як тільки знайду ще достатньо вільного часу - напишу ще матеріал.
Гарна ідея!
Чудово працює!
Тільки не второпав - в якому "кейсі" ключа зберігати?
Підкуємось браття, знаннями вишніми!