Написать эту статью меня побудило практическое отсутствие в Интернете грамотных материалов в этой области и достаточно странная ситуация на рынке непрофессионального ПО, связанного со стеганографией. Забавно, но Интернет сейчас буквально завален поделками «уровня школьника» — серьёзные системы интересны серьёзным людям и стоят — вот странно, не правда ли? — серьёзных денег, а на рынке простых систем распространены удручающе примитивные программы, авторы которых явно прогуливали занятия если не в школе, то в институте точно. Я никого не хочу обидеть персонально (оптом — тоже не хочу), но ученье свет, а «неученье», особенно в области защиты информации, является всего лишь основанием для самоуспокоения, что тоже хорошо, но не имеет практической ценности =).
Оглавление
1. Введение
Здесь я не буду вдаваться в теорию, которая сама по себе очень интересна, но и достаточно сложна; не буду описывать виды и применение стеганографических методов скрытия данных и вообще растекаться мыслью по десктопу. Здесь я просто расскажу о некоторых аспектах самого распространенного метода скрытия информации в графических файлах — о методе НЗБ (Наименьшего Значащего Бита) и ошибках, связанных с использованием программ базирующихся на этом методе. О них уже писалось многими и неоднократно, но, как видно из отдельных материалов и комментариев, читали это не все…
Этот материал ни на что не претендует и сильно упрощён для облегчения понимания =) Я даже не буду приводить формул и теории, очень уж они большие и страшные. Для знакомых с предметом специалистов здесь вряд ли найдётся что-то новое, а вот совершенно незнакомые с предметом люди может быть чего и почерпнут.
2. Итак, приступим: основные понятия и определения.
Во-первых. В чём главное отличие стеганографии от других методов защиты, в частности от той же криптографии? Дело в том, что первоочередной задачей стеганографии является скрытие самого существования канала связи, задача извлечения информации тут отступает на второй план и решается в большинстве случаев стандартными криптографическими методами. Есть области стеганографии, когда факт внедрения данных известен: это цифровые водяные знаки, так называемые «отпечатки пальцев», и заголовки, но их я рассматривать не буду.
Во-вторых. Почему НЗБ? Потому что это один из самых простых методов цифровой стеганографии, дающий скрытый канал с достаточно большой пропускной способностью.
Определения просты, но понятны:
- Контейнер — некоторая информация, в частности файл, в которую можно внедрить другую информацию, не предназначенную для посторонних глаз.
- Пустой контейнер — контейнер, в который ещё не внедрена информация. Соответственно, когда информацию внедрили, то контейнер становится заполненным.
- Сообщение — секретная информация, наличие которой в контейнере необходимо скрыть, то, из-за чего весь сыр-бор. Это может быть файл, текст, что угодно. Исторически сложилось, что это всё называется сообщением.
- Канал передачи — путь, по которому контейнер попадает от отправителя к получателю (пусть будут Юстас и Алекс, для интереса. Или Алиса и Боб, что тоже хорошо…).
- Наблюдатель — промежуточное звено, задачей которого является определение, не передаётся ли от Юстаса Алексу чего-то скрытое и насквозь запрещённое в обычном их общении. Существует три типа наблюдателей: пассивный, активный и злонамеренный. Самый безопасный пассивный — он не может разрушить сообщение, или скажем заменить его ложным, все его возможности сконцентрированы на одном: смотреть, смотреть и еще раз смотреть… и быть тревогу, если что-то там высмотрит.
Предположим, что у нашего канала связи появился пассивный наблюдатель (бороться с активным можно только с помощью полной замены применяемого алгоритма, метод НЗБ не выдерживает такой атаки). Допустим, от Юстаса Алексу непрерывно пересылаются невинные — на первый взгляд — файлы. Если наблюдатель обоснованно определит, что в этих файлах не всё чисто, то это явится основанием для приглашения в гестапо, где, как известно, скорость перебора паролей очень высока, ибо прямо пропорциональна температуре паяльника. Или утюга, кому что больше нравится.
Способов внедрения и защиты данных в контейнере может быть множество даже в рамках одного типа контейнеров. Первое и главное из требований к методам внедрения — незаметность. Это означает, что посторонний наблюдатель в канале связи не должен на глаз определить наличие или отсутствие внедрения. Это требование большая часть самопальных программ худо-бедно, но выполняет (иначе зачем бы они были нужны?..). Вот сейчас мы и посмотрим, как именно.
3. Собственно НЗБ
Что такое метод НЗБ? Это метод скрытия данных с искажением контейнера, основанный на особенностях человеческого восприятия. Конкретнее, идея метода заключается вот в чём: если взять картинку в формате BMP (или, скажем, как альтернативу 8 и более- битный оцифрованный звук), лучше всего TrueColor, в 24-х битном формате и взять да изменить младшие значащие биты цвета, то на глаз это будет незаметно. Почему 24 бита? Существует такой немаловажный фактор, как объём контейнера — сколько всего можно впихнуть в картинку, пока это не станет явным. Логично предположить, что чем больше контейнер, тем больше можно и внедрить, а распространенные на сегодня 24-х битные BMP — самая благодатная почва.
24 бита есть удобный формат хранения информации об изображении. При таком представлении за один цветовой канал отвечает один байт, чем все и пользуются. Оно и правильно.
Внедрение может осуществляться так:
- Берём сообщение и предварительно подготавливаем его: шифруем и пакуем. Этим достигается сразу две цели — повышение КПД и увеличение стойкости системы (см. далее). В начало для удобства можно записать сигнатуру метода, что не секретно, зато просто.
- Берём контейнер и внедряем подготовленное сообщение в младшие его — контейнера -биты любым удобным для нас способом. Самое простое:
- раскладываем упакованное сообщение в битовую последовательность;
- заменяем избыточные биты (НЗБ) контейнера битами сообщения. Просто и со вкусом.
А вот тут-то собака обычно и закапывается… Надежность такого внедрения прямо пропорциональна соответствию характера распределения НЗБ в контейнере и сообщении. А распределения эти в подавляющем большинстве случаев совпадать-то и не будут. А еще в некоторых случаях это будет визуально заметно на картинке, построенной из одних только младших битов контейнера. Вот простейший пример, послуживший поводом к написанию статьи — берём исходную картинку:
и внедряем в неё некоторое количество информации при помощи не так давно публиковавшейся здесь в исходном коде программы Stegograph (сие не в упрёк этой программе, она просто приведена для примера). Что мы видим?
При помощи очень простой программки, показывающей картинку побитно (то есть, только интересующие нас биты нужных цветовых компонентов) очень ясно видно внедрение данных. Более того, можно легко представить себе картину внедрения (какие биты, какие компоненты цвета), а при некоторых дополнительных усилиях и извлечь спрятанную информацию. Да, это ещё только полдела — нужно эту информацию ещё и расшифровать, но факт передачи уже определён.
Конечно, для большинства наблюдателей достаточно и того, что «на глаз не видно», но… слабые места своей защиты надо знать.
4. Как с этим бороться
Начать, пожалуй, нужно с того, что все BMP контейнеры нужно разделить на два класса: «чистые» и зашумленные. В «чистых» картинках прослеживается связь между младшим битом, в который мы так бесцеремонно влезаем, и остальными 7-ю битами элементов цвета, а также прослеживается существенная зависимость самих младших битов между собой. Внедрение сообщения в «чистую» картинку разрушает существующие зависимости, что, как видно из вышеприведенной иллюстрации, очень легко выявляется пассивным наблюдателем. Если же картинка зашумлена (например, получена со сканера или фотокамеры), то определить вложение становиться на порядок сложнее, но продвинутый наблюдатель может призвать на помощь науку (раз уж сам не справляется) — теорию вероятностей, матстатистику и др.
Различить, какой контейнер попал вам под руку, можно тоже побитным просмотром картинки. Например, сканированное изображение, в которое ничего не внедрялось, выглядит так:
А вот — изначально компьютерное:
Объясняется это тривиальным шумом матрицы сканера (или цифровой камеры). Опять же, несколько отступая в сторону, следует сказать, что просмотром и анализом распределения НЗБ иногда очень просто определить факт компьютерной обработки (подчистки) картинки:
А вот это же изображение, но с внедрением:
Чётко видна граница между «своим» шумом и шумом, возникшим в результате внедрения сообщения. Отсюда вытекает еще одно необходимое правило — всегда нужно распределять биты сообщения по всем младшим битам контейнер (например, внедрять не последовательно, а в каждый 2-й, 3-й и т. д. НЗБ) или же дополнять чем-то (шумом с тем же законом распределения) длину сообщения так, чтобы она стала равна объему НЗБ контейнера.
Есть еще одно интересное решение — подбор картинки под сообщение: из множества имеющихся картинок подобрать такую, которая исказится менее всего при внедрении указанного сообщения.
5. Резюме, оно же вывод
В данной статье я пытаюсь показать, что скрывать данные нужно с умом. И применение простейших методов скрытия может быть достаточно надёжным только тогда, когда понимаешь и учитываешь ограничения и область применимости этих методов. В частности, не стоить доверять свои секреты «чистым» картинкам-контейнерам, а перед использованием той или иной стеганографической программы лучше все же проверить, дает ли она хотя бы какой-то минимум надежности.
Автор: Алексей Кошкин, Наталья Кошкина
Источник: www.delphikingdom.ru