Автореферат Дипломная работа выполнена на тему «Обнаружение стегосистем, основанных на погружении скрытых сообщений в шумы сканера». Дипломная работа содержит: 185 страниц; 76 таблиц; 16 рисунков; 9 схем; 1 приложение. Ключевые слова: стеганография, сканер, шумы, обнаружение. В дипломной работе рассмотрена стегосистема, основанная на погружении скрытых сообщений в шумы сканера, разработаны методы обнаружения данной стегосистемы. Проверена эффективность предложенных методов в зависимости от объёма вложения. Предложены также возможные методы улучшения самой стегосистемы, и методов её обнаружения. 4 Содержание Титульный лист ..................................................................................... 1 Задание ................................................................................................... 2 Автореферат........................................................................................... 4 Содержание............................................................................................ 5 Введение................................................................................................. 7 Глава 1. Краткий обзор стегосистем и их основное назначение. .......... 10 1.1. Наука стеганография ................................................................... 10 1.2. Отличие стеганографии от криптографии................................. 10 1.3. Две основные части стеганографии ........................................... 10 1.4. Задачи, решаемые стеганографией и ЦВЗ ................................. 11 1.5. Особенности построения стегосистем ....................................... 12 Глава 2. Описание стегосистемы, основанной на погружении секретных сообщений в шумы сканера .............................................................. 18 2.1. компонент» Обоснование существования такого типа «шумовых .................................................................................................. 18 2.2. Виды шумов сканера ................................................................... 20 2.3. Описание стегосистемы, основаной на погружении скрытых сообщений в шумы сканера ............................................................................... 22 2.4. Пример вложения секретной информации................................ 27 Глава 3. Разработка методов стегоанализа в текстовых документах .. 28 3.1. Постановка задачи ....................................................................... 28 3.2. Атака вычислением корреляции одинаковых букв текста ...... 28 3.3. Атака выполнением двумерного преобразования Фурье от сканированных изображений ............................................................................. 40 5 3.4. Анализ количества единичных выбросов ................................. 51 3.5. Анализ количества единичных углублений .............................. 70 Глава 4. методами Результаты обнаружения стегосистем, предложенными .................................................................................................. 91 4.1. Атака анализом количества единичных выбросов ................... 91 4.2. Атака анализом количества единичных углублений ............... 97 4.3. Возможные улучшения методов вложения и обнаружения .. 111 Заключение ........................................................................................ 113 Список литературы ........................................................................... 115 Приложение № 1 ............................................................................... 117 6 Введение История человечества знает немало примеров использования стеганографии. Одно из первых применений стеганографии было зафиксировано в трактате «История» греческого историка Геродота, относящегося к 5 веку до н. э., в котором описывается метод сокрытия информации, заключавшийся в том, что для передачи секретной информации использовалась голова раба. Сначала волосы на голове раба сбривали, затем наносили татуировкой секретное сообщение и когда волосы на голове раба отрастали, его отправляли в пункт назначения. Там снова сбривали волосы и читали секретное сообщение. Во время войны за независимость США, для тайного общения, и Американцы и Британцы использовали симпатические чернила, которые проявлялись при нагреве. Стеганография также использовалась в ходе обеих мировых войн. В период между первой и второй мировыми войнами в Германии была разработана технология создания микроточек (микрофотографий) – изображений, уменьшенных на столько, что неосведомлённый наблюдатель не сможет их обнаружить. В октябре 2001 года New York Times опубликовала заметку о том, что Аль – Каида, при подготовке к террористической атаке 11 сентября 2001 года, использовала стеганографию для погружения секретных сообщений в изображения, с целью дальнейшей рассылки информации по e – mail. В «The Federal Plan for Cyber Security and Information Assurance Research and Development» , опубликованном NSTC («National Science and 7 Technology Council»), в апреле 2006 года говорится о потенциальных угрозах национальной безопасности к которым относятся: использование киберпространства для скрытой передачи информации, в частности, террористами, и иностранными спецслужбами; использование киберпространства для шпионажа против важных, наименее защищенных данных в государственных и отраслевых системах; использование киберпространства для подрывной деятельности инсайдеров, в том числе поставщиков и подрядчиков; использование киберпространства для ведения преступной деятельности, в первую очередь для мошенничества и хищения финансовой или идентификационной информации, хакерами и организованными преступными группами; рост международного интереса к изучению методов стеганографии, их коммерциализации и применению, эти технологии представляют потенциальную угрозу национальной безопасности, дополнительную так как стеганография информацию, которую тайно погружает практически не обнаружить. Из изложенного выше и дипломной работы [10] в которой подробно рассмотрены примеры использования стеганографии террористическими и криминальными группировками, становится понятно, что секретное общение может быть использовано разными людьми для различных целей от вполне безобидных до очень серьёзных, способных нанести непоправимый вред компаниям или государствам. Таким образом, задачи стегоанализа, с каждым годом становятся всё более важными, для обеспечения безопасности, как отдельных лиц, так и целых государств. 8 В данной работе рассматривается стегосистема, имитирующая шумы сканера. Погружение секретного сообщения в данной стегосистеме производится за счет изменения яркости пикселей на границе черного с белым. Данная стегосистема является стойкой к визуальному анализу. До настоящего времени не было предложено методов автоматического определения вложения секретной информации данным методом. Целью данной дипломной работы является разработка методов стегоанализа, позволяющих в автоматическом режиме обнаружить вложение секретной информации и оценить эффективности стегоанализа. В первой главе рассмотрены базовые аспекты стеганографии, необходимые для понимания особенностей построения стегосистем. Во второй главе описана стегосистема имитирующая шумы сканера. Приводятся блок – схемы алгоритмов погружения и извлечения секретной информации. В третьей главе предложены различные методы стегоанализа в текстовых документах. Приводятся блок-схемы алгоритмов стегоанализа и пояснения к ним. В четвертой главе представлены результаты обнаружения стегосистемы предлагаемыми методами. Представлены также предложения по улучшению как стегосистемы, так и методов стегоанализа. 9 Глава 1. Краткий обзор стегосистем и их основное назначение. 1.1. Наука стеганография Стеганография – это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. Слово стеганография образовано от греческих слов стеганос («στεγανος») — скрытый и графо («γραφω») — пишу, что дословно переводится, как «тайнопись». 1.2. Отличие стеганографии от криптографии Криптография делает содержание сообщения невозможным для понимания, при этом сохраняется возможность обнаружить факт её присутствия. Стеганография в отличие от криптографии утаивает сам факт погружения дополнительной информации в «невинное сообщение». 1.3. Две основные части стеганографии Стеганография ( в англоязычной литературе «Information hiding (IH)») - это семейство методов, при помощи которых некоторое дополнительное сведение погружается в основное (покрывающее сообщение (ПС)) при сохранении хорошего качества ПС. В качестве покрывающего сообщения могут быть использованы: неподвижные изображения; подвижные изображения (видео); аудио файлы; речь; печатные смысловые тексты; интернет – протоколы; программы для компьютеров. 10 На схеме 1 показывается, как стеганография (Information Hiding) делится на области применения. Information Hiding (IH) Защита от обнаружения Защита от удаления Цифровые «водяные знаки» Стеганография (ЦВЗ) Схема 1. Иллюстрация разделения IH на различные области применения 1.4. Задачи, решаемые стеганографией и ЦВЗ Задача стеганографии: Погрузить дополнительное сообщение в ПС так, чтобы сам факт его присутствия в нем нельзя было бы обнаружить нелегитимным пользователям. Задача ЦВЗ: Погрузить дополнительные сведения (обычно идентификационный код автора) в ПС так, чтобы его нельзя было бы удалить, не ухудшив существенно качество ПС. Факт такого вложения может и обнаруживаться нелегитимными пользователями. 11 1.5. Особенности построения стегосистем Стеганографическая система (стегосистема) - совокупность средств и методов, которые используются для формирования скрытого канала передачи информации. На схеме 2 изображена общая идея организации стеганографических каналов связи. Стего - Ключ Стего - Ключ ПС Стеганографический Отправитель Получатель канал Секретная Секретная информация информация Схема 2. Иллюстрация общего принципа построения стеганографических каналов связи Стегосистемы используются для решения следующих задач: идентификации владельца, защиты авторского права на интеллектуальную собственность; мониторинга вещания; отслеживания истории перемещений; контроля копирования; защиты конфиденциальной информации от несанкционированного доступа; 12 создания скрытых от законного пользователя каналов утечки информации; альтернатива криптографии при ее запрещении или ограничении уровня стойкости; защиты пользователей, которые нуждаются в хранении и передаче секретной информации (так как факт использования стеганографии в большинстве своём не удаётся обнаружить, то и пользователь остаётся неизвестным). При построении стегосистемы должны учитываться следующие положения: после вложения секретной информации покрывающее сообщение должно оставаться сообщений или неизменным эти для изменения видео должны покрывающих быть незаметны невооруженным глазом; стегосистема должна сложность реализации (под понимается количество шагов иметь приемлемую вычислительную вычислительной или сложностью арифметико-логических операций, необходимых для решения вычислительной проблемы, в данном случае – процесса встраивания/извлечения секретной информации в/из сигнала покрывающего сообщения); должна обеспечиваться необходимая пропускная способность (что особенно актуально для стегосистем скрытой передачи данных); методы сокрытия аутентичность и информации целостность должны секретной обеспечивать информации для легитимного пользователя; потенциальный нарушитель имеет полное представление о стегосистеме и деталях ее реализации; единственное, что ему неизвестно, – это ключ, с помощью которого только его 13 обладатель может установить факт наличия и содержание скрытого сообщения; если факт существования скрытого сообщения становится известным нарушителю, это не должно позволить последнему извлечь его до тех пор, пока ключ сохраняется в тайне; нарушитель должен быть лишен любых технических и других преимуществ в распознании или, по крайней мере, раскрытии содержания секретных сообщений. Скрытие информации внутри цифровых файлов требует изменения каких либо параметров этих файлов, что выражается в некотором ухудшении или появлении необычных характеристик. Эти необычные характеристики могут выступать в роли критерия обнаружения вложения секретной информации. Под понятием стегоанализ понимается атака на стегосистему, целью которой является попытка обнаружить, извлечь, изменить вложенное секретное сообщение. Основные атаки на СГ: обнаружение стегосигналов; нахождение объема секретного вложения; чтение стегосообщения; удаление стегосигнала без значительного ухудшения качества ПС и даже при необнаружении СГ. При прохождении стегосигналов по каналам связи они могут подвергнуться различным воздействиям. Возможные преобразования стегосигналов: естественные преобразования (фильтрация, масштабирование, передача по каналам с шумом); 14 сжатие, преднамеренные (атаки). Критерии эффективности СГ: Исходя из определения стегосистемы, можно выделить три основных направления оценки эффективности СГ: количество информации которое можно погрузить в ПС (чем больший объём секретной информации можно погрузить, тем лучше стегосистема); сложность обнаружения (показывает на сколько легко, для кого – либо обнаружить секретное сообщение. Как правило существует прямая связь между количеством вложенной информации и временем необходимым для её обнаружения. По мере увеличения объёма вложенной информации растёт вероятность того, что вложение секретной информации будет обнаружено); сложность удаления (заключает в себе тот принцип, что кто – либо перехватив секретное сообщение не смог бы легко его удалить). Из этих трёх основных направлений сформированы пять критериев оценки эффективности СГ: вероятность пропуска стегосигнала; вероятность ложного обнаружения стегосигнала; вероятность ошибки бита при извлечении легитимными пользователями вложенного сообщения; качество ПС после вложения (отношение сигнал/шум или более сложные, в том числе экспертные, оценки); скорость вложения (число бит вложенного сообщения на один отсчет ПС). 15 СГ называется робастной, если секретное сообщение устойчиво выделяется при всех естественных или преднамеренных преобразованиях СГ, которые не искажают существенно ПС. Основная классификация СГ: Для легитимных пользователей: с известным ПС на легитимном декодере (информированный декодер); с неизвестным ПС на легитимном декодере ("слепой" декодер); с использованием ПС в легитимном кодере (информированный кодер). Для "атакующих": с известной стеганограммой (выполняется всегда); с известным сообщением; с выбранным сообщением; с известным (или выбранным ПС) - для каналов с шумом. Основная концепция в разработке СГ: Найти «шумовые компоненты» (области) в ПС и заменить их на зашифрованное (т.е. шумоподобное) секретное сообщение. Найти «шумовые компоненты» не сложно, так как они присутствуют повсюду, будь то цифровая фотографии, цифровой аудио или видео файл. Когда голос, звук или фотография превращаются в последовательность бит, аппаратура проделывающая данную работу как правило далека от идеала. Немного электрического шума может изменить некоторое количество бит, и восстановить эти изменённые биты не представляется возможным. И если эти небольшие изменения не столь важны с точки зрения передачи информационной составляющей, то с точки зрения возможности 16 погружения дополнительной информации эти искажения открывают большие возможности. Принцип прост. Цифровая фотография или цифровой аудио файл представляют собой числа, которыми кодируются интенсивности в определенный момент в пространстве и / или времени. Цифровая фотографии представляет собой матрицу чисел, которые определяют яркость пикселей в определенном месте в определенное время. Цифровые аудио файлы представляют собой последовательность давлений в определённые моменты времени. Но все эти цифры приблизительны. Цифровые камеры, генерирующие цифровые изображения не идеальны из – за наличия в них приборов с зарядовой связью (ПЗС), преобразующих фотоны в биты информации. ПЗС сильно подвержены случайным физическим процессам. Иногда на ПЗС попадает меньше фотонов, чем необходимо, а иногда больше. В долгосрочной перспективе количество случаев, когда на ПЗС попадёт меньше фотонов и когда на ПЗС попадёт больше фотонов будет примерно одинаково, но изображение должно быть сгенерировано за несколько секунд. Схожа ситуация и с микрофонами. Основная проблема при разработке СГ: Статистика таких сложных ПС как звук, изображение и смысловой текст известна не полностью и весьма сложна. Поэтому существует опасность, что атакующий знает ее лучше, чем разработчик СГ. Одним из видов СГ является стегосистема, которая в качестве «шумовых компонент» для погружении скрытых сообщений использует шумы сканера. 17 Глава 2. Описание стегосистемы, основанной на погружении секретных сообщений в шумы сканера Главной задачей стеганографии является построение необнаруживаемого канала связи. С целью внедрения секретного сообщения отправитель немного модифицирует покрывающее сообщение (ПС), получая на выходе сообщение с вложением. При этом требуется внедрить, как можно больше бит информации, не поместив в ПС легко обнаруживаемые признаки. Как было отмечено в первой главе, основной концепцией при разработке стегосистем является нахождение «шумовых компонент». Из названия данной стегосистемы становится понятно, что в качестве «шумовых компонент» используются шумы сканера. Но действительно ли они есть? Чтобы ответить на этот вопрос мы рассмотрим основные типы сканеров, существующие на сегодняшний день, выберем из них наиболее распространённый тип, рассмотрим принцип его действия и определим откуда появляются «шумовые компоненты». 2.1. Обоснование существования такого типа «шумовых компонент» На сегодняшний день существует четыре вида сканеров, а именно: ручные сканеры; листопротяжные сканеры; планшетные сканеры; барабанные. Ручные сканеры – обрабатывают полосы документа шириной около 10 см и представляют интерес, прежде всего для владельцев мобильных ПК. Они медлительны, имеют низкие оптические разрешения (обычно 100 точек на дюйм) и часто сканируют изображения с перекосом. 18 В листопротяжном сканере, как в факсимильном аппарате, страницы документа при считывании пропускаются через специальную щель с помощью направляющих роликов. Таким образом, сканеры этого типа непригодны для ввода данных непосредственно из журналов или книг. В целом возможности применения листопротяжных сканеров ограничены. Планшетные сканеры имеют ряд преимуществ по объему применения, то есть более универсальны. Они напоминают верхнюю часть копировального аппарата: оригинал – либо бумажный документ, либо плоский предмет – кладут на специальное стекло, под которым перемещается каретка с оптикой и аналого-цифровым преобразователем. Барабанные сканеры, по светочувствительности, значительно превосходящие потребительские планшетные устройства, применяются исключительно в воспроизведение полиграфии, где профессиональных требуется фотоснимков. высококачественное Разрешение таких сканеров обычно составляет 8000-11000 точек на дюйм и более. Таким образом из–за своей универсальности наибольшее распространение получили планшетные сканеры. Для лучшего понимания причин появления «шумовых компонент» рассмотрим принцип действия таких сканеров. Схема 3. Иллюстрация принципа действия планшетного сканера Схема 3 иллюстрирует принцип действия планшетного сканера. 19 Вдоль сканируемого изображения, расположенного на прозрачном неподвижном стекле, движется сканирующая каретка с источником света. Отраженный свет через оптическую систему сканера (состоящую из объектива и зеркал или призмы) попадает на три расположенных параллельно друг другу фоточувствительных полупроводниковых элемента на основе ПЗС, каждый из которых принимает информацию о компонентах изображения. 2.2. Виды шумов сканера Выделяют четыре вида шумов: фотонный шум; темновой шум (темновой ток); шум считывания; неоднородность чувствительности. Фотонный шум обусловлен квантовой природой света. Воздействующие на ПЗС фотоны света порождают в кремниевом слое прибора фотоэлектроны. Количество фотоэлектронов, накапливаемых за время экспозиции, в каждой ячейке ПЗС описывается распределением Пуассона. Среднеквадратическое значение флуктуирующей (шумовой) составляющей заряда, накопленного в ячейке ПЗС, 𝑄фш и его среднее значение 𝑄ф , представляющее полезный сигнал, взаимосвязаны 𝑄фш ≈ √𝑄ф . То есть число фотонов накопленное в ячейке, определено с точностью до квадратного корня из их числа. Например, зарядовый пакет в 10000 электронов от кадра к кадру будет флуктуировать со среднеквадратическим отклонением в 100 электронов. 20 Темновой шум возникает под действием тепла, вследствие генерации электронов в кристаллической решётке кремния ПЗС, поскольку процесс генерации термоэлектронов является случайным процессом. Величина темнового тока не зависит от величины светового потока, который проецируется на ПЗС, а следовательно, не зависит от величины светового потока и темновой шум. Количество термоэлектронов, накапливаемых в каждой ячейке ПЗС за время экспозиции, так же, как и количество фотоэлектронов, описывается среднеквадратическое распределением значение темнового Пуассона. шума 𝑄тш Поэтому подчиняется соотношению 𝑄тш ≈ √𝑄т , где 𝑄т - среднее значение накопленного за время экспозиции заряда, обусловленного термоэлектронами. Шум считывания (или шум предусилителя) – обусловлен предусилителем на чипе. Среднеквадратическое значение шума считывания определяется параметрами матрицы ПЗС и не зависит от величины считываемого сигнала, а следовательно, не зависит и от светового потока. Шум считывания распределён по гауссову закону. Ячейки ПЗС имеют не одинаковую чувствительность, то есть даже при абсолютно однородной освещённости сигнал с них разный. Величина этой неоднородности не велика, порядка 1 – 5 %. И так мы пришли к выводу о том что «шумовые компоненты» такого типа действительно существуют, теперь перейдём к рассмотрению самой стегосистемы. 21 2.3. Описание стегосистемы, основаной на погружении скрытых сообщений в шумы сканера Данная СГ была предложена около 5 лет назад профессором кафедры ИБТС СПбГУТ Коржиком В. И. и аспирантом Алексеевым В. Г.. Основная идея данного метода заключается в том, чтобы отсканировать напечатанный документ и внести в него секретную информацию имитируя шумы сканера [11]. Имитация осуществляется за счёт того, что изменению могут быть подвергнуты только пиксели, находящиеся на границе черного с белым. Введём обозначения: 𝐴 – область, размером 𝑛 × 𝑛 пикселей; 𝑚 – количество чёрных пикселей в 𝐴; 𝑚 + – количество чёрных пикселей в 𝐴, если оно чётное; 𝑚 − – количество чёрных пикселей в 𝐴, если оно нечётное; 0<𝑘< 1 2 – выбранный порог; 𝑏 = {0,1} – значение бита секретной информации, вкладываемой в 𝐴; Метод вложения секретной информации: Отсканированный чёрно – белый документ последовательно делится на области 𝐴. Область 𝐴 является пригодной для вложения в следующих случаях: 𝐴 = 𝐴0 , если 𝑘 ∙ 𝑛2 < 𝑚 < (1 − 𝑘) ∙ 𝑛2 ; 𝐴 = 𝐴1 , если 𝑚 = (1 − 𝑘) ∙ 𝑛2 ; 22 𝐴 = 𝐴2 , если 𝑚 = 𝑘 ∙ 𝑛2 . Во всех остальных случаях область 𝐴 будет считаться не пригодной для вложения секретного сообщения. Алгоритм погружения секретной информации для области 𝐴0 : Если область 𝐴 = 𝐴0 , то вложение производится в соответствие с таблицей 1: Таблица 1. Алгоритм вложения секретной информации для области 𝑨 = 𝑨𝟎 𝒎 = 𝒎+ 𝑏=0 𝑏=1 𝒎 = 𝒎− Изменить цвет одного пикселя Ничего не изменять на противоположный Изменить цвет одного пикселя на противоположный Ничего не изменять Алгоритм погружения секретной информации для области 𝐴1 : Если область 𝐴 = 𝐴1 , то вложение производится в соответствие с таблицей 2: Таблица 2. Алгоритм вложения секретной информации для области 𝑨 = 𝑨𝟏 𝒎 = 𝒎+ 𝑏=0 𝑏=1 𝒎 = 𝒎− Изменить один чёрный пиксель Ничего не изменять на белый Изменить один чёрный Ничего не изменять пиксель на белый 23 Алгоритм погружения секретной информации для области 𝐴2 : Если область 𝐴 = 𝐴2 , то вложение производится в соответствие с таблицей 3: Таблица 3. Алгоритм вложения секретной информации для области 𝑨 = 𝑨𝟐 𝒎 = 𝒎+ 𝑏=0 𝑏=1 𝒎 = 𝒎− Изменить один белый пиксель Ничего не изменять на чёрный Изменить один белый пиксель Ничего не изменять на чёрный Метод извлечения секретной информации: Стегоизображение последовательно делится на области 𝐴. Затем высчитывается количество чёрных пикселей внутри каждой области и принимается решение, какого типа эти области, если области типа 𝐴0 , 𝐴1 или 𝐴2 , то производится извлечение секретного сообщения, если нет, то извлечение информации не производится. Алгоритм извлечения секретной информации из областей 𝐴0 , 𝐴1 и 𝐴2 : Если область 𝐴 = 𝐴0 , 𝐴 = 𝐴1 или 𝐴 = 𝐴2 , то извлечение производится в соответствие с таблицей 4: Таблица 4. Алгоритм извлечения секретной информации из областей 𝑨 = 𝑨𝟎 , 𝑨 = 𝑨𝟏 , 𝑨 = 𝑨𝟐 Количество черных пикселей Извлекаемая информация 𝐦 = 𝐦+ Извлекается «0» 𝐦 = 𝐦− Извлекается «1» 24 На схемах 4 и 5 изображены соответственно блок - схемы алгоритмов погружения и извлечения секретной информации. ПС Выбор параметров nиk Разбиение ПС на области nxn Подсчёт количества чёрных пикселей внутри областей Принятие решения о возможности вложения Область не пригодна для вложения Область пригодна для вложения Ни чего не вкладывается Производится вложение в соответствии с таблицами 1, 2 и 3 Схема 4. Блок - схема алгоритма погружения секретной информации 25 Стегоизображение (СИ) – изображение после вложения секретной информации. Стегоизображение (СИ) Выбор параметров nиk Разбиение СИ на области размером n x n Подсчёт количества чёрных пикселей внутри областей Принятие решения о типе области 𝐴 ≠ 𝐴0 , 𝐴 ≠ 𝐴1 , 𝐴 ≠ 𝐴2 𝐴 = 𝐴0 , 𝐴 = 𝐴1 , 𝐴 = 𝐴2 Ни чего не извлекается Производится извлечение в соответствии с таблицей 4 Схема 5. Блок - схема алгоритма извлечения секретной информации 26 Основные свойства данного метода: Извлечение информации производится без ошибок. Чем больше n и чем больше k, тем секретнее вложение, но тем меньше скорость вложения, и наоборот. Вложение устойчиво к визуальной атаке и к простейшим статистическим атакам. Вложение легко удаляется при помощи рандомизации А+, А- без ухудшения качества документа. Скорость вложения невелика. 2.4. Пример вложения секретной информации На рисунке 1 изображен пример ПС с «шумовыми компонентами». На рисунке 2 изображен пример СИ после погружения в ПС 9 бит секретной информации (параметр 𝑛 = 20, порог 𝑘 = 0,01). На рисунке 3 красным цветом выделены пиксели, изменившиеся, после погружения в ПС 9 бит секретной информации. Рисунок 1. Покрывающее сообщение с «шумовыми компонентами» Рисунок 2. Стегоизображение Рисунок 3. Расположение изменённых пикселей 27 Глава 3. Разработка методов стегоанализа в текстовых документах 3.1. Постановка задачи Целью данной дипломной работы является разработка методов стегоанализа, позволяющих в автоматическом режиме обнаружить вложение секретной информации и оценка эффективности их работы. Для стегоанализа предоставлено одно или несколько изображений; производиться сравнение характеристик тестируемых изображений с заранее выбранными порогами; если есть доступ к сканеру, то это позволяет более точно выбрать пороги. Далее будут рассмотрены атаки с известной стегосистемой, что подразумевает под собой то, что нам известны алгоритмы погружения и извлечения секретной информации, но не известено покрывающее сообщение. 3.2. Атака вычислением корреляции одинаковых букв текста При разработке данного метода была использована база тестовых изображений. В эти изображения с различными скоростями производилось вложение секретной информации, после чего генерировались новые изображения, на которых были отмечены изменившиеся пиксели. Визуальный анализ изображений с отмеченными изменениями не позволил выявить уникальных изменений, происходивших после вложения секретной информации. 28 Как известно для использования статистического анализа необходимо большое количество информации для сбора статистики. Так как мы исследовали изображения текстовых документов, то в качестве объекта для сбора статистики было принято решение использовать буквы текста, наименее подверженные искажениям сканера. Проведя визуальный анализ, было выявлено, что менее всего искажениям подвергается буква «Т». Рисунок 4. Иллюстрация букв подверженных искажениям сканера На рисунке 4 видно, что две чаще всего встречающиеся буквы русского алфавита «А» и «И» сильнее подвергаются шумам сканера, а следовательно обладают более сильным «шумовым компонентом», что усложняет процесс обнаружения вложения. Основное предположение при разработке данного метода заключалось в следующем: после вложения буквы с вложением будут сильнее отличаться от таких же букв, но без вложения. 29 В качестве порога предпологалось использовать значение средней корреляции букв «Т» с первой найденной буквой «Т». Блок – схема алгоритма работы атаки вычислением корреляции одинаковых букв текста изображена на схеме 6. Изображение текстового документа Выделение букв «Т» Вычисление корреляции букв «Т» с первой найденной «Т» Принятие решения о наличие вложения Аномалии не обнаружены Аномалии обнаружены Есть вложение Нет вложения Схема 6. Блок - схема алгоритма работы атаки вычислением корреляции одинаковых букв текста 30 Следует пояснить этап выделения букв «Т». На сегодняшний день существуют алгоритмы контурного анализа изображения, позволяющие в автоматическом режиме выделять одинаковые буквы текста. Процедура выделения контуров включает в себя два этапа. Вначале на изображениях обнаруживаются яркостные перепады, образующие контуры, а затем результаты сравниваются с порогом. Если результат обнаружения превышает порог, то считается, что этот пиксель изображения принадлежит контуру. Градиентные методы обнаружения перепадов яркости: метод Робертса; метод Превитта; метод Собела; метод пересечения нулевого уровня; метод Кирша; метод Уоллиса; метод Канни. Затем найденные контуры сравниваются с шаблоном и таким образом автоматически находятся все схожие контуры. 31 Тест: Целью данного теста является получение статистики схожести букв «Т» в изображении текстового документа формата А4 до и после вложения секретной информации: было выбрано три изображения текстовых документов формата А4; из них выделены по 24 первых встретившихся букв «Т», каждая буква сохранена виде отдельного изображения размером 50 х 50 пикселей; произведено совмещение центров букв; высчитана корреляция найденных букв «Т» с первой найденной на изображении; те же операции проделаны после вложения в покрывающие сообщения секретной информации с параметрами n = 20 и k = 0,01 , что соответствует вложению 8000 – 12000 бит/ на страницу текста формата А4. На рисунках 5 и 6 приведены найденные буквы «Т» первого изображения до и после вложения соответственно. На рисунках 7 и 8 приведены найденные буквы «Т» второго изображения до и после вложения соответственно. На рисунках 9 и 10 приведены найденные буквы «Т» третьего изображения до и после вложения соответственно. 32 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 «Т» № 21 «Т» № 22 «Т» № 23 «Т» № 24 Рисунок 5. 24 первые буквы «Т», найденные в первом изображении 33 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 «Т» № 21 «Т» № 22 «Т» № 23 «Т» № 24 Рисунок 6. 24 первые буквы «Т», найденные в первом изображении после вложения 34 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 «Т» № 21 «Т» № 22 «Т» № 23 «Т» № 24 Рисунок 7. 24 первые буквы «Т», найденные во втором изображении 35 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 «Т» № 21 «Т» № 22 «Т» № 23 «Т» № 24 Рисунок 8. 24 первые буквы «Т», найденные во втором изображении после вложения 36 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 «Т» № 21 «Т» № 22 «Т» № 23 «Т» № 24 Рисунок 9. 24 первые буквы «Т», найденные в третьем изображении 37 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 «Т» № 21 «Т» № 22 «Т» № 23 «Т» № 24 Рисунок 10. 24 первые буквы «Т» найденные в третьем изображении после вложения 38 В таблице 5 приведены результаты вычисления корреляции для букв «Т» с первой найденной буквой «Т» для трёх покрывающих сообщений. Таблица 5. Результаты вычисления корреляции для букв «Т» ПС 1 ПС 2 ПС 3 Корр. букв «Т» до влож. после до влож. после до влож. после «Т» № 1 / «Т» № 2 0,8661 0,8485 0,7141 0,857 0,9075 0,9075 «Т» № 1 / «Т» № 3 0,9401 0,9751 0,9558 0,8469 0,9353 0,9353 «Т» № 1 / «Т» № 4 0,8793 0,8565 0,8539 0,8672 0,8276 0,8732 «Т» № 1 / «Т» № 5 0,9439 0,8892 0,927 0,7609 0,9206 0,9162 «Т» № 1 / «Т» № 6 0,9133 0,7301 0,9042 0,7633 0,9483 0,9425 «Т» № 1 / «Т» № 7 0,8362 0,9466 0,8833 0,8557 0,9588 0,9474 «Т» № 1 / «Т» № 8 0,9196 0,7637 0,8361 0,8733 0,8751 0,8552 «Т» № 1 / «Т» № 9 0,8777 0,9015 0,7876 0,8404 0,813 0,8166 «Т» № 1 / «Т» № 10 0,9428 0,8429 0,7177 0,8555 0,9148 0,9148 «Т» № 1 / «Т» № 11 0,8827 0,8919 0,8996 0,8839 0,8911 0,8871 «Т» № 1 / «Т» № 12 0,9586 0,8853 0,7215 0,8689 0,8474 0,814 «Т» № 1 / «Т» № 13 0,9415 0,8356 0,9199 0,8845 0,897 0,8474 «Т» № 1 / «Т» № 14 0,9626 0,8991 0,7429 0,7794 0,9135 0,9093 «Т» № 1 / «Т» № 15 0,9408 0,8784 0,8229 0,7889 0,8672 0,8672 «Т» № 1 / «Т» № 16 0,9159 0,8181 0,8897 0,9241 0,8166 0,8202 «Т» № 1 / «Т» № 17 0,9586 0,873 0,6854 0,9166 0,8633 0,853 «Т» № 1 / «Т» № 18 0,9386 0,8397 0,7662 0,7748 0,853 0,8469 «Т» № 1 / «Т» № 19 0,9196 0,8536 0,9136 0,8264 0,8772 0,8772 «Т» № 1 / «Т» № 20 0,8636 0,7432 0,8341 0,9192 0,9523 0,9523 «Т» № 1 / «Т» № 21 0,9196 0,8048 0,7593 0,8912 0,8413 0,8911 «Т» № 1 / «Т» № 22 0,9493 0,8596 0,7281 0,778 0,8672 0,8352 «Т» № 1 / «Т» № 23 0,8512 0,807 0,9105 0,8755 0,8882 0,8839 «Т» № 1 / «Т» № 24 0,9074 0,8009 0,8284 0,8975 0,9319 0,9272 Средн. 0,914304 0,849752 0,826165 0,849091 0,887313 0,883509 Анализируя полученную статистику, можно сделать заключение о том, что наше предположение, заключавшееся в том, что после вложения буквы с вложением будут сильнее отличаться от таких же букв, но без вложения оказалось ложным даже для скорости вложения равной 8000 – 12000 бит/ на страницу текста формата А4. 39 Для скоростей вложения менее 8000 бит/ на страницу текста формата А4 данное предположение тем более оказывается ложным. Из последней строки таблицы 5, в которой содержатся средние значения корреляции найденных букв с первой обнаруженной видно, что после вложения в ПС 2 секретной информации схожесть букв увеличилась (средняя корреляция до вложения составляла 0,826165, после вложения она стала равной 0,849091), данный факт привёл нас к выводу о том, что при вложении со скоростью менее 12000 бит/ на страницу текста формата А4 данный метод не позволяет выбрать порог с высокой степенью обнаружения вложения секретной информации. 3.3. Атака выполнением двумерного преобразования Фурье от сканированных изображений При фильтрации изображений часто переходят из пространственной области в частотную, выполняя двумерное преобразование Фурье. Переход в частотную область обусловлен тем, что шум порождает частотные всплески, которые можно обнаружить, анализируя спектр Фурье изображения. Основываясь на этом, появилось следующее предположение: вложение секретной информации вызовет появление в спектре Фурье изображений характерных частотных всплесков в области высоких частот. В качестве порога предполагалось использовать среднее значение корреляции спектров Фурье изображений букв «Т» со спектром Фурье изображения первой найденной буквы «Т». Блок - схема алгоритма работы атаки выполнением двумерного преобразования Фурье от сканированных текстовых документов изображена на схеме 7. 40 Пояснения к работе алгоритма: Вычисление абсолютного значения каждого элемента массива производится из-за того, что после выполнения двумерного преобразования Фурье каждый элемент массива представлен суммой вещественной и мнимой части; Логарифмирование спектра Фурье изображения производится потому, что динамический диапазон значений спектра весьма широк (от 0 до 204000); Перенос начала координат преобразования в центр частотной области производится для лучшей наглядности. 41 Изображение текстового документа Выполнение двумерного преобразования Фурье Вычисление абсолютного значения каждого элемента массива Логарифмирование спектра Фурье изображения Перенос начала координат преобразования в центр частотной области Принятие решения о наличие вложения Аномалии не обнаружены Обнаружены аномалии Есть вложение Нет вложения Схема 7. Блок - схема алгоритма работы атаки выполнением двумерного преобразования Фурье 42 Тест: Целью теста является получение статистики схожести спектров Фурье изображений букв «Т» в изображение текстового документа формата А4 до и после вложения секретной информации: было выбрано три изображения текстовых документов формата А4; из каждого изображения выбраны первые двадцать букв «Т»; для каждой буквы «Т» выполнено двумерное преобразование Фурье; вычислено абсолютное значение каждого элемента массива; произведено логарифмирование спектра Фурье изображения; произведён перенос начал координат в центры частотных областей; те же операции проделаны после вложения в покрывающие сообщения секретной информации с параметрами n = 20 и k = 0,01 , что соответствует вложению 8000 – 12000 бит/ на страницу текста формата А4; для каждой пары спектров Фурье изображений рассчитана корреляция. На рисунках 11 и 12 приведены спектры Фурье изображений букв «Т» первого изображения до и после вложения секретной информации соответственно. На рисунках 13 и 14 приведены спектры Фурье изображений букв «Т» второго изображения до и после вложения секретной информации соответственно. На рисунках 15 и 16 приведены спектры Фурье изображений букв «Т» третьего изображения до и после вложения секретной информации. 43 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 Рисунок 11. Спектры Фурье изображений букв «Т» первого изображения 44 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 Рисунок 12. Спектры Фурье изображений букв «Т» первого изображения после вложения 45 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 Рисунок 13. Спектры Фурье изображений букв «Т» второго изображения 46 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 Рисунок 14. Спектры Фурье изображений букв «Т» второго изображения после вложения 47 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 Рисунок 15. Спектры Фурье изображений букв «Т» третьего изображения 48 «Т» № 1 «Т» № 2 «Т» № 3 «Т» № 4 «Т» № 5 «Т» № 6 «Т» № 7 «Т» № 8 «Т» № 9 «Т» № 10 «Т» № 11 «Т» № 12 «Т» № 13 «Т» № 14 «Т» № 15 «Т» № 16 «Т» № 17 «Т» № 18 «Т» № 19 «Т» № 20 Рисунок 16. Спектры Фурье изображений букв «Т» третьего изображения после вложения 49 Визуальный анализ спектров Фурье изображений букв «Т» не позволил выявить характерных частотных всплесков. В таблице 6 приведены результаты вычисления корреляции спектров Фурье изображений букв «Т» со спектром Фурье изображения первой найденной буквы «Т» до и после вложения секретной информации. Таблица 6. Вычисление корреляции спектров Фурье изображений букв «Т» до и после вложения Корр. букв «Т» ПС 1 ПС 2 ПС 3 до влож. после до влож. после до влож. после «Т» № 1 / «Т» № 2 0,6416 0,6467 0,5925 0,6145 0,6301 0,6301 «Т» № 1 / «Т» № 3 0,7183 0,695 0,7569 0,617 0,6885 0,6885 «Т» № 1 / «Т» № 4 0,6753 0,6757 0,6421 0,6181 0,628 0,6296 «Т» № 1 / «Т» № 5 0,7071 0,6918 0,7087 0,5639 0,6638 0,6664 «Т» № 1 / «Т» № 6 0,7007 0,6673 0,6763 0,5926 0,7087 0,7047 «Т» № 1 / «Т» № 7 0,5997 0,6057 0,6821 0,6113 0,7194 0,7063 «Т» № 1 / «Т» № 8 0,6641 0,6684 0,6685 0,6177 0,6777 0,6777 «Т» № 1 / «Т» № 9 0,6329 0,6139 0,6542 0,5894 0,627 0,6446 «Т» № 1 / «Т» № 10 0,687 0,6789 0,7247 0,5948 0,6092 0,6092 «Т» № 1 / «Т» № 11 0,6277 0,592 0,6705 0,6112 0,6492 0,6692 «Т» № 1 / «Т» № 12 0,7857 0,7484 0,6944 0,5872 0,6234 0,5984 «Т» № 1 / «Т» № 13 0,7879 0,7616 0,68 0,5923 0,693 0,6732 «Т» № 1 / «Т» № 14 0,7388 0,707 0,6941 0,6108 0,6173 0,6552 «Т» № 1 / «Т» № 15 0,6747 0,6674 0,6531 0,5876 0,6641 0,6641 «Т» № 1 / «Т» № 16 0,7349 0,6949 0,6813 0,5945 0,5859 0,5748 «Т» № 1 / «Т» № 17 0,7321 0,6855 0,6821 0,6221 0,6339 0,6339 «Т» № 1 / «Т» № 18 0,6575 0,6606 0,6411 0,5847 0,5989 0,5868 «Т» № 1 / «Т» № 19 0,7448 0,7276 0,6992 0,5903 0,6598 0,6598 «Т» № 1 / «Т» № 20 0,6728 0,6635 0,6161 0,6359 0,7564 0,7564 Среднее 0,6938 0,6764 0,6746 0,6018 0,6544 0,6541 Исходя из результатов таблицы 6, мы пришли к следующему выводу: хотя после вложения секретной информации средняя корреляция спектров Фурье изображений букв «Т» оказывается меньше, средней корреляции спектров Фурье изображений букв «Т» до вложения, по результатам последней строки таблицы 6 (среднее значение корреляции спектров Фурье 50 изображений букв «Т») не представляется возможным выбрать порог с достаточной степенью обнаружения вложения. 3.4. Анализ количества единичных выбросов Визуальный анализ изображений текстовых документов формата А4 с выделенными увеличение изменениями, числа появившимися единичных выбросов после после вложения, вложения выявил секретной информации. Под единичными выбросами понимаются искажения следующих четырёх видов: Вверх Вниз Вправо Влево (ВВЕРХ) Основное предположение при разработке данного метода заключалось в следующем: число единичных выбросов у одинакового объёма текста на странице формата А4, будет схожим, а при вложении их число увеличится, что даст нам возможность выбрать порог, который бы обеспечил высокую степень обнаружения вложения секретной информации. 51 Начальные условия: для стегоанализа предоставлено одно или несколько изображений; для сбора статистики предоставлено некоторое количество тестовых изображений без вложения с того же самого сканера; все изображения должны быть распечатаны на одном и том же принтере и отсканированы одним и тем же сканером (данное условие появилось в результате исследований); известны алгоритмы погружения и извлечения секретной информации; покрывающее сообщение не известно. Блок - схема алгоритма работы атаки анализом количества единичных выбросов изображена на схеме 8. Пояснения к работе алгоритма: база тестовых изображений предназначена для сбора статистики, необходимой для выбора порогов; вычисление количества чёрных пикселей выполняется с целью определения плотности текста на странице; пороги выбираются в соответствии с плотностями текста на странице (в нашем исследовании шаг выбирался равным 50 000 чёрных пикселей). 52 База тестовых Изображение для изображений стегоанализа Вычисление количества единичных выбросов Вычисление количества единичных выбросов Вычисление количества чёрных пикселей на странице Вычисление количества чёрных пикселей на странице Выбор порогов для различных объёмов текста Сравнение Порог превышен Порог не превышен Есть вложение Нет вложения Схема 8. Блок – схема алгоритма работы атаки анализом количества единичных выбросов Как показали тесты, статистика, собранная при использовании одного принтера и одного сканера, отличается от статистики собранной при замене принтера или сканера. По этой причине в исследовании были использованы 5 различных принтеров и 2 сканера. 53 Тест № 1: Целью данного теста является получение статистики прироста единичных выбросов при вложении секретной информации в изображение текстового документа формата А4 со следующими параметрами: [n = 20, k = 0,01] ; [n = 100, k = 0,01] ; [n = 100, k = 0,1] . При таком выборе параметров n и k в изображение текстового документа формата А4 в первом случае производится вложение 8000 – 12000 бит секретной информации, при выборе второй пары производится вложение 550 – 600 бит секретной информации, при выборе третьей пары вкладывается 400 – 500 бит секретной информации. Текстовый документ, объёмом в 20 страниц был распечатан на четырёх разных принтерах; распечатанные страницы отсканированы на одном сканере; во все изображения текстовых документов произведено вложение секретной информации с указанными ранее параметрами n и k; произведен подсчет количества единичных выбросов до и после вложения. В таблицах 7, 8, 9 и 10 приведены результаты подсчёта единичных выбросов для первого принтера до вложения и после вложения с тремя парами параметров n и k. В таблицах 11, 12, 13 и 14 результаты для второго принтера, в таблицах 15, 16, 17 и 18 для третьего, в таблицах 19, 20, 21 и 22 для четвёртого. 54 Таблица 7. Количество единичных выбросов для принтера № 1 до вложения Изображение до вложения 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 462 545 601 637 617 661 607 594 586 554 612 560 627 616 444 560 603 511 533 537 Вниз 509 609 660 701 717 704 678 791 671 632 772 676 721 721 559 649 595 652 721 661 Влево 495 607 695 694 623 625 725 675 725 616 781 625 672 667 512 607 644 531 587 565 Вправо 492 672 555 712 673 587 651 660 663 592 680 608 670 666 465 539 601 531 564 540 ВСЕГО 1958 2433 2511 2744 2630 2577 2661 2720 2645 2394 2845 2469 2690 2670 1980 2355 2443 2225 2405 2303 Таблица 8. Количество единичных выбросов для принтера № 1 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 8522 9024 10011 10231 9994 10296 10165 10421 9643 9797 9991 9489 9580 10084 8094 9619 9793 9066 9639 9734 Вверх 602 654 743 788 799 818 750 743 728 691 782 696 746 780 565 693 734 591 665 679 Вниз 542 654 713 773 791 770 735 866 728 708 830 726 776 767 622 695 655 705 782 716 55 Влево 649 757 866 851 806 787 862 819 897 761 937 788 782 845 621 778 788 682 748 702 Вправо 720 936 787 951 887 825 903 897 881 815 915 823 885 872 666 764 808 742 790 792 ВСЕГО 2513 3001 3109 3363 3283 3200 3250 3325 3234 2975 3464 3033 3189 3264 2474 2930 2985 2720 2985 2889 Таблица 9. Количество единичных выбросов для принтера № 1 после вложения с [n = 100, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 567 584 597 615 616 608 618 613 594 601 611 590 584 611 555 617 589 582 620 609 Вверх 464 551 592 639 627 661 602 595 592 553 609 562 618 609 455 572 614 506 528 528 Вниз 509 611 662 702 721 704 680 794 673 632 775 679 726 721 561 650 595 652 723 665 Влево 495 614 699 698 629 626 732 682 730 624 785 625 679 673 518 614 652 539 598 574 Вправо 493 688 561 720 677 587 657 667 676 603 688 613 674 670 475 545 607 537 578 545 ВСЕГО 1961 2464 2514 2759 2654 2578 2671 2738 2671 2412 2857 2479 2697 2673 2009 2381 2468 2234 2427 2312 Таблица 10. Количество единичных выбросов для принтера № 1 после вложения с [n = 100, k = 0,1] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 372 439 463 486 470 498 492 489 437 474 440 418 407 435 338 443 480 407 445 439 Вверх 477 544 602 635 622 649 599 600 591 552 615 562 627 623 440 567 606 505 525 537 56 Вниз 509 612 660 700 718 704 678 793 674 635 775 677 723 722 561 654 594 651 722 661 Влево 498 614 700 699 628 631 733 681 732 623 783 629 676 674 520 610 648 533 594 567 Вправо 496 687 561 721 676 597 654 669 669 598 687 608 674 669 472 547 608 540 571 542 ВСЕГО 1980 2457 2523 2755 2644 2581 2664 2743 2666 2408 2860 2476 2700 2688 1993 2378 2456 2229 2412 2307 Таблица 11. Количество единичных выбросов для принтера № 2 до вложения Изображение до вложения 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 409 428 553 586 511 470 534 559 493 517 520 464 511 497 406 483 452 458 465 474 Вниз 577 578 667 645 654 670 627 688 625 667 700 673 650 622 521 604 600 592 619 646 Влево 466 500 549 623 585 579 612 555 543 574 565 517 501 524 452 511 518 506 481 546 Вправо 493 528 624 579 563 636 562 594 534 547 532 514 508 528 393 526 527 490 560 535 ВСЕГО 1945 2034 2393 2433 2313 2355 2335 2396 2195 2305 2317 2168 2170 2171 1772 2124 2097 2046 2125 2201 Таблица 12. Количество единичных выбросов для принтера № 2 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 8624 9146 10137 10393 10105 10445 10144 10544 9789 9838 10111 9408 9607 10160 8160 9624 9857 9005 9649 9809 Вверх 521 573 684 657 678 630 669 702 673 607 638 622 666 653 562 608 587 565 583 600 57 Вниз 638 641 759 693 707 739 682 759 682 711 759 727 697 698 585 647 677 641 674 708 Влево 570 644 691 775 724 755 769 716 724 726 720 672 774 687 569 667 662 632 652 677 Вправо 693 765 908 848 793 910 813 824 772 802 801 754 830 794 594 767 775 728 821 753 ВСЕГО 2422 2623 3042 2973 2902 3034 2933 3001 2851 2846 2918 2775 2967 2832 2310 2689 2701 2566 2730 2738 Таблица 13. Количество единичных выбросов для принтера № 2 после вложения с [n = 100, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 583 598 588 632 623 629 635 627 596 615 623 603 628 613 540 621 621 593 612 619 Вверх 413 424 558 584 514 472 548 550 497 513 522 461 519 494 421 487 450 454 469 471 Вниз 577 582 675 648 657 671 627 690 630 667 706 675 651 629 523 607 605 593 622 648 Влево 472 509 556 625 591 584 620 563 556 581 567 521 507 536 458 520 525 513 491 550 Вправо 500 543 636 590 577 646 570 605 542 556 536 525 518 539 400 533 536 507 572 539 ВСЕГО 1962 2058 2425 2447 2339 2373 2365 2408 2225 2317 2331 2182 2195 2198 1802 2147 2116 2067 2154 2208 Таблица 14. Количество единичных выбросов для принтера № 2 после вложения с [n = 100, k = 0,1] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 358 426 479 482 474 485 465 505 448 459 460 444 418 463 329 448 451 402 438 442 Вверх 414 429 559 580 518 478 540 561 495 514 517 454 511 498 400 482 454 459 464 457 58 Вниз 578 582 674 650 657 672 626 692 630 666 702 673 652 629 523 606 602 594 621 647 Влево 468 502 556 624 589 583 616 563 553 580 570 519 502 533 455 524 522 507 486 551 Вправо 497 539 635 586 571 643 568 596 540 556 533 522 516 535 400 534 533 498 567 548 ВСЕГО 1957 2052 2424 2440 2335 2376 2350 2412 2218 2316 2322 2168 2181 2195 1778 2146 2111 2058 2138 2203 Таблица 15. Количество единичных выбросов для принтера № 3 до вложения Изображение до вложения 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 352 368 429 440 415 445 445 423 386 372 405 370 394 433 353 360 368 332 358 384 Вниз 1097 1062 1223 1224 1241 1265 1239 1246 1143 1105 1203 1139 1093 1127 925 1059 1080 1050 1151 1109 Влево 748 798 887 887 792 889 863 923 824 774 792 750 820 729 643 786 759 703 783 756 Вправо 670 768 827 880 811 835 831 835 792 769 825 718 723 764 643 746 746 667 780 737 ВСЕГО 2867 2996 3366 3431 3259 3434 3378 3427 3145 3020 3225 2977 3030 3053 2564 2951 2953 2752 3072 2986 Таблица 16. Количество единичных выбросов для принтера № 3 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 8494 8986 9907 10146 9931 10217 10031 10234 9547 9746 9941 9391 9338 9970 7869 9493 9650 8920 9474 9680 Вверх 510 539 599 564 610 631 625 626 550 534 562 524 557 581 505 534 528 493 533 558 59 Вниз 1124 1102 1259 1263 1271 1292 1281 1276 1168 1159 1253 1184 1135 1170 959 1111 1130 1094 1183 1157 Влево 918 985 1071 1089 979 1078 1072 1118 1019 998 981 926 1017 934 791 963 905 859 953 906 Вправо 879 1004 1024 1081 1005 1062 1048 1064 1023 983 1045 922 925 950 829 984 976 868 958 940 ВСЕГО 3431 3630 3953 3997 3865 4063 4026 4084 3760 3674 3841 3556 3634 3635 3084 3592 3539 3314 3627 3561 Таблица 17. Количество единичных выбросов для принтера № 3 после вложения с [n = 100, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 562 588 571 605 589 603 626 600 583 580 611 569 587 580 518 614 566 570 582 603 Вверх 348 367 445 434 430 463 458 436 392 378 422 376 405 443 358 374 366 346 367 383 Вниз 1096 1066 1225 1225 1243 1265 1238 1245 1144 1104 1202 1140 1096 1128 929 1059 1080 1053 1153 1112 Влево 752 802 898 895 797 902 883 939 830 793 803 756 833 732 642 798 766 711 786 760 Вправо 679 776 838 886 818 842 843 845 799 778 831 727 727 767 647 759 748 680 789 748 ВСЕГО 2875 3011 3406 3440 3288 3472 3422 3465 3165 3053 3258 2999 3061 3070 2576 2990 2960 2790 3095 3003 Таблица 18. Количество единичных выбросов для принтера № 3 после вложения с [n = 100, k = 0,1] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 340 410 440 484 445 468 450 458 421 417 427 414 393 415 286 425 426 361 402 412 Вверх 360 376 433 430 417 452 457 425 403 389 419 370 400 440 364 367 375 343 369 389 60 Вниз 1095 1061 1224 1224 1242 1264 1240 1246 1146 1105 1207 1141 1096 1129 928 1061 1081 1050 1152 1111 Влево 751 802 894 902 796 897 875 934 831 783 800 755 827 730 645 791 768 712 793 766 Вправо 674 778 832 883 819 842 838 845 797 777 830 721 729 770 646 750 755 678 787 746 ВСЕГО 2880 3017 3383 3439 3274 3455 3410 3450 3177 3054 3256 2987 3052 3069 2583 2969 2979 2783 3101 3012 Таблица 19. Количество единичных выбросов для принтера № 4 до вложения Изображение до вложения 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 322 400 402 498 454 438 428 405 418 431 465 387 438 445 401 413 425 406 432 447 Вниз 445 480 548 521 509 568 568 601 539 556 566 569 541 546 431 504 527 501 560 524 Влево 492 580 571 622 574 610 526 595 571 562 556 505 540 548 452 540 507 531 598 553 Вправо 484 544 565 576 547 571 564 583 555 541 543 526 480 562 468 524 560 479 526 545 ВСЕГО 1743 2004 2086 2217 2084 2187 2086 2184 2083 2090 2130 1987 1999 2101 1752 1981 2019 1917 2116 2069 Таблица 20. Количество единичных выбросов для принтера № 4 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 8673 9034 9987 10209 10060 10409 10223 10483 9823 9882 10132 9571 9549 10084 8087 9712 9903 9015 9648 9713 Вверх 497 549 577 663 643 648 590 589 562 627 634 543 583 638 557 567 579 593 608 649 61 Вниз 513 535 594 583 568 641 617 652 595 612 637 625 608 596 480 560 608 554 621 588 Влево 626 723 708 789 731 783 683 784 734 753 719 652 671 744 589 706 645 673 740 723 Вправо 697 808 816 856 823 828 838 828 799 777 812 752 732 833 690 776 814 720 793 798 ВСЕГО 2333 2615 2695 2891 2765 2900 2728 2853 2690 2769 2802 2572 2594 2811 2316 2609 2646 2540 2762 2758 Таблица 21. Количество единичных выбросов для принтера № 4 после вложения с [n = 100, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 604 595 605 626 606 623 631 631 600 616 615 595 618 613 576 597 613 578 609 606 Вверх 322 403 406 505 465 437 440 415 431 452 474 396 439 454 407 422 437 402 444 457 Вниз 445 484 556 521 513 573 576 602 541 557 569 574 545 549 434 508 533 502 560 529 Влево 322 403 406 505 465 437 440 415 431 452 474 396 439 454 407 422 437 402 444 457 Вправо 484 553 573 583 553 577 572 591 568 548 551 536 494 569 478 533 570 481 536 553 ВСЕГО 1573 1843 1941 2114 1996 2024 2028 2023 1971 2009 2068 1902 1917 2026 1726 1885 1977 1787 1984 1996 Таблица 22. Количество единичных выбросов для принтера № 4 после вложения с [n = 100, k = 0,1] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено бит 364 440 482 501 469 503 483 476 459 437 482 451 421 485 334 457 461 399 460 460 Вверх 333 401 401 508 460 451 434 405 422 441 472 393 440 453 405 421 433 414 442 460 62 Вниз 448 483 552 522 510 573 572 601 540 558 568 571 543 550 432 506 530 502 561 526 Влево 496 585 580 633 579 618 529 603 579 570 562 514 545 560 456 549 511 539 605 563 Вправо 487 554 571 587 556 580 570 590 567 548 552 536 487 569 474 531 566 488 536 552 ВСЕГО 1764 2023 2104 2250 2105 2222 2105 2199 2108 2117 2154 2014 2015 2132 1767 2007 2040 1943 2144 2101 Визуальный анализ позволил выявить увеличение количества единичных выбросов после вложения секретной информации. Из таблиц 7 – 22 видно, что при вложении секретного сообщения со скоростью 8000 – 12000 бит/ на страницу текста формата А4, прирост количества единичных выбросов составляет 500 – 600 выбросов. При вложении секретного сообщения со скоростями 550 – 600 и 400 – 500 бит/ на страницу текста формата А4 прирост не превышает 30 выбросов. Из таблиц 7 – 22 также видно, что задача выбора универсального порога, который бы обеспечил высокую надёжность обнаружения для всех принтеров оказывается довольно трудной (для одного и того же текстового документа, распечатанного на различных принтерах разброс в количестве единичных выбросов доходит до 800 выбросов); 63 Тест № 2: Целью второго теста является оценка эффективности обнаружения вложения секретной информации с различными скоростями вложения методом анализа количества единичных выбросов. Текстовый документ, объёмом в 80 страниц был распечатан на пятом принтере; распечатанные документы формата А4 отсканированы на одном сканере; первые двадцать изображений были использованы для сбора статистики и последующего выбора порогов; вложение проводилось со следующими парами параметров: o [n = 20, k = 0,01]; o [n = 100, k = 0,01]; o [n = 100, k = 0,1]. каждая пара параметров была использована для вложения в пять, выбранных произвольным образом, изображений; произведён поиск изображений с вложениями. В таблице 23 представлен результат подсчёта количества чёрных пикселей и единичных выбросов в 20 тестовых изображениях. В таблице 24 представлены пороги, выбранные на основе статистики собранной по 20 тестовым изображениям. 64 Таблица 23. Статистика 20 тестовых изображений Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 431 430 524 520 566 533 509 532 523 500 492 486 438 512 476 430 488 519 448 489 Вниз 449 560 639 700 618 670 606 694 649 699 710 616 643 626 616 659 605 611 636 704 Влево Вправо ВСЕГО 495 455 1830 670 622 2282 709 742 2614 713 684 2617 737 668 2589 699 759 2661 751 732 2598 736 705 2667 638 637 2447 735 710 2644 723 684 2609 602 673 2377 694 615 2390 683 617 2438 608 603 2303 705 646 2440 660 637 2390 666 652 2448 669 656 2409 651 634 2478 Количество чёрных пикселей 630132 755554 876796 874908 856913 863559 868162 904780 810166 865220 849712 811326 805208 836235 761816 801786 817163 804599 812757 823540 Таблица 24. Выбранные пороги Количество чёрных пикселей Пороги для количества выбросов 600000 – 650000 1950 650000 – 700000 2150 700000 – 750000 2350 750000 – 800000 2550 800000 – 850000 2750 850000 – 900000 2950 900000 – 950000 3150 65 Пояснение к выбору порогов: находится диапазон количества чёрных пикселей с наибольшим числом тестовых изображений; к максимальному количеству выбросов внутри диапазона прибавляется 150, это значение и становится порогом; далее выбираются пороги для остальных диапазонов, прибавляя или отнимая 200 от порога, выбранного для диапазона с наибольшим количеством тестовых изображений. В таблице 25 содержатся номера изображений, в которые производилось вложение, количество вложенной информации, а так же параметр difference, показывающий какое количество пикселей изменилось в исходном изображении после вложения. 66 Таблица 25. Изображения с вложениями № изображения Вложено, бит Difference Вложение с параметрами [n = 20, k = 0,01] 45 11220 5623 51 9400 4698 57 9644 4836 73 9978 5033 79 10275 5198 Вложение с параметрами [n = 100, k = 0,01] 23 608 315 27 581 272 42 621 303 48 640 326 50 618 294 Вложение с параметрами [n = 100, k = 0,1] 41 519 256 56 453 207 62 391 192 67 497 238 80 519 276 Таблица 26. Результаты обнаружения Изобр. Вверх Вниз Влево Вправо ВСЕГО 21 513 639 724 694 2570 22 503 651 680 643 2477 23 466 653 632 712 2463 24 453 529 622 665 2269 25 434 608 640 650 2332 26 405 572 609 652 2238 27 439 563 653 631 2286 28 426 573 660 651 2310 29 422 606 625 589 2242 30 426 498 666 641 2231 31 366 480 548 589 1983 32 394 501 570 639 2104 33 443 507 534 546 2030 34 420 649 648 661 2378 35 386 596 614 600 2196 36 402 520 645 624 2191 37 413 453 555 531 1952 38 391 505 576 535 2007 39 464 642 720 727 2553 40 409 593 715 597 2314 41 501 669 753 718 2641 67 Колич. черн. пикс. 850509 841826 798781 857146 870794 848059 804339 843928 806678 829630 731521 803243 783133 864319 813422 789239 744120 761440 874263 752405 877083 Рез. анализа ОК ОК ПРОПУСК ОК ОК ОК ПРОПУСК ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ПРОПУСК 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 508 539 519 795 485 481 508 465 507 601 500 568 534 554 505 672 467 369 494 526 467 498 582 530 532 499 492 496 511 551 500 740 520 531 485 544 557 718 591 659 677 606 775 640 662 684 648 644 719 624 665 689 729 660 708 595 525 657 642 560 639 647 687 706 666 623 637 698 714 646 748 661 655 564 709 695 748 754 733 740 764 998 736 769 813 727 759 850 724 763 793 857 713 890 647 666 707 758 676 750 793 783 783 825 809 785 741 825 689 992 803 800 758 809 881 1007 895 698 706 737 1091 721 762 710 683 747 937 729 759 766 814 709 940 747 561 681 691 661 711 769 794 839 791 742 732 760 813 683 1079 773 795 707 834 812 1128 823 2598 2662 2626 3659 2582 2674 2715 2523 2657 3107 2577 2755 2782 2954 2587 3210 2456 2121 2539 2617 2364 2598 2791 2794 2860 2781 2666 2650 2710 2903 2518 3559 2757 2781 2514 2896 2945 3601 3063 851749 849087 843551 946030 851785 885231 885834 841536 850749 810658 828440 883668 910328 924754 813280 829337 833376 728304 822035 837684 754718 863169 911449 871635 903199 874827 832504 843952 824490 915807 789339 859889 858867 837569 742726 902449 897774 895940 907919 ПРОПУСК ОК ОК ВЛОЖЕНИЕ ОК ОК ПРОПУСК ОК ПРОПУСК ВЛОЖЕНИЕ ОК ОК ОК ОК ПРОПУСК ВЛОЖЕНИЕ ОК ОК ОК ОК ПРОПУСК ОК ОК ОК ОК ПРОПУСК ОК ОК ОК ОК ОК ВЛОЖЕНИЕ ОК ЛОЖНАЯ ТРЕВОГА ЛОЖНАЯ ТРЕВОГА ОК ОК ВЛОЖЕНИЕ ПРОПУСК В таблице 26 приведены результаты обнаружения стегоизображений. Столбец с количеством изменённых пикселей в таблице 25 объясняет почему прирост при скоростях вложения равных 550 – 600 и 400 – 500 бит/ на страницу текста формата А4 не превышает 30. Это связано с тем, что 68 количество пикселей, которые будут изменены после вложения, составляет около 50% процентов от количества вкладываемых бит секретной информации. Результаты обнаружения СИ из таблицы 26 при выборе порогов согласно таблице 24: Обнаружены 5 из 5 СИ со скоростью вложения 8000 – 12000 бит/ на страницу текста формата А4; пропущены 5 из 5 СИ со скоростью вложения 550 – 600 бит/ на страницу текста формата А4; пропущены 5 из 5 СИ со скоростью вложения 400 – 500 бит/ на страницу текста формата А4; 2 ложные тревоги. Данный метод позволил со 100% вероятностью обнаружить СИ со скоростью вложения 8000 – 12000 бит/ на страницу текста формата А4 (при известных принтере и сканере). Предложенный метод также позволил бы обнаруживать СИ и с меньшими скоростями вложения, для этого необходимо совершенствовать метод оценки плотности текста на странице. Как было сказано в главе 2, имитация шумов сканера осуществляется за счёт того, что изменению могут быть подвергнуты только пиксели, находящиеся на границе чёрного с белым. Подсчёт количества чёрных пикселей на странице, использованный нами, считает не только граничные пиксели, пригодные для изменения, но и внутренние, которые не пригодны для изменения. По этой причине внутри шага выбранных нами порогов флуктуации количества единичных выбросов могут достигать 400 – 450 выбросов, что означает, что если прирост количества таких выбросов окажется менее 500 метод начнёт давать сбои в виде пропусков СИ или ложных тревог. 69 Это утверждение справедливо и для метода обнаружения стегосистемы подсчётом количества единичных углублений. Обнаружение СИ с низкими скоростями вложения по рассмотренным признакам не представляется возможным. 3.5. Анализ количества единичных углублений Визуальный анализ изображений текстовых документов формата А4 с выделенными изменениями, появившимися после вложения, выявил, что на ряду с увеличением числа единичных выбросов после вложения секретной информации также увеличивается число единичных углублений. Под единичными углублениями понимаются искажения следующих четырёх видов: Основное предположение при разработке данного метода заключалось в следующем: число единичных углублений у одинакового объёма текста на странице формата А4, будет схожим, а при вложении их число увеличится, что даст нам возможность выбрать порог, который обеспечит высокую степень обнаружения вложения секретной информации. 70 Начальные условия: для стегоанализа предоставлено одно или несколько изображений; для сбора статистики предоставлено некоторое количество тестовых изображений без вложения с того же самого сканера; все изображения должны быть распечатаны на одном и том же принтере и отсканированы одним и тем же сканером (данное условие появилось в результате исследований); известны алгоритмы погружения и извлечения секретной информации; покрывающее сообщение не известно. Пояснения к работе алгоритма: база тестовых изображений предназначена для сбора статистики, необходимой для выбора порогов; вычисление количества чёрных пикселей выполняется с целью определения плотности текста на странице; пороги выбираются в соответствии с плотностями текста на странице (в нашем исследовании шаг выбирался равным 50 000 чёрных пикселей). 71 Блок - схема алгоритма работы атаки анализом количества единичных углублений изображена на схеме 9. База тестовых Изображение для изображений стегоанализа Вычисление количества единичных углублений Вычисление количества единичных углублений Вычисление количества чёрных пикселей на странице Вычисление количества чёрных пикселей на странице Выбор порогов для различных объёмов текста Сравнение Порог превышен Порог не превышен Есть вложение Нет вложения Схема 9. Блок – схема алгоритма работы атаки анализом количества единичных углублений 72 Тест № 1: Целью первого теста является получение статистики прироста единичных углублений при вложении секретной информации в изображение текстового документа формата А4 со следующими параметрами: [n = 20, k = 0,01] ; [n = 100, k = 0,01] ; [n = 100, k = 0,1] . При таком выборе параметров n и k в изображение текстового документа формата А4 в первом случае производится вложение 8000 – 12000 бит секретной информации, при выборе второй пары производится вложение 550 – 600 бит секретной информации, при выборе третьей пары вкладывается 400 – 500 бит секретной информации. Текстовый документ, объёмом в 20 страниц был распечатан на четырёх разных принтерах; распечатанные страницы отсканированы на одном сканере; во все изображения текстовых документов произведено вложение секретной информации с указанными ранее параметрами n и k; произведен подсчет количества единичных углублений до и после вложения. В таблицах 27, 28, 29 и 30 приведены результаты подсчёта единичных углублений для первого принтера до вложения и после вложения с тремя парами параметров n и k соответственно. В таблицах 31, 32, 33 и 34 результаты для второго принтера, в таблицах 35, 36, 37 и 38 для третьего, в таблицах 39, 40, 41 и 42 для четвёртого. 73 Таблица 27. Количество единичных углублений для принтера № 1 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 483 599 631 628 667 666 640 679 630 578 686 622 654 670 526 605 588 551 597 591 Снизу 582 611 697 777 758 767 753 782 719 710 804 743 781 758 579 685 685 693 751 674 Слева 630 747 875 899 780 807 889 853 896 797 965 781 869 827 612 715 750 662 753 730 Справа 672 864 841 953 895 873 969 886 885 770 926 856 879 920 612 751 808 745 737 810 ВСЕГО 2367 2821 3044 3257 3100 3113 3251 3200 3130 2855 3381 3002 3183 3175 2329 2756 2831 2651 2838 2805 Таблица 28. Количество единичных углублений для принтера № 1 после вложения с n = 20, k = 0,01 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8522 9024 10011 10231 9994 10296 10165 10421 9643 9797 9991 9489 9580 10084 8094 9619 9793 9066 9639 9734 Сверху 1021 1093 1157 1176 1205 1247 1162 1220 1140 1149 1197 1115 1148 1155 991 1078 1111 969 1116 1092 74 Снизу 609 648 732 842 815 816 791 825 755 760 828 777 824 788 629 723 711 753 805 715 Слева 1205 1365 1625 1605 1487 1524 1549 1543 1580 1481 1657 1411 1505 1549 1110 1399 1408 1266 1438 1400 Справа 757 970 945 1066 1002 975 1086 999 973 891 1061 945 980 1022 689 856 913 829 821 932 ВСЕГО 3592 4076 4459 4689 4509 4562 4588 4587 4448 4281 4743 4248 4457 4514 3419 4056 4143 3817 4180 4139 Таблица 29. Количество единичных углублений для принтера № 1 после вложения с n = 100, k = 0,01 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 567 584 597 615 616 608 618 613 594 601 611 590 584 611 555 617 589 582 620 609 Сверху 490 620 641 629 687 672 653 689 649 605 702 635 675 681 563 613 610 554 603 595 Снизу 582 613 700 778 764 769 754 783 719 715 804 747 786 760 580 687 684 699 758 674 Слева 631 775 911 933 810 815 934 885 930 825 991 816 888 867 634 752 788 693 793 766 Справа 672 869 846 958 900 873 987 890 892 777 929 858 882 926 616 754 813 750 740 812 ВСЕГО 2375 2877 3098 3298 3161 3129 3328 3247 3190 2922 3426 3056 3231 3234 2393 2806 2895 2696 2894 2847 Таблица 30. Количество единичных углублений для принтера № 1 после вложения с n = 100, k = 0,1 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 358 426 479 482 474 485 465 505 448 459 460 444 418 463 329 448 451 402 438 442 Сверху 509 601 640 625 680 680 648 685 646 600 697 625 671 682 543 610 607 552 591 591 75 Снизу 582 612 698 779 763 770 752 782 719 714 801 746 784 760 580 689 686 697 756 675 Слева 648 778 897 919 810 840 922 895 928 815 988 802 881 856 626 740 780 688 778 739 Справа 675 866 845 959 898 878 874 890 884 777 931 857 882 921 614 753 814 748 740 812 ВСЕГО 2414 2857 3080 3282 3151 3168 3196 3252 3177 2906 3417 3030 3218 3219 2363 2792 2887 2685 2865 2817 Таблица 31. Количество единичных углублений для принтера № 2 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 448 480 604 642 552 578 600 651 540 586 573 585 588 614 474 542 545 499 524 595 Снизу 548 488 675 605 609 580 675 659 575 601 611 590 644 591 468 560 611 569 596 605 Слева 548 622 674 719 773 787 705 708 723 722 780 682 644 691 569 724 679 651 658 728 Справа 448 480 604 642 552 578 600 651 540 586 573 585 588 614 474 542 545 499 524 595 ВСЕГО 1992 2070 2557 2608 2486 2523 2580 2669 2378 2495 2537 2442 2464 2510 1985 2368 2380 2218 2302 2523 Таблица 32. Количество единичных углублений для принтера № 2 после вложения с n = 20, k = 0,01 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8624 9146 10137 10393 10105 10445 10144 10544 9789 9838 10111 9408 9607 10160 8160 9624 9857 9005 9649 9809 Сверху 1019 1038 1248 1269 1167 1220 1218 1234 1176 1192 1103 1158 1172 1166 937 1060 1109 1064 1072 1132 76 Снизу 579 549 731 686 656 633 730 689 630 642 660 622 703 635 510 607 667 618 647 651 Слева 1103 1206 1372 1488 1496 1455 1351 1383 1374 1468 1467 1336 1409 1367 1115 1411 1315 1332 1286 1342 Справа 758 770 944 961 893 939 939 990 889 879 926 902 967 871 671 825 851 792 860 879 ВСЕГО 3459 3563 4295 4404 4212 4247 4238 4296 4069 4181 4156 4018 4251 4039 3233 3903 3942 3806 3865 4004 Таблица 33. Количество единичных углублений для принтера № 2 после вложения с n = 100, k = 0,01 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 583 598 588 632 623 629 635 627 596 615 623 603 628 613 540 621 621 593 612 619 Сверху 470 502 638 682 578 603 626 668 567 612 593 596 617 629 496 561 558 521 548 595 Снизу 549 490 677 606 611 587 675 661 577 606 614 591 650 594 472 563 613 572 599 607 Слева 576 646 704 744 808 824 730 740 752 766 812 711 677 720 582 764 708 686 696 742 Справа 683 667 831 856 785 856 812 892 784 758 807 800 776 761 571 722 743 685 741 773 ВСЕГО 2278 2305 2850 2888 2782 2870 2843 2961 2680 2742 2826 2698 2720 2704 2121 2610 2622 2464 2584 2717 Таблица 34. Количество единичных углублений для принтера № 2 после вложения с n = 100, k = 0,1 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 358 426 479 482 474 485 465 505 448 459 460 444 418 463 329 448 451 402 438 442 Сверху 463 496 630 659 567 606 617 674 553 609 587 591 599 628 487 554 555 519 543 607 77 Снизу 548 490 677 605 611 587 676 660 578 602 614 589 646 592 471 562 611 573 597 608 Слева 569 638 689 752 800 807 724 737 743 754 800 713 662 712 582 762 703 677 691 753 Справа 683 665 830 852 783 851 811 892 782 754 809 795 774 761 571 722 743 684 739 778 ВСЕГО 2263 2289 2826 2868 2761 2851 2828 2963 2656 2719 2810 2688 2681 2693 2111 2600 2612 2453 2570 2746 Таблица 35. Количество единичных углублений для принтера № 3 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 486 551 575 581 615 672 636 668 598 636 647 595 670 621 523 637 594 563 562 626 Снизу 738 786 900 892 902 936 921 945 911 744 887 791 800 840 659 863 854 802 861 786 Слева 692 723 843 827 785 820 770 878 828 751 821 785 759 709 697 734 764 687 760 784 Справа 662 734 833 926 896 877 907 923 850 831 869 756 805 829 680 789 836 767 914 839 ВСЕГО 2578 2794 3151 3226 3198 3305 3234 3414 3187 2962 3224 2927 3034 2999 2559 3023 3048 2819 3097 3035 Таблица 36. Количество единичных углублений для принтера № 3 после вложения с n = 20, k = 0,01 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8494 8986 9907 10146 9931 10217 10031 10234 9547 9746 9941 9391 9338 9970 7869 9493 9650 8920 9474 9680 Сверху 825 975 963 922 1000 1051 1012 1078 977 990 1035 937 983 938 804 963 907 911 902 947 78 Снизу 762 818 921 922 927 948 947 980 938 771 929 812 826 860 683 882 860 824 875 825 Слева 1285 1312 1509 1544 1521 1512 1447 1603 1453 1427 1533 1412 1407 1371 1219 1398 1416 1260 1422 1451 Справа 728 840 906 1028 995 980 1007 1042 954 948 967 850 888 927 746 880 942 850 1010 946 ВСЕГО 3600 3945 4299 4416 4443 4491 4413 4703 4322 4136 4464 4011 4104 4096 3452 4123 4125 3845 4209 4169 Таблица 37. Количество единичных углублений для принтера № 3 после вложения с n = 100, k = 0,01 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 562 588 571 605 589 603 626 600 583 580 611 569 587 580 518 614 566 570 582 603 Сверху 494 565 594 581 620 700 668 699 611 656 672 608 700 625 542 652 597 575 574 640 Снизу 741 788 903 892 903 939 922 945 909 744 888 792 794 842 659 863 852 800 863 786 Слева 712 747 872 859 824 855 802 903 851 776 847 820 787 717 711 778 782 724 783 817 Справа 664 736 835 930 899 885 911 924 852 835 873 760 808 830 682 793 837 775 917 843 ВСЕГО 2611 2836 3204 3262 3246 3379 3303 3471 3223 3011 3280 2980 3089 3014 2594 3086 3068 2874 3137 3086 Таблица 38. Количество единичных углублений для принтера № 3 после вложения с n = 100, k = 0,1 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 340 410 440 484 445 468 450 458 421 417 427 414 393 415 286 425 426 361 402 412 Сверху 492 567 587 580 619 691 652 685 606 649 668 601 684 627 536 652 600 575 571 635 79 Снизу 738 786 902 891 903 936 921 946 912 746 889 792 799 838 655 863 852 799 862 787 Слева 703 736 862 866 822 844 809 902 844 776 845 804 779 729 705 764 789 709 781 814 Справа 663 738 832 925 898 882 910 924 851 833 871 757 805 830 682 789 840 772 916 841 ВСЕГО 2596 2827 3183 3262 3242 3353 3292 3457 3213 3004 3273 2954 3067 3024 2578 3068 3081 2855 3130 3077 Таблица 39. Количество единичных углублений для принтера № 4 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 431 463 568 567 519 568 509 565 546 533 552 492 516 553 441 518 501 491 518 513 Снизу 430 460 548 531 554 603 584 541 527 519 544 556 516 534 425 498 500 551 544 508 Слева 631 651 732 867 709 752 704 851 721 759 765 654 733 744 629 675 655 681 728 748 Справа 679 665 823 823 777 812 786 824 751 768 774 702 723 764 615 729 752 698 776 785 ВСЕГО 2171 2239 2671 2788 2559 2735 2583 2781 2545 2579 2635 2404 2488 2595 2110 2420 2408 2421 2566 2554 Таблица 40. Количество единичных углублений для принтера № 4 после вложения с n = 20, k = 0,01 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8673 9034 9987 10209 10060 10409 10223 10483 9823 9882 10132 9571 9549 10084 8087 9712 9903 9015 9648 9713 Сверху 941 1004 1151 1188 1166 1164 1118 1163 1129 1122 1164 1077 1115 1101 954 1053 1093 1039 1112 1094 80 Снизу 494 517 600 595 625 651 644 605 583 571 605 607 559 575 469 549 559 596 589 558 Слева 1191 1333 1444 1641 1398 1529 1413 1623 1404 1441 1481 1342 1394 1466 1201 1330 1348 1266 1423 1401 Справа 759 777 946 948 901 922 906 959 889 870 886 795 834 886 712 852 867 809 896 890 ВСЕГО 3385 3631 4141 4372 4090 4266 4081 4350 4005 4004 4136 3821 3902 4028 3336 3784 3867 3710 4020 3943 Таблица 41. Количество единичных углублений для принтера № 4 после вложения с n = 100, k = 0,01 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 604 595 605 626 606 623 631 631 600 616 615 595 618 613 576 597 613 578 609 606 Сверху 439 496 588 589 555 602 544 591 573 587 595 527 550 578 484 562 535 503 555 550 Снизу 431 461 554 531 555 604 590 548 531 521 550 558 516 537 427 498 506 552 546 512 Слева 636 685 783 896 751 794 743 887 759 785 805 691 764 781 659 706 695 683 776 784 Справа 679 669 830 825 781 813 789 825 757 772 776 708 729 770 617 730 753 698 779 792 ВСЕГО 2185 2311 2755 2841 2642 2813 2666 2851 2620 2665 2726 2484 2559 2666 2187 2496 2489 2436 2656 2638 Таблица 42. Количество единичных углублений для принтера № 4 после вложения с n = 100, k = 0,1 Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 364 440 482 501 469 503 483 476 459 437 482 451 421 485 334 457 461 399 460 460 Сверху 450 491 585 594 545 595 533 585 567 574 579 516 545 569 473 548 526 522 543 549 81 Снизу 430 460 550 531 555 604 585 544 528 521 548 558 514 537 426 500 503 553 546 509 Слева 657 677 774 906 745 780 730 888 740 781 791 689 766 776 653 704 682 696 771 771 Справа 681 667 829 824 781 816 790 825 756 769 774 707 726 769 618 731 754 707 781 789 ВСЕГО 2218 2295 2738 2855 2626 2795 2638 2842 2591 2645 2692 2470 2551 2651 2170 2483 2465 2478 2641 2618 Из таблиц 27 – 42 видно, что при вложении секретного сообщения со скоростью 8000 – 12000 бит/ на страницу текста формата А4 прирост количества единичных углублений составляет 1200 – 1400 углублений. При вложении секретного сообщения со скоростями 550 – 600 и 400 – 500 бит/ на страницу текста формата А4 для принтеров 1, 3 и 4 прирост не превышает 60. Для второго принтера при вложении секретного сообщения со скоростями 550 – 600 и 400 – 500 бит/ на страницу текста формата А4 прирост не превышает 250. 82 Тест № 2: Целью второго теста является получение статистики прироста единичных углублений при вложении секретной информации в изображение текстового документа формата А4 со следующими параметрами: [n = 25, k = 0,1] ; [n = 27, k = 0,1] ; [n = 30, k = 0,1] ; [n = 50, k = 0,01] . При таком выборе параметров n и k в изображение текстового документа формата А4 в первом случае производится вложение 4500 - 6000 бит секретной информации, при выборе второй пары производится вложение 4000 - 4500 бит секретной информации, при выборе третьей пары вкладывается 3500 - 4000 бит секретной информации, четвёртой 2000 – 2200 бит. Для теста были использованы пять изображений текстовых документов распечатанных на принтере № 1; в эти пять изображений производилось вложение секретной информации с параметрами n и k, выбранными ранее; для каждого изображения было высчитано количество единичных углублений до и после вложений. В таблицах 43, 44, 45, 46 и 47 приведены результаты подсчёта единичных углублений для первого принтера до и после вложения с четырьмя парами параметров n и k соответственно. 83 Таблица 43. Количество единичных углублений для принтера № 1 до вложения Изображение 1 2 3 4 5 Сверху 483 599 631 628 667 Снизу 582 611 697 777 758 Слева 630 747 875 899 780 Справа 672 864 841 953 895 ВСЕГО 2367 2821 3044 3257 3100 Таблица 44. Количество единичных углублений для принтера № 1 после вложения с [n = 25, k = 0,1] Изображение 1 2 3 4 5 Вложено, бит 4453 4717 5018 5223 5122 Сверху 802 862 924 918 967 Снизу 589 616 717 792 772 Слева 931 1109 1233 1298 1180 Справа 723 922 900 1004 945 ВСЕГО 3045 3509 3774 4012 3864 Таблица 45. Количество единичных углублений для принтера № 1 после вложения с [n = 27, k = 0,1] Изображение 1 2 3 4 5 Вложено, бит 3927 3966 4380 4516 4432 Сверху 733 823 859 855 928 Снизу 593 623 707 790 768 Слева 891 1040 1199 1197 1100 Справа 714 908 907 1013 947 ВСЕГО 2931 3394 3672 3855 3743 Таблица 46. Количество единичных углублений для принтера № 1 после вложения с [n = 30, k = 0,1] Изображение 1 2 3 4 5 Вложено, бит 3254 3661 3727 3826 3817 Сверху 711 828 853 844 881 Снизу 592 615 702 779 767 Слева 855 1013 1163 1170 1052 Справа 703 902 879 991 939 ВСЕГО 2861 3358 3597 3784 3639 Таблица 47. Количество единичных углублений для принтера № 1 после вложения с [n = 50, k = 0,01] Изображение 1 2 3 4 5 Вложено, бит 1983 2080 2216 2262 2214 Сверху 605 706 754 707 799 84 Снизу 587 616 703 784 763 Слева 715 877 996 1037 898 Справа 689 886 854 976 912 ВСЕГО 2596 3085 3307 3504 3372 Из таблиц 43 – 47 видно, что при вложении секретного сообщения со скоростью 4500 – 6000 бит/ на страницу текста формата А4 прирост количества единичных углублений составляет около 700 углублений. При вложении секретного сообщения со скоростью 4000 – 4500 бит/ на страницу текста формата А4 прирост количества единичных углублений составляет около 600 углублений. При вложении секретного сообщения со скоростью 3500 – 4000 бит/ на страницу текста формата А4 прирост количества единичных углублений составляет около 500 углублений. При вложении секретного сообщения со скоростью 2000 – 2200 бит/ на страницу текста формата А4 прирост количества единичных углублений составляет около 200 - 250 углублений. 85 Тест № 3: Целью третьего теста является оценка эффективности обнаружения вложения секретной информации с различными скоростями вложения методом анализа количества единичных углублений. Текстовый документ, объёмом в 80 страниц был распечатан на пятом принтере; распечатанные документы формата А4 отсканированы на одном сканере; первые двадцать изображений были использованы для сбора статистики и последующего выбора порогов; вложение проводилось со следующими парами параметров; o [n = 25, k = 0,1] ; o [n = 100, k = 0,01] ; o [n = 100, k = 0,1]. каждая пара параметров была использована для вложения в пять, выбранных произвольным образом, изображений; произведён поиск изображений с вложениями. В таблице 48 представлен результат подсчёта количества чёрных пикселей и единичных углублений в 20 тестовых изображениях. 86 Таблица 48. Статистика 20 тестовых изображений Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху Снизу Слева Справа ВСЕГО Количество чёрных пикселей 429 400 588 644 2061 630132 486 447 758 724 2415 755554 633 580 905 947 3065 876796 582 575 848 897 2902 874908 583 566 829 862 2840 856913 578 569 822 903 2872 863559 558 590 880 856 2884 868162 621 603 958 920 3102 904780 512 555 772 846 2685 810166 589 649 854 895 2987 865220 631 625 879 851 2986 849712 534 557 736 788 2615 811326 515 503 796 793 2607 805208 561 546 807 827 2741 836235 527 512 726 774 2539 761816 522 546 747 729 2544 801786 585 523 765 832 2705 817163 533 520 773 832 2658 804599 543 554 780 869 2746 812757 564 543 820 798 2725 823540 В таблице 49 представлены пороги, выбранные на основе статистики собранной по 20 тестовым изображениям. Таблица 49. Выбранные пороги Количество чёрных пикселей 600000 – 650000 650000 – 700000 700000 – 750000 750000 – 800000 800000 – 850000 850000 – 900000 900000 – 950000 Пороги для количества углублений 2200 2300 2400 2600 3000 3100 3200 87 В таблице 50 содержатся номера изображений, в которые производилось вложение и количество вложенной информации. Таблица 50. Изображения с вложениями № изображения Вложено, бит Вложение с параметрами [n = 25, k = 0,1] 45 1090 51 902 57 970 73 1014 79 988 Вложение с параметрами [n = 27, k = 0,1] 23 816 27 820 42 958 48 921 50 954 Вложение с параметрами [n = 30, k = 0,1] 41 872 56 897 62 758 67 917 80 991 В таблице 51 приведены результаты обнаружения стегоизображений по выбранным порогам. Таблица 51. Результаты обнаружения Изобр. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Сверху Снизу Слева Справа ВСЕГО Колич. черн. пикс. 586 586 845 888 2905 850509 581 546 812 760 2699 841826 816 524 972 870 3182 797697 563 493 704 742 2502 857146 490 526 730 714 2460 870794 471 490 641 717 2319 848059 820 555 935 736 3046 803207 556 565 763 820 2704 843928 503 531 663 700 2397 806678 548 508 718 736 2510 829630 454 396 586 662 2098 731521 446 492 592 702 2232 803243 462 468 634 627 2191 783133 484 548 672 759 2463 864319 88 Рез. анализа ОК ОК ВЛОЖЕНИЕ ОК ОК ОК ВЛОЖЕНИЕ ОК ОК ОК ОК ОК ОК ОК 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 448 464 437 436 598 472 872 958 595 541 1090 602 584 921 564 954 902 543 592 618 602 897 970 529 503 568 590 758 605 598 582 564 917 565 559 550 637 554 1014 604 577 505 604 626 988 991 508 492 419 485 615 462 612 597 563 546 628 576 590 636 564 593 611 597 611 630 678 585 589 575 502 546 546 542 618 564 626 607 597 605 595 592 681 579 569 567 580 464 590 636 631 636 602 659 560 604 830 815 1027 1178 809 843 1320 767 834 1139 816 1194 1198 738 831 915 864 951 1127 748 716 770 777 909 819 850 881 864 1108 827 777 801 843 751 1217 815 805 748 908 851 1313 1093 695 673 636 677 872 741 815 885 808 901 978 828 915 894 886 907 821 843 915 945 920 823 906 869 729 885 798 831 855 918 873 860 920 851 835 877 945 788 974 857 829 809 937 999 987 940 2253 2288 2052 2202 2915 2490 3326 3618 2775 2831 4016 2773 2923 3590 2830 3648 3532 2721 2949 3108 3064 3256 3592 2721 2450 2769 2711 3040 2897 2930 2962 2895 3542 2848 2766 2820 3106 2672 3774 2843 2791 2526 3039 3112 3919 3660 89 813422 789239 744120 761440 874263 752405 875871 850369 849087 843551 947416 851785 885231 884670 841536 849600 811790 828440 883668 910328 924754 812272 830607 833376 728304 822035 837684 753756 863169 911449 871635 903199 873734 832504 843952 824490 915807 789339 861138 858867 837569 742726 902449 897774 897435 906858 ОК ОК ОК ОК ОК ОК ВЛОЖЕНИЕ ВЛОЖЕНИЕ ОК ОК ВЛОЖЕНИЕ ОК ОК ВЛОЖЕНИЕ ОК ВЛОЖЕНИЕ ВЛОЖЕНИЕ ОК ОК ОК ОК ВЛОЖЕНИЕ ВЛОЖЕНИЕ ОК ЛОЖНАЯ ТР. ОК ОК ВЛОЖЕНИЕ ОК ОК ОК ОК ВЛОЖЕНИЕ ОК ОК ОК ОК ЛОЖНАЯ ТР. ВЛОЖЕНИЕ ОК ОК ЛОЖНАЯ ТР. ОК ЛОЖНАЯ ТР. ВЛОЖЕНИЕ ВЛОЖЕНИЕ Результаты обнаружения СИ из таблицы 51 при выборе порогов согласно таблице 49: Обнаружены 5 из 5 СИ со скоростью вложения 4500 – 6000 бит/ на страницу текста формата А4; обнаружены 5 из 5 СИ со скоростью вложения 4000 – 4500 бит/ на страницу текста формата А4; обнаружены 5 из 5 СИ со скоростью вложения 3500 – 4000 бит/ на страницу текста формата А4; 4 ложные тревоги. Данный метод позволил со 100% вероятностью обнаружить СИ со скоростью вложения до 3500 бит/ на страницу текста формата А4 (при известных принтере и сканере). 90 Глава 4. Результаты обнаружения стегосистем, предложенными методами Как показали тесты, проводимые в главе 3, атака вычислением корреляции одинаковых букв текста и атака выполнением двумерного преобразования Фурье от сканированных изображений не позволяют выбрать порог с высокой степенью обнаружения вложения даже при вложении более 10000 бит на страницу. 4.1. Атака анализом количества единичных выбросов Для проверки работоспособности этого метода текстовые документы, распечатанные на пятом принтере, были отсканированы сканером № 2. В качестве порогов были выбраны пороги из таблицы 24 (пороги, выбранные для сканера № 1). В таблице 52 приведены номера изображений с вложениями и количество вложенных бит. Таблица 52. Изображения с вложениями № изображения Вложено, бит Вложение с параметрами [n = 20, k = 0,01] 21 9987 35 9488 44 10025 Вложение с параметрами [n = 25, k = 0,1] 22 5377 57 5165 79 5627 Вложение с параметрами [n = 27, k = 0,1] 33 4407 61 4530 80 5029 Вложение с параметрами [n = 30, k = 0,1] 29 3706 39 4140 66 4069 Результаты обнаружения приведены в таблице 53. 91 Таблица 53. Результаты обнаружения Изобр. u Вниз Влево Вправо ВСЕГО Колич. черн. Пикс. Рез. анализа 21 748 795 1068 1167 3778 883435 ВЛОЖЕНИЕ 22 645 790 956 942 3333 873347 ВЛОЖЕНИЕ 23 601 722 781 770 2874 832170 ЛОЖНАЯ ТРЕВОГА 24 570 734 781 708 2793 889713 ОК 25 689 742 817 814 3062 902462 ОК 26 545 707 837 780 2869 879691 ОК 27 588 641 818 707 2754 834356 ЛОЖНАЯ ТРЕВОГА 28 551 753 836 768 2908 876017 ОК 29 587 733 839 801 2960 837536 ВЛОЖЕНИЕ 30 564 752 778 738 2832 859857 ОК 31 452 606 746 686 2490 762036 ОК 32 630 725 838 712 2905 831148 ЛОЖНАЯ ТРЕВОГА 33 652 697 844 810 3003 811432 ВЛОЖЕНИЕ 34 643 709 842 810 3004 894496 ЛОЖНАЯ ТРЕВОГА 35 660 768 971 1038 3437 844958 ВЛОЖЕНИЕ 36 603 674 772 690 2739 819415 ОК 37 449 655 854 707 2665 773082 ЛОЖНАЯ ТРЕВОГА 38 508 609 759 727 2603 789048 ЛОЖНАЯ ТРЕВОГА 39 678 778 1016 996 3468 905607 ВЛОЖЕНИЕ 40 505 688 821 767 2781 783721 ЛОЖНАЯ ТРЕВОГА 41 648 887 932 945 3412 913483 ЛОЖНАЯ ТРЕВОГА 42 650 812 961 854 3277 884532 ЛОЖНАЯ ТРЕВОГА 43 682 878 877 846 3283 880442 ЛОЖНАЯ ТРЕВОГА 44 721 851 1068 1124 3764 872999 ВЛОЖЕНИЕ 45 684 941 1024 1004 3653 987756 ЛОЖНАЯ ТРЕВОГА 46 648 811 927 919 3305 887484 ЛОЖНАЯ ТРЕВОГА 47 607 926 923 895 3351 919089 ЛОЖНАЯ ТРЕВОГА 48 643 784 951 906 3284 919912 ЛОЖНАЯ ТРЕВОГА 49 649 818 918 813 3198 873210 ЛОЖНАЯ ТРЕВОГА 50 656 839 949 833 3277 885511 ЛОЖНАЯ ТРЕВОГА 51 617 837 887 796 3137 846541 ЛОЖНАЯ ТРЕВОГА 52 636 816 902 822 3176 860922 ЛОЖНАЯ ТРЕВОГА 53 634 867 986 908 3395 917798 ЛОЖНАЯ ТРЕВОГА 54 671 923 938 953 3485 945069 ЛОЖНАЯ ТРЕВОГА 55 689 902 1054 887 3532 946068 ЛОЖНАЯ ТРЕВОГА 56 685 836 1106 1021 3648 965877 ЛОЖНАЯ ТРЕВОГА 57 686 781 1035 978 3480 847437 ВЛОЖЕНИЕ 58 628 848 944 878 3298 863666 ЛОЖНАЯ ТРЕВОГА 59 619 795 929 893 3236 865307 ЛОЖНАЯ ТРЕВОГА 60 491 683 797 738 2709 758224 ЛОЖНАЯ ТРЕВОГА 61 716 796 1030 1026 3568 854990 ВЛОЖЕНИЕ 62 620 774 938 906 3238 874424 ЛОЖНАЯ ТРЕВОГА 63 559 716 794 803 2872 784341 ЛОЖНАЯ ТРЕВОГА 92 64 637 834 967 924 3362 898501 ЛОЖНАЯ ТРЕВОГА 65 731 865 979 915 3490 945038 ЛОЖНАЯ ТРЕВОГА 66 711 838 1053 1071 3673 908217 ВЛОЖЕНИЕ 67 666 830 1097 975 3568 939965 ЛОЖНАЯ ТРЕВОГА 68 707 914 946 968 3535 910133 ЛОЖНАЯ ТРЕВОГА 69 550 833 945 844 3172 865622 ЛОЖНАЯ ТРЕВОГА 70 612 770 952 957 3291 876726 ЛОЖНАЯ ТРЕВОГА 71 672 812 965 968 3417 859613 ЛОЖНАЯ ТРЕВОГА 72 718 911 1159 980 3768 955506 ЛОЖНАЯ ТРЕВОГА 73 578 762 860 859 3059 821510 ЛОЖНАЯ ТРЕВОГА 74 587 820 1009 897 3313 896127 ЛОЖНАЯ ТРЕВОГА 75 691 848 1026 924 3489 891283 ЛОЖНАЯ ТРЕВОГА 76 634 866 1049 947 3496 873383 ЛОЖНАЯ ТРЕВОГА 77 591 733 943 866 3133 774731 ЛОЖНАЯ ТРЕВОГА 78 635 840 1077 938 3490 938105 ЛОЖНАЯ ТРЕВОГА 79 795 909 1099 1134 3937 929901 ВЛОЖЕНИЕ 80 817 844 1140 1173 3974 930703 ВЛОЖЕНИЕ По результатам таблицы 53 можно сделать вывод о том, что пороги выбранные на основе статистики собранной на сканере № 1, оказались пригодными для анализа изображений, полученных со сканера № 2. В результате данного теста были обнаружены все 12 СИ с скоростями вложения от 4000 до 10000 бит на страницу текста А4. Необходимо отметить большое число ложных тревог. Как отмечалось в главе 3, для уточнения порога необходим доступ к сканеру. Уточним пороги, собрав статистику для сканера № 2. Статистика, собранная по 20 тестовым изображениям приведена в таблице 54. 93 Таблица 54. Статистика 20 тестовых изображений (выбросы) Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 u 481 565 731 708 673 686 659 699 581 636 626 601 609 623 546 583 538 555 556 565 Вниз 655 662 864 911 862 860 918 851 827 910 801 759 784 784 737 765 809 843 722 829 Влево 589 726 825 802 938 871 834 853 811 869 851 826 841 813 774 794 825 847 835 844 Вправо 619 641 824 816 759 825 824 791 779 841 822 753 742 709 717 794 774 744 780 803 ВСЕГО 2344 2594 3244 3237 3232 3242 3235 3194 2998 3256 3100 2939 2976 2929 2774 2936 2946 2989 2893 3041 Колич. чёрн. пикс. 652222 782652 909697 908065 890648 898544 900217 938429 838872 902138 885619 844421 834398 867660 792740 834695 849086 835210 844354 858496 На основе статистики, собранной в таблице 54 уточним пороги. Уточнённые пороги представлены в таблице 55. Таблица 55. Уточненные пороги (выбросы) Количество чёрных пикселей 650000 – 700000 700000 – 750000 750000 – 800000 800000 – 850000 850000 – 900000 900000 – 950000 Порог для количества выбросов 2600 2800 3000 3200 3400 3600 Результаты обнаружения по уточненным порогам представлены в таблице 56. 94 Таблица 56. Результаты обнаружения (выбросы) уточненные пороги Изобр. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 u Вниз Влево Вправо ВСЕГО Колич. чёрн. пикс. 748 795 1068 1167 3778 883435 645 790 956 942 3333 873347 601 722 781 770 2874 832170 570 734 781 708 2793 889713 689 742 817 814 3062 902462 545 707 837 780 2869 879691 588 641 818 707 2754 834356 551 753 836 768 2908 876017 587 733 839 801 2960 837536 564 752 778 738 2832 859857 452 606 746 686 2490 762036 630 725 838 712 2905 831148 652 697 844 810 3003 811432 643 709 842 810 3004 894496 660 768 971 1038 3437 844958 603 674 772 690 2739 819415 449 655 854 707 2665 773082 508 609 759 727 2603 789048 678 778 1016 996 3468 905607 505 688 821 767 2781 783721 648 887 932 945 3412 913483 650 812 961 854 3277 884532 682 878 877 846 3283 880442 721 851 1068 1124 3764 872999 684 941 1024 1004 3653 987756 648 811 927 919 3305 887484 607 926 923 895 3351 919089 643 784 951 906 3284 919912 649 818 918 813 3198 873210 656 839 949 833 3277 885511 617 837 887 796 3137 846541 636 816 902 822 3176 860922 634 867 986 908 3395 917798 671 923 938 953 3485 945069 689 902 1054 887 3532 946068 685 836 1106 1021 3648 965877 686 781 1035 978 3480 847437 628 848 944 878 3298 863666 619 795 929 893 3236 865307 491 683 797 738 2709 758224 716 796 1030 1026 3568 854990 620 774 938 906 3238 874424 95 Результат анализа ВЛОЖЕНИЕ ПРОПУСК ОК ОК ОК ОК ОК ОК ПРОПУСК ОК ОК ОК ПРОПУСК ОК ВЛОЖЕНИЕ ОК ОК ОК ПРОПУСК ОК ОК ОК ОК ВЛОЖЕНИЕ ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ВЛОЖЕНИЕ ОК ОК ОК ВЛОЖЕНИЕ ОК 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 559 637 731 711 666 707 550 612 672 718 578 587 691 634 591 635 795 817 Сбор 716 834 865 838 830 914 833 770 812 911 762 820 848 866 733 840 909 844 794 967 979 1053 1097 946 945 952 965 1159 860 1009 1026 1049 943 1077 1099 1140 статистики 803 924 915 1071 975 968 844 957 968 980 859 897 924 947 866 938 1134 1173 позволил 2872 3362 3490 3673 3568 3535 3172 3291 3417 3768 3059 3313 3489 3496 3133 3490 3937 3974 784341 898501 945038 908217 939965 910133 865622 876726 859613 955506 821510 896127 891283 873383 774731 938105 929901 930703 уточнить пороги, ОК ОК ОК ВЛОЖЕНИЕ ОК ОК ОК ОК ЛОЖНАЯ ТРЕВОГА ОК ОК ОК ЛОЖНАЯ ТРЕВОГА ЛОЖНАЯ ТРЕВОГА ЛОЖНАЯ ТРЕВОГА ОК ВЛОЖЕНИЕ ВЛОЖЕНИЕ что привело к значительному уменьшению количества ложных тревог, но в тоже время это привело к появлению пропусков. Как было отмечено в главе 3 для эффективной работы данного метода необходимо, чтобы прирост количества единичных выбросов был не менее 500, такое значение достигается при скорости вложения равной 8000 – 12000 бит/ на страницу текста формата А4 (см. тесты в главе 3), а это означает что при меньшей скорости вложения появление пропусков было ожидаемым. 96 4.2. Атака анализом количества единичных углублений Для проверки работоспособности этого метода текстовые документы, распечатанные на пятом принтере, были отсканированы сканером № 2. В качестве порогов были выбраны пороги из таблицы 49 (пороги, выбранные для сканера № 1). В таблице 52 приведены номера изображений с вложениями и количество вложенных бит. Результаты обнаружения приведены в таблице 57. Таблица 57. Результаты обнаружения (углубления) Изобр. Сверху Снизу Слева Справа ВСЕГО Колич. черн. пикс. 21 1331 696 1598 1088 4713 883435 22 1044 602 1214 880 3740 873347 23 602 585 802 801 2790 832170 24 611 658 728 777 2774 889713 25 665 584 756 793 2798 902462 26 610 583 693 771 2657 879691 27 567 559 744 680 2550 834356 28 647 627 765 756 2795 876017 29 829 610 968 768 3175 837536 30 622 612 669 759 2662 859857 31 508 527 654 693 2382 762036 32 654 575 723 711 2663 831148 33 934 572 982 790 3278 811432 34 701 624 819 852 2996 894496 35 1219 669 1349 860 4097 844958 36 601 604 714 734 2653 819415 37 567 533 699 691 2490 773082 38 546 524 676 714 2460 789048 39 1044 679 1166 1002 3891 905607 40 605 566 825 765 2761 783721 41 700 686 862 884 3132 913483 42 689 710 910 887 3196 884532 43 651 733 842 910 3136 880442 44 1294 745 1561 1027 4627 872999 45 724 736 1014 975 3449 987756 46 661 690 911 963 3225 887484 47 685 763 937 939 3324 919089 48 649 661 923 956 3189 919912 49 672 717 866 863 3118 873210 97 Рез. анализа ВЛОЖЕНИЕ ВЛОЖЕНИЕ ОК ОК ОК ОК ОК ОК ВЛОЖЕНИЕ ОК ОК ОК ВЛОЖЕНИЕ ОК ВЛОЖЕНИЕ ОК ОК ОК ВЛОЖЕНИЕ ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ВЛОЖЕНИЕ ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ОК ЛОЖНАЯ ТР. 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 668 682 658 665 759 675 686 1005 628 608 531 1018 658 557 672 769 997 682 702 623 659 722 788 637 664 649 599 590 697 1149 1061 686 702 696 709 769 741 678 643 693 656 573 682 612 560 712 744 746 714 732 701 626 679 715 606 655 655 718 628 645 750 721 878 807 845 915 927 1049 1035 1102 863 861 754 1189 843 812 934 970 1159 987 937 937 864 823 949 846 922 895 874 789 914 1317 1273 859 860 882 906 976 950 995 851 882 888 773 904 835 824 943 1009 987 974 923 915 895 887 960 879 871 867 836 853 973 1067 1065 3091 3051 3081 3195 3431 3415 3394 3601 3066 3013 2631 3793 2948 2753 3261 3492 3889 3357 3294 3176 3044 3111 3412 2968 3112 3066 3027 2860 3229 4283 4120 885511 846541 860922 917798 945069 946068 965877 847437 863666 865307 758224 854990 874424 784341 898501 945038 908217 939965 910133 865622 876726 859613 955506 821510 896127 891283 873383 774731 938105 929901 930703 ОК ЛОЖНАЯ ТР. ОК ОК ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ОК ВЛОЖЕНИЕ ОК ОК ЛОЖНАЯ ТР. ВЛОЖЕНИЕ ОК ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ВЛОЖЕНИЕ ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ОК ЛОЖНАЯ ТР. ОК ОК ЛОЖНАЯ ТР. ОК ОК ЛОЖНАЯ ТР. ЛОЖНАЯ ТР. ВЛОЖЕНИЕ ВЛОЖЕНИЕ По результатам таблицы 57 можно сделать вывод о том, что пороги выбранные на основе статистики собранной на сканере № 1, оказались пригодными для анализа изображений, полученных со сканера № 2. В результате данного теста были обнаружены все 12 СИ с скоростями вложения от 4000 до 10000 бит на страницу текста А4. Необходимо отметить большое число ложных тревог. Как отмечалось в главе 3, для уточнения порога необходим доступ к сканеру. Уточним пороги, собрав статистику для сканера № 2. 98 Статистика, собранная по 20 тестовым изображениям приведена в таблице 58. Таблица 58. Статистика 20 тестовых изображений (углубления) Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 515 542 710 665 675 721 716 744 607 694 690 614 677 622 609 632 615 607 621 588 Снизу 519 560 718 699 717 752 774 712 651 693 691 670 650 702 600 651 661 737 583 640 Слева Справа ВСЕГО 625 715 2374 721 751 2574 917 939 3284 883 931 3178 896 922 3210 910 971 3354 944 927 3361 922 925 3303 861 864 2983 965 973 3325 928 982 3291 877 869 3030 877 849 3053 845 803 2972 817 837 2863 809 835 2927 862 857 2995 859 863 3066 880 864 2948 857 849 2934 Колич. чёрн. пикс. 652222 782652 909697 908065 890648 898544 900217 938429 838872 902138 885619 844421 834398 867660 792740 834695 849086 835210 844354 858496 На основе статистики, собранной в таблице 58 уточним пороги. Уточнённые пороги представлены в таблице 59. Таблица 59. Уточненные пороги (углубления) Количество чёрных пикселей 650000 – 700000 700000 – 750000 750000 – 800000 800000 – 850000 850000 – 900000 900000 – 950000 Порог для количества углублений 2600 2800 3000 3200 3500 3700 Результаты обнаружения приведены в таблице 60. 99 Таблица 60. Результаты обнаружения (углубления) уточненные пороги Изобр. 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 Сверху Снизу Слева Справа ВСЕГО Колич. чёрн. пикс. Результат анализа 1331 696 1598 1088 4713 883435 ВЛОЖЕНИЕ 1044 602 1214 880 3740 873347 ВЛОЖЕНИЕ 602 585 802 801 2790 832170 ОК 611 658 728 777 2774 889713 ОК 665 584 756 793 2798 902462 ОК 610 583 693 771 2657 879691 ОК 567 559 744 680 2550 834356 ОК 647 627 765 756 2795 876017 ОК 829 610 968 768 3175 837536 ПРОПУСК 622 612 669 759 2662 859857 ОК 508 527 654 693 2382 762036 ОК 654 575 723 711 2663 831148 ОК 934 572 982 790 3278 811432 ВЛОЖЕНИЕ 701 624 819 852 2996 894496 ОК 1219 669 1349 860 4097 844958 ВЛОЖЕНИЕ 601 604 714 734 2653 819415 ОК 567 533 699 691 2490 773082 ОК 546 524 676 714 2460 789048 ОК 1044 679 1166 1002 3891 905607 ВЛОЖЕНИЕ 605 566 825 765 2761 783721 ОК 700 686 862 884 3132 913483 ОК 689 710 910 887 3196 884532 ОК 651 733 842 910 3136 880442 ОК 1294 745 1561 1027 4627 872999 ВЛОЖЕНИЕ 724 736 1014 975 3449 987756 ОК 661 690 911 963 3225 887484 ОК 685 763 937 939 3324 919089 ОК 649 661 923 956 3189 919912 ОК 672 717 866 863 3118 873210 ОК 668 686 878 859 3091 885511 ОК 682 702 807 860 3051 846541 ОК 658 696 845 882 3081 860922 ОК 665 709 915 906 3195 917798 ОК 759 769 927 976 3431 945069 ОК 675 741 1049 950 3415 946068 ОК 686 678 1035 995 3394 965877 ОК 1005 643 1102 851 3601 847437 ВЛОЖЕНИЕ 628 693 863 882 3066 863666 ОК 608 656 861 888 3013 865307 ОК 531 573 754 773 2631 758224 ОК 1018 682 1189 904 3793 854990 ВЛОЖЕНИЕ 658 612 843 835 2948 874424 ОК 557 560 812 824 2753 784341 ОК 672 712 934 943 3261 898501 ОК 100 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 769 997 682 702 623 659 722 788 637 664 649 599 590 697 1149 1061 744 746 714 732 701 626 679 715 606 655 655 718 628 645 750 721 970 1159 987 937 937 864 823 949 846 922 895 874 789 914 1317 1273 1009 987 974 923 915 895 887 960 879 871 867 836 853 973 1067 1065 3492 3889 3357 3294 3176 3044 3111 3412 2968 3112 3066 3027 2860 3229 4283 4120 945038 908217 939965 910133 865622 876726 859613 955506 821510 896127 891283 873383 774731 938105 929901 930703 ОК ВЛОЖЕНИЕ ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ОК ВЛОЖЕНИЕ ВЛОЖЕНИЕ Уточнение порогов привело к тому, что ложные тревоги вообще исчезли, но появился один пропуск. Пропущено одно СИ со скоростью вложения равной 3500 бит/ на страницу. При такой скорости вложения прирост единичных углублений составляет около 500 углублений на страницу текста формата А4, что как уже было отмечено является на данный момент нижней границей эффективной работы метода. Для изображений, полученных со сканера № 2, были собраны статистики приростов количества единичных выбросов и единичных углублений в зависимости от скорости вложения. В таблицах 61 и 62 приведены результаты подсчёта количества единичных выбросов до и после вложения для текстовых документов, распечатанных на принтере № 1 и отсканированных сканером № 2. В таблицах 63 и 64 приведены результаты подсчёта количества единичных выбросов до и после вложения для текстовых документов, распечатанных на принтере № 2 и отсканированных сканером № 2. 101 В таблицах 65 и 66 приведены результаты подсчёта количества единичных выбросов до и после вложения для текстовых документов, распечатанных на принтере № 3 и отсканированных сканером № 2. В таблицах 67 и 68 приведены результаты подсчёта количества единичных выбросов до и после вложения для текстовых документов, распечатанных на принтере № 4 и отсканированных сканером № 2. Из таблиц 61 – 68 видно, что прирост единичных выбросов, при вложении в ПС, полученные со сканера № 2, секретной информации со скоростью 8000 – 12000 бит/ на страницу текста формата А4 составляет 500 – 600 единичных выбросов. В таблицах 69 и 70 приведены результаты подсчёта количества единичных углублений до и после вложения для текстовых документов, распечатанных на принтере № 1 и отсканированных сканером № 2. В таблицах 71 и 72 приведены результаты подсчёта количества единичных углублений до и после вложения для текстовых документов, распечатанных на принтере № 2 и отсканированных сканером № 2. В таблицах 73 и 74 приведены результаты подсчёта количества единичных углублений до и после вложения для текстовых документов, распечатанных на принтере № 3 и отсканированных сканером № 2. В таблицах 75 и 76 приведены результаты подсчёта количества единичных углублений до и после вложения для текстовых документов, распечатанных на принтере № 4 и отсканированных сканером № 2. Из таблиц 69 – 76 видно, что прирост единичных углублений, при вложении в ПС, полученные со сканера № 2, секретной информации со скоростью 8000 – 12000 бит/ на страницу текста формата А4 составляет 1200 - 1400 единичных углублений. 102 Таким образом при одинаковой скорости вложения метод анализа количества единичных углублений окажется эффективнее метода анализа количества единичных выбросов, так как прирост единичных углублений более чем в два раза превышает прирост количества единичных выбросов для одинаковой скорости вложения. Таблица 61. Количество единичных выбросов для принтера № 1 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 600 736 781 849 784 847 811 895 765 797 815 733 832 837 660 721 782 679 685 743 Вниз 628 738 877 961 939 912 947 948 920 874 987 956 936 982 781 893 914 819 853 858 Влево 669 681 743 872 830 776 803 821 775 756 915 716 795 857 612 766 776 677 709 718 103 Вправо 543 660 668 762 661 706 768 718 782 683 832 761 719 757 557 696 677 656 626 614 ВСЕГО 2440 2815 3069 3444 3214 3241 3329 3382 3242 3110 3549 3166 3282 3433 2610 3076 3149 2831 2873 2933 Таблица 62. Количество единичных выбросов для принтера № 1 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8777 9035 10076 10335 10085 10381 10209 10410 9803 9933 10048 9478 9419 10179 8108 9651 9812 9051 9693 9778 Вверх 741 817 913 955 949 956 895 973 833 934 903 841 909 927 721 841 910 777 798 859 Вниз 705 784 932 1035 1015 968 999 997 975 929 1050 1006 1004 1041 827 949 962 869 912 904 Влево 788 808 906 1008 996 905 969 1002 904 899 1066 882 950 1019 726 936 927 838 853 867 Вправо 759 912 908 1000 899 970 1034 974 1022 916 1073 994 934 998 787 917 904 880 869 853 ВСЕГО 2993 3321 3659 3998 3859 3799 3897 3946 3734 3678 4092 3723 3797 3985 3061 3643 3703 3364 3432 3483 Таблица 63. Количество единичных выбросов для принтера № 2 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 587 592 677 618 678 736 708 700 584 554 653 621 609 629 594 599 573 573 595 587 Вниз 780 726 892 784 811 848 807 873 773 767 834 757 833 818 683 761 789 714 717 777 Влево 616 637 681 661 612 656 653 686 539 668 635 603 593 637 563 567 620 547 574 641 104 Вправо 606 638 669 746 590 658 621 682 599 633 699 546 616 590 504 576 654 556 606 586 ВСЕГО 2589 2593 2919 2809 2691 2898 2789 2941 2495 2622 2821 2527 2651 2674 2344 2503 2636 2390 2492 2591 Таблица 64. Количество единичных выбросов для принтера № 2 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8692 9332 9920 10288 9969 10353 10298 10452 9700 10013 10134 9602 9472 10105 8026 9682 9871 9206 9826 9856 Вверх 666 702 776 761 777 830 856 834 690 675 785 751 703 786 678 763 704 712 721 716 Вниз 824 783 947 863 867 921 876 950 816 824 898 804 886 856 733 803 853 784 788 835 Влево 742 788 837 816 779 795 825 846 690 847 808 760 752 810 685 729 766 676 722 796 Вправо 862 899 936 1014 871 942 913 989 837 914 950 779 863 864 720 838 948 813 848 835 ВСЕГО 3094 3172 3496 3454 3294 3488 3470 3619 3033 3260 3441 3094 3204 3316 2816 3133 3271 2985 3079 3182 Таблица 65. Количество единичных выбросов для принтера № 3 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 481 524 500 633 555 551 560 605 545 574 535 482 497 550 448 452 471 487 469 529 Вниз 1498 1510 1611 1669 1769 1734 1646 1714 1535 1611 1689 1484 1481 1589 1331 1420 1460 1499 1478 1599 105 Влево 955 1015 1053 1030 1034 1008 1054 1102 1022 955 1010 913 978 962 810 915 960 860 890 930 Вправо 481 524 500 633 555 551 560 605 545 574 535 482 497 550 448 452 471 487 469 529 ВСЕГО 3415 3573 3664 3965 3913 3844 3820 4026 3647 3714 3769 3361 3453 3651 3037 3239 3362 3333 3306 3587 Таблица 66. Количество единичных выбросов для принтера № 3 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8533 8975 9935 10201 9969 10182 10105 10327 9578 9614 9897 9351 9430 9955 7860 9659 9666 8849 9528 9656 Вверх 606 644 646 760 701 714 708 752 697 688 734 625 663 671 560 595 590 624 674 718 Вниз 1532 1562 1652 1705 1818 1753 1680 1743 1566 1624 1719 1497 1512 1631 1352 1470 1499 1547 1521 1636 Влево 1117 1202 1231 1217 1222 1226 1249 1285 1221 1154 1187 1115 1178 1186 988 1106 1129 1058 1105 1091 Вправо 1058 1054 1173 1173 1172 1207 1168 1270 1175 1094 1090 1018 1070 1039 914 1065 1022 990 995 1078 ВСЕГО 4313 4462 4702 4855 4913 4900 4805 5050 4659 4560 4730 4255 4423 4527 3814 4236 4240 4219 4295 4523 Таблица 67. Количество единичных выбросов для принтера № 4 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вверх 497 529 570 623 599 572 613 671 598 564 638 560 572 602 471 585 550 577 629 656 Вниз 604 601 689 704 691 771 700 795 706 636 696 648 726 693 627 637 693 683 729 676 106 Влево 538 601 671 716 653 701 671 653 657 631 689 649 632 695 538 603 660 573 650 678 Вправо 522 622 650 666 690 662 629 631 591 585 681 563 627 594 540 619 595 550 604 673 ВСЕГО 2161 2353 2580 2709 2633 2706 2613 2750 2552 2416 2704 2420 2557 2584 2176 2444 2498 2383 2612 2683 Таблица 68. Количество единичных выбросов для принтера № 4 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8717 9193 10286 10505 10212 10481 10306 10723 9817 9977 10172 9562 9588 10310 9225 9709 9919 9224 9877 9971 Вверх 628 664 737 817 741 740 791 855 743 729 821 698 720 764 584 709 724 722 784 775 Вниз 657 664 755 788 770 840 751 861 790 692 765 705 784 765 676 696 745 748 806 732 Влево 660 724 849 883 834 871 836 814 844 791 863 785 788 828 658 775 817 715 790 815 Вправо 756 891 939 957 929 918 906 897 857 866 939 794 879 882 754 858 849 814 844 920 ВСЕГО 2701 2943 3280 3445 3274 3369 3284 3427 3234 3078 3388 2982 3171 3239 2672 3038 3135 2999 3224 3242 Таблица 69. Количество единичных углублений для принтера № 1 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 611 815 788 809 728 812 771 863 770 744 838 753 848 800 636 727 742 688 734 755 Снизу 599 760 920 956 909 934 881 891 922 888 971 856 865 939 736 827 858 795 846 860 107 Слева 699 846 924 1037 935 843 1004 1021 960 893 1052 827 910 985 721 810 879 767 770 859 Справа 684 831 946 967 903 893 952 1007 996 875 1007 954 955 933 749 844 887 800 830 891 ВСЕГО 2593 3252 3578 3769 3475 3482 3608 3782 3648 3400 3868 3390 3578 3657 2842 3208 3366 3050 3180 3365 Таблица 70. Количество единичных углублений для принтера № 1 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8777 9035 10076 10335 10085 10381 10209 10410 9803 9933 10048 9478 9419 10179 8108 9651 9812 9051 9693 9778 Сверху 1155 1255 1309 1361 1272 1410 1319 1379 1308 1320 1359 1222 1336 1302 1094 1226 1311 1125 1275 1257 Снизу 658 799 987 1016 956 1009 938 933 982 939 1025 892 905 972 757 871 896 838 896 910 Слева 1239 1472 1570 1737 1608 1502 1663 1656 1568 1509 1689 1465 1593 1612 1290 1456 1528 1395 1391 1481 Справа 777 933 1056 1071 1018 1012 1077 1090 1100 993 1109 1069 1063 1048 846 940 998 903 954 1026 ВСЕГО 3829 4459 4922 5185 4854 4933 4997 5058 4958 4761 5182 4648 4897 4934 3987 4493 4733 4261 4516 4674 Таблица 71. Количество единичных углублений для принтера № 2 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 607 602 652 645 673 695 708 730 648 614 731 660 680 666 568 654 605 622 644 647 Снизу 671 645 774 801 760 840 715 798 706 682 768 727 678 701 668 701 669 683 707 728 108 Слева 672 645 787 801 727 802 784 798 693 807 795 721 729 750 648 700 740 647 735 774 Справа 776 788 863 885 856 904 854 860 785 802 871 782 903 759 691 753 836 755 744 837 ВСЕГО 2726 2680 3076 3132 3016 3241 3061 3186 2832 2905 3165 2890 2990 2876 2575 2808 2850 2707 2830 2986 Таблица 72. Количество единичных углублений для принтера № 2 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8692 9332 9920 10288 9969 10353 10298 10452 9700 10013 10134 9602 9472 10105 8026 9682 9871 9206 9826 9856 Сверху 1131 1167 1355 1305 1353 1405 1386 1402 1263 1259 1378 1205 1264 1252 1046 1255 1222 1173 1206 1254 Снизу 705 705 822 845 814 912 794 849 743 733 832 783 714 747 706 737 718 740 771 792 Слева 1281 1217 1524 1529 1422 1580 1463 1482 1378 1510 1538 1349 1440 1439 1231 1371 1408 1219 1427 1483 Справа 868 912 968 1007 973 1014 998 987 882 919 973 909 1013 899 784 878 965 850 842 936 ВСЕГО 3985 4001 4669 4686 4562 4911 4641 4720 4266 4421 4721 4246 4431 4337 3767 4241 4313 3982 4246 4465 Таблица 73. Количество единичных углублений для принтера № 3 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 561 611 653 740 723 768 699 775 719 728 759 701 691 729 539 677 683 631 664 707 Снизу 994 1015 1081 1120 1134 1213 1137 1135 1093 1095 1164 986 1089 1109 920 1031 1093 1074 1087 1070 109 Слева 743 765 900 882 842 888 939 939 835 864 955 887 856 838 709 793 856 773 790 858 Справа 803 814 927 944 911 934 961 937 860 930 938 892 898 862 767 827 869 820 851 923 ВСЕГО 3101 3205 3561 3686 3610 3803 3736 3786 3507 3617 3816 3466 3534 3538 2935 3328 3501 3298 3392 3558 Таблица 74. Количество единичных углублений для принтера № 3 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Вложено, бит 8533 8975 9935 10201 9969 10182 10105 10327 9578 9614 9897 9351 9430 9955 7860 9659 9666 8849 9528 9656 Сверху 912 1041 1119 1173 1157 1184 1128 1225 1065 1078 1168 1062 1064 1037 915 1042 1049 1012 1042 1112 Снизу 1022 1043 1120 1149 1175 1226 1163 1180 1120 1114 1186 1022 1118 1131 922 1055 1109 1084 1103 1110 Слева 1313 1385 1594 1626 1585 1639 1599 1587 1498 1558 1658 1533 1515 1520 1263 1396 1524 1369 1443 1499 Справа 915 898 1033 1055 1011 1063 1069 1053 954 1034 1046 994 1011 952 845 913 973 929 947 1032 ВСЕГО 4162 4367 4866 5003 4928 5112 4959 5045 4637 4784 5058 4611 4708 4640 3945 4406 4655 4394 4535 4753 Таблица 75. Количество единичных углублений для принтера № 4 до вложения Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Сверху 540 583 676 644 658 643 648 731 654 638 643 589 643 700 508 621 619 575 644 694 Снизу 553 575 712 630 683 710 671 682 691 621 663 628 678 683 548 635 654 655 708 686 110 Слева 674 720 808 886 821 871 792 825 837 784 863 788 813 819 638 722 811 734 852 822 Справа 767 743 865 881 834 903 812 852 807 805 894 797 747 739 686 759 811 720 851 877 ВСЕГО 2534 2621 3061 3041 2996 3127 2923 3090 2989 2848 3063 2802 2881 2941 2380 2737 2895 2684 3055 3079 Таблица 76. Количество единичных углублений для принтера № 4 после вложения с [n = 20, k = 0,01] Изображение 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 4.3. Вложено, бит 8717 9193 10286 10505 10212 10481 10306 10723 9817 9977 10172 9562 9588 10310 9225 9709 9919 9224 9877 9971 Сверху 1118 1164 1253 1280 1267 1281 1255 1352 1210 1273 1296 1133 1224 1237 1011 1222 1282 1100 1214 1270 Снизу 602 638 773 709 756 765 724 752 726 673 725 676 732 728 605 698 698 707 768 733 Слева 1316 1301 1476 1566 1540 1585 1486 1519 1518 1440 1583 1441 1458 1439 1191 1404 1526 1385 1484 1461 Справа 859 851 1002 1013 944 1005 917 975 920 916 1002 901 829 854 776 860 920 828 942 993 ВСЕГО 3895 3954 4504 4568 4507 4636 4382 4598 4374 4302 4606 4151 4243 4258 3583 4184 4426 4020 4408 4457 Возможные улучшения методов вложения и обнаружения Из изложенного выше не трудно видеть, что основным недостатком стегосистемы, имитирующей шумы сканера является прирост единичных выбросов и единичных углублений, после вложения секретной информации. Есть два решения этой проблемы: уменьшить скорость вложения; усовершенствовать алгоритм вложения секретной информации. Наиболее простой – уменьшение скорости вложения, что уменьшит прирост единичных выбросов и единичных углублений и соответственно усложнит процесс обнаружения вложения секретной информации Для того чтобы сохранить приемлемую скорость вложения и в то же время повысить секретность необходимо усовершенствовать алгоритм вложения. Для этого после разбиения ПС на области 111 A должен производиться анализ каждой пригодной для вложения области с целью выявления оптимальных мест для вложения. На пример в области может производиться поиск единичных выбросов и единичных углублений, которые являются «шумовыми компонентами», появившимися после сканирования. И, следовательно, добавление рядом или удаление единичного выброса или единичного углубления приведет к уменьшению прироста единичных выбросов и единичных углублений. Таким образом сохраняется высокая скорость вложения и повышается сложность обнаружения. Основным недостатком методов обнаружения стегосистемы, имитирующей шумы сканера, анализом количества единичных выбросов и количества единичных углублений является критерий определяющий плотность текста на странице. Решение проблемы - подсчёт количества граничных чёрных пикселей; Подсчёт общего числа чёрных пикселей на странице считает кроме граничных пикселей, которые могут быть изменены, внутренние пиксели, которые не могут быть изменены. Считая же только граничные пиксели, мы получили бы более точный показатель количества единичных выбросов и единичных углублений. 112 Заключение В данной дипломной работе была рассмотрена стегосистема, имитирующая шумы сканера. В процессе выполнения дипломной работы были предложены и исследованы методы обнаружения стегосистемы, основанной на имитации шумов сканера. Произведены теоретические и экспериментальные оценки эффективности методов, показавшие, что при скорости вложения менее 2000 бит/ на страницу текста формата А4 данную стегосистему можно считать устойчивой к предложенным методам стегоанализа. При скорости вложения менее 1000 бит/ на страницу текста формата А4, данную стегосистему можно считать идеальной, так как на фоне 9000000 пикселей отследить изменение 200 – 500 пикселей не представляется возможным. Метод анализа количества единичных выбросов позволяет производить надёжное обнаружение вложений со скорость до 10000 бит/ на страницу текста формата А4 (при известных принтере и сканере), метод анализа количества единичных углублений позволяет производить надёжное обнаружаение вложений со скоростью до 4000 бит/ на страницу текста формата А4 (при известных принтере и сканере). Была разработана программа, выполняющая поиск и подсчет количества единичных выбросов и единичных углублений. Исходный код приведён в приложении № 1. В ближайшем будущем будет разработана демо – версия программы, реализующей предложенные методы стегоанализа, а именно методы анализа единичных выбросов и углублений. 113 Предложены методы улучшения как самой стегосистемы, так и методов обнаружения вложения секретной информации. 114 Список литературы 1. Коржик, В.И. «Основы стеганографии», Курс лекций, www.ibts-sut.ru; 2. Cole, Eric. «Hiding in Plain Sight: Steganography and the Art of Covert Communication», Wiley Publishing, Inc. , April 11, 2003; 3. Международная свободная энциклопедия Статья: «Википедия». «Стеганография». http://ru.wikipedia.org/wiki/Стеганография. 4. Kipper, Greg. «Investigator`s Guide to Steganography», Auerbach Publications, 2004; 5. Wayner, Peter. «Disappearing cryptography: Information hiding: Steganography & watermarking» - 3rd edition, Elsevier Inc. , 2009; 6. Ingemar J. Cox, Matthew L. Miller, Jeffrey A. Bloom, Jessica Fridrich, Ton Kalker. «Digital Watermarking and Steganography, Second Edition», Morgan Kaufmann Publishers, 2008; 7. Solomon Chris, Toby Breckon. «Fundamentals of Digital Image Processing. A Practical Approach with Examples in Matlab», A John Wiley & Sons, Ltd., PUblication, 2011; 8. Gonzales R.C., Woods R.E. «Digital Image Processing», Prentice – Hall, Inv., 2002; 9. Editor Anderson, Ross. «Information Hiding: First International Workshop», Proceedings (Lecture Notes in Computer Science), Cambridge, U.K., May 30 June 1, 1996. 10. Лебедев, М. А., дипломная работа на тему «Исследование методов противодействия использованию стегосистем в интересах террористических и криминальных групп», СПбГУТ, 2011. 11. Коржик, В. И., Лабораторные работы по курсу «Основы стеганографии», СПбГУТ. 12. Cadenhead, Rogers; Lemay, Laura. «Java 6 in 21 days», Sams Publishing , 2007. 115 13. Flanagan, David. «Java Examples in a nutshell», O`Reilly & Associates Inc., 2000. 14. Эккель, Б. «Философия Java. Библиотека программиста» - 4-е издание, Питер, 2009. 116 Приложение № 1 Исходный код программы, реализующей подсчёт количества единичных выбросов и единичных углублений, также реализующей стегосистему, основаную на погружении скрытых сообщений в шумы сканера, написанный на языке Java. Программа состоит из 20 классов, собранных в java archive. Main.java // запускает графическую оболочку программы; package sut.image; import java.awt.EventQueue; import javax.swing.JFrame; import sut.image.gui.MainFrame; public class Main { public static void main(String[] args) { final JFrame frame = new MainFrame("Image magic"); EventQueue.invokeLater(new Runnable() { public void run() { frame.pack(); frame.setVisible(true); } }); } } 117 MaskParser.java // анализатор маски поиска; package sut.image; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.StringTokenizer; public class MaskParser { public int[][] parseFileToMask(File file) throws MaskParseException, FileNotFoundException, IOException { if (!file.exists()) { throw new FileNotFoundException(); } FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line; 118 int firstLineLength = 0; int rowsNumber = 0; StringBuilder content = new StringBuilder(); boolean isfirstLineRead = false; while ((line = br.readLine())!=null) { if (!isfirstLineRead) { firstLineLength = line.length(); isfirstLineRead = true; } if (line.length() != firstLineLength) { throw new MaskParseException(); } content.append(line+"|"); rowsNumber++; } StringTokenizer st = new StringTokenizer(content.toString(), "|"); int[][] mask = new int[rowsNumber][firstLineLength]; for (int i=0; st.hasMoreTokens(); i++) { String next = st.nextToken(); 119 for (int j=0; j<firstLineLength; j++) { int pix = Integer.valueOf(next.charAt(j)+""); if (pix == 1) { mask[i][j] = -1; } else { mask[i][j] = -16777216; } } } return mask; } } MaskParserExceptions.java // указывает на неправильность маски; package sut.image; public class MaskParseException extends Exception { } Constant.java // содержит статические размеры окон; package sut.image; 120 import java.awt.Dimension; public class Constant { public static final Dimension MAIN_WINDOW = new HALF_FIELD = new Dimension(800,700); public static final Dimension Dimension(200,20); public static final Dimension MESSAGE_AREA Dimension(200,250); } Graphical User Interface BasePanel.java // создание панели; package sut.image.gui; import java.awt.Color; import java.awt.GridBagLayout; import java.io.File; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.filechooser.FileFilter; public abstract class BasePanel extends JPanel { protected JLabel infoLabel = new JLabel("Ok"); public BasePanel() { 121 = new setLayout(new GridBagLayout()); setBackground(Color.LIGHT_GRAY); } protected void sendNotification(String msg) { infoLabel.setText(msg); } protected class ImageFileFilter extends FileFilter { private final String[] validExtendions = { ".png", ".jpeg", ".jpg", ".bmp", ".gif" }; @Override public boolean accept(File f) { boolean valid = false; for (String ext : validExtendions) { if (f.getName().endsWith(ext) || f.isDirectory()) valid = true; } return valid; } @Override 122 public String getDescription() { return "Image files"; } } } ImageMaskFinder.java // создает окно поиска единичных выбросов и единичных углублений; package sut.image.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; 123 import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; private File[] loadedFiles; public ImageMaskFinder() { // init intro intro.setPreferredSize(new Dimension(540,80)); intro.setBackground(Color.WHITE); // init buttons openImages.addActionListener(new OpenImagesButtonListener()); openMask.addActionListener(new OpenMaskButtonListener()); calculate.addActionListener(new CalculateButtonListener()); // init table infoTable = new JTable(new ImageParserTableModel()); JScrollPane scrollTable = new JScrollPane(infoTable); scrollTable.setPreferredSize(new Dimension(300, 300)); // init mask area JScrollPane scrollMask = new JScrollPane(maskArea); 124 scrollMask.setPreferredSize(new Dimension(100,100)); // layout GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridx = 0; c.gridy = 0; c.gridwidth = 2; c.weightx = 1; c.weighty = 0.2; add(intro, c); c.fill = GridBagConstraints.NONE; c.gridy = 1; c.gridwidth = 1; c.weightx = 0.7; c.weighty = 0.1; add(openImages, c); c.gridx = 1; c.weightx = 0.3; add(openMask, c); c.fill = GridBagConstraints.BOTH; 125 c.gridx = 0; c.gridy = 2; c.gridheight = 2; c.weightx = 0.7; c.weighty = 0.6; add(scrollTable, c); c.fill = GridBagConstraints.NONE; c.gridx = 1; c.gridheight = 1; c.weightx = 0.3; c.weighty = 0.5; add(scrollMask, c); c.gridx = 1; c.gridy = 3; c.gridheight = 1; c.weighty = 0.1; add(calculate, c); c.fill = GridBagConstraints.BOTH; c.gridy = 4; c.gridx = 0; 126 c.gridwidth = 2; c.weightx = 1; c.weighty = 0.1; add(infoLabel, c); setVisible(true); } class OpenImagesButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { JFileChooser fc = new JFileChooser(); FileFilter ff = new ImageFileFilter(); fc.setFileFilter(ff); fc.setAcceptAllFileFilterUsed(false); fc.setMultiSelectionEnabled(true); int status = fc.showOpenDialog(ImageMaskFinder.this); if (status == JFileChooser.APPROVE_OPTION) { File[] choosenFiles = fc.getSelectedFiles(); fillTableWithFiles(choosenFiles); sendNotification(choosenFiles.length + " files opened"); 127 } else if (status == JFileChooser.ERROR_OPTION) { sendNotification("error opening image file(s)"); } } } class OpenMaskButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { JFileChooser fc = new JFileChooser(); fc.setMultiSelectionEnabled(false); int status = fc.showOpenDialog(ImageMaskFinder.this); if (status == JFileChooser.APPROVE_OPTION) { File choosenFile = fc.getSelectedFile(); boolean valid = fillMaskTextArea(choosenFile); if (valid) sendNotification("mask loaded"); } else if (status == JFileChooser.ERROR_OPTION) { sendNotification("error opening mask file"); } } 128 } class CalculateButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { if (loadedFiles != null && !maskArea.getText().isEmpty()) { int[][] premask = null; try { premask = ImageUtils.validateAndReturnMask(maskArea.getText()); premask = ImageUtils.convertBitmapToImage(premask); } catch (MaskParseException e1) { sendNotification("wrong mask format"); return; } final int[][] mask = premask; ThreadGrou tg = new ThreadGrou("working_threads"); Thread[] threads = new Thread[loadedFiles.length]; int i = 0; 129 for (final File file : loadedFiles) { Thread t = new Thread(new Runnable() { public void run() { SubImageProcessor finder = new SubImageProcessor(); Integer row = null; for (int i=0; i<infoTable.getModel().getRowCount(); i++) { if (infoTable.getValueAt(i, 0).equals(file.getName())) { row = i; } } if (row == null) { return; } try { int found = finder.findSubImage(ImageUtils.fileToImage(file), mask); infoTable.setValueAt(found, row, 1); } catch (IOException e) { 130 infoTable.setValueAt("error", row, 1); e.printStackTrace(); } } }); threads[i] = t; i++; } tg.enumerate(threads); for (Thread t : threads) { t.start(); } } else { sendNotification("please fill calculation data"); } } } private void fillTableWithFiles(File[] files) { 131 System.out.println("table: clearing"); ((ImageParserTableModel)infoTable.getModel()).clear(); loadedFiles = files; int rowIndexCounter = 0; for (File file : files) { infoTable.getModel().setValueAt(file.getName(), rowIndexCounter, 0); infoTable.getModel().setValueAt("unknown", rowIndexCounter, 1); rowIndexCounter++; } System.out.println("table: rows: "+infoTable.getModel().getRowCount()); } private boolean fillMaskTextArea(File file) { boolean valid = false; try { int[][] mask = ImageUtils.fileToMask(file); maskArea.setText(ImageUtils.convertMaskToString(mask)); valid = true; } catch (FileNotFoundException e) { 132 sendNotification("mask file not found"); e.printStackTrace(); } catch (IOException e) { sendNotification("error opening mask"); e.printStackTrace(); } catch (MaskParseException e) { sendNotification("wrong mask format"); } return valid; } } ImageParserTableModel.java // создаёт таблицу вывода результатов поиска; package sut.image.gui; import javax.swing.table.AbstractTableModel; import sut.image.logic.PrintUtils; public class ImageParserTableModel extends AbstractTableModel { private String[] columnNames = {"Image file", "Occurence number"} private Object[][] data; public ImageParserTableModel() { 133 data = new Object[1][2]; } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public int getColumnCount() { return 2; } @Override public int getRowCount() { return data.length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return data[rowIndex][columnIndex]; } @Override 134 public synchronized void setValueAt(Object value, int rowIndex, int columnIndex) { System.out.println("set value: " + rowIndex + " " + columnIndex + " value: " + value.toString()); if (data.length < (rowIndex+1)) { Object[][] newData = new Object[rowIndex+1][2]; for (int i=0; i<rowIndex; i++) { newData[i][0] = data[i][0]; newData[i][1] = data[i][1]; } data = newData; } data[rowIndex][columnIndex] = value; fireTableDataChanged(); } public void clear() { data = new Object[1][2]; } } 135 ImageStegoInsert.java // создает панель, реализующую алгоритм вложения секретной информации; package sut.image.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.List; import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JScrollPane; 136 import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; import javax.swing.border.TitledBorder; import javax.swing.filechooser.FileFilter; import sut.image.Constant; import sut.image.gui.ImageStegoMaster.Size; import sut.image.logic.AreaVO; import sut.image.logic.ImageUtils; import sut.image.logic.InsertBitsProcessor; import sut.image.logic.StringUtils; public class ImageStegoInsert extends BasePanel { private JButton openImage = new JButton("Open Image"); private JLabel openedImage = new JLabel(); private JLabel l_coeficient = new JLabel("k"); private JTextField t_coeficient = new JTextField("0.1"); private JLabel l_subImageSize = new JLabel("size"); private JTextField t_subImageSize = new JTextField("20"); private JLabel l_message = new JLabel("msg"); private JEditorPane t_message = new JEditorPane(); private JButton testAvailableBits = new JButton("Test"); 137 private JLabel l_availableBits = new JLabel("can insert 0 bits"); private JButton insertBits = new JButton("Insert"); private File loadedFile; private int[][] loadedImageBitmap; public ImageStegoInsert() { setLayout(new GridBagLayout()); setBackground(Color.LIGHT_GRAY); TitledBorder title = BorderFactory.createTitledBorder("Insert bits"); setBorder(title); // init buttons openImage.addActionListener(new OpenImageButtonListener()); testAvailableBits.addActionListener(new TestButtonListener()); insertBits.addActionListener(new InsertBitsButtonListener()); // init input fields openedImage.setPreferredSize(Constant.HALF_FIELD); t_coeficient.setPreferredSize(Constant.HALF_FIELD); t_subImageSize.setPreferredSize(Constant.HALF_FIELD); JScrollPane st_message = new JScrollPane(t_message); 138 st_message.setPreferredSize(Constant.MESSAGE_AREA); st_message.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONT AL_SCROLLBAR_NEVER); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.NONE; c.gridx = 0; c.gridy = 0; c.gridwidth = 1; c.weightx = Size.wLeft; c.weighty = Size.hVerySmall; add(openImage, c); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridwidth = 2; c.weightx = Size.wRight; add(openedImage, c); c.fill = GridBagConstraints.NONE; c.gridx = 0; c.gridy = 2; c.gridwidth = 1; 139 c.weightx = Size.wLeft; add(l_coeficient, c); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridwidth = 2; c.weightx = Size.wRight; add(t_coeficient, c); c.fill = GridBagConstraints.NONE; c.gridx = 0; c.gridy = 3; c.gridwidth = 1; c.weightx = Size.wLeft; add(l_subImageSize, c); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridwidth = 2; c.weightx = Size.wRight; add(t_subImageSize, c); c.fill = GridBagConstraints.NONE; c.gridx = 0; 140 c.gridy = 4; c.gridwidth = 1; c.weightx = Size.wLeft; add(l_message, c); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridwidth = 2; c.weightx = Size.wRight; add(st_message, c); c.gridx = 0; c.gridy = 5; c.gridwidth = 1; c.weightx = Size.wLeft; c.weighty = Size.hNormal; add(testAvailableBits, c); double mid = 0.3; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.CENTER; c.gridx = 1; c.weightx = Size.wRight - 0.3; 141 add(l_availableBits, c); c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.CENTER; c.gridx = 2; c.weightx = mid; add(insertBits, c); c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.CENTER; c.gridx = 0; c.gridwidth = 3; c.gridy = 6; add(infoLabel, c); setVisible(true); } class OpenImageButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { JFileChooser fc = new JFileChooser(); FileFilter ff = new ImageFileFilter(); fc.setFileFilter(ff); 142 fc.setAcceptAllFileFilterUsed(false); fc.setMultiSelectionEnabled(false); try { int status = fc.showOpenDialog(ImageStegoInsert.this); if (status == JFileChooser.APPROVE_OPTION) { File choosenFile = fc.getSelectedFile(); loadedFile = choosenFile; openedImage.setText(choosenFile.getAbsolutePath()); int[][] image = ImageUtils.fileToImage(choosenFile); loadedImageBitmap = ImageUtils.convertImageToBitmap(image); sendNotification("File opened"); } else if (status == JFileChooser.ERROR_OPTION) { sendNotification("error opening image file(s)"); } } catch (IOException e) { sendNotification("error reading file"); } 143 } } class InsertBitsButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { // validate coef && size ThreadGrou tg = new ThreadGrou("working_threads"); final int[][] bitmap = loadedImageBitmap; final double coeficient; final int borderSize; if (loadedImageBitmap == null) { sendNotification("No image is opened"); return; } try { coeficient = Double.valueOf(t_coeficient.getText()); borderSize = Integer.valueOf(t_subImageSize.getText()); } catch (NumberFormatException ex) { 144 sendNotification("Input data incorrect format"); return; } if (!((coeficient > 0) && (coeficient < 1))) { sendNotification("Value of \"k\" should be from 0 to 1"); return; } final int[] message = StringUtils.toIntArray(t_message.getText()); List<AreaVO> areas = ImageUtils.getListOfAvailableAreas(bitmap, borderSize, coeficient); Thread[] threads = new Thread[message.length]; InsertBitsProcessor.setBitmap(bitmap); int i=0; for (final AreaVO area : areas) { if (area.getNumber() >= message.length) { break; } Thread t = new Thread(new Runnable() { public void run() { InsertBitsProcessor processor = new InsertBitsProcessor(); 145 int msg = message[area.getNumber()]; processor.insertBit(area, borderSize, coeficient, msg); } }); threads[i] = t; i++; } tg.enumerate(threads); for (Thread t : threads) { t.start(); } System.out.println("thread: " + threads.length); sendNotification("Thread grou finished."); BufferedImage img = new BufferedImage(loadedImageBitmap[0].length, loadedImageBitmap.length, BufferedImage.TYPE_INT_RGB); int[][] normalBitmap = ImageUtils.convertBitmapToImage(InsertBitsProcessor.getBitmap()); // int[] normallist = ImageUtils.convertBitArrayToList(normalBitmap); // img.getRaster().setDataElements(0, 0, normalBitmap); 146 for (i=0;i<loadedImageBitmap.length;i++) { for (int j=0;j<loadedImageBitmap[0].length;j++) { img.setRGB(j, i, normalBitmap[i][j]); } } int extensionIndex = loadedFile.getAbsolutePath().lastIndexOf("."); String dir = loadedFile.getAbsolutePath().substring(0, extensionIndex); String format = loadedFile.getAbsolutePath().substring(extensionIndex); File out = new File(dir+"_st"+format); // int[] rgb = new int[213*137]; // img.getRGB(0, 0, loadedImage[0].length, loadedImage.length, // // rgb, 0, 1); img.setRGB(0, 0, loadedImage[0].length, loadedImage.length, // // // rgb, 0, 1); for (i=0; i<rgb.length;i++) System.out.print(rgb[i]); 147 try { ImageIO.write(img, "bmp", out); } catch (IOException e1) { sendNotification("Error rendering image."); } } } private class TestButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { if (loadedImageBitmap == null) { return; } final int[][] bitmap = loadedImageBitmap; final double coeficient = Double.valueOf(t_coeficient.getText()); final int borderSize = Integer.valueOf(t_subImageSize.getText()); List<AreaVO> areas = ImageUtils.getListOfAvailableAreas(bitmap, borderSize, coeficient); 148 l_availableBits.setText("can insert " + areas.size() + " bits"); } } } ImageStegoMaster.java // создает панель, реализующую сиегосистему, основанную на погружении скрытых сообщений в шумы сканера; package sut.image.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.border.TitledBorder; public class ImageStegoMaster extends JPanel { private JPanel intro = new IntroPanel("intro_tab2.png"); public ImageStegoMaster() { setLayout(new GridBagLayout()); setBackground(Color.LIGHT_GRAY); 149 // init intro intro.setPreferredSize(new Dimension(550, 80)); intro.setBackground(Color.WHITE); ImageStegoInsert LeftPane = new ImageStegoInsert(); ImageStegoRetrieve RightPane = new ImageStegoRetrieve(); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridx = 0; c.gridy = 0; c.gridwidth = 2; c.weightx = 1; c.weighty = 0.2; add(intro, c); c.gridx = 0; c.gridy = 1; c.gridwidth = 1; c.weightx = 0.5; c.weighty = 0.8; add(LeftPane, c); c.gridx = 1; 150 add(RightPane, c); setVisible(true); } protected class Size { protected static final double wLeft = 0.05; protected static final double wRight = 1 - wLeft; protected static final double hVerySmall = 0.05; protected static final double hNormal = 0.2; } } ImageStegoRetrive.java // создает панель, реализующую алгоритм извлечения секретной информации; package sut.image.gui; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; 151 import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; import javax.swing.border.TitledBorder; import javax.swing.filechooser.FileFilter; import sut.image.Constant; import sut.image.gui.ImageStegoMaster.Size; import sut.image.logic.AreaVO; import sut.image.logic.ImageUtils; import sut.image.logic.StringUtils; public class ImageStegoRetrieve extends BasePanel { private JButton openImage = new JButton("Open Image"); private JLabel openedImage = new JLabel(); 152 private JLabel l_coeficient = new JLabel("k"); private JTextField t_coeficient = new JTextField(); private JLabel l_subImageSize = new JLabel("size"); private JTextField t_subImageSize = new JTextField(); private JLabel l_message = new JLabel("msg"); private JEditorPane t_message = new JEditorPane(); private JButton retrieveBits = new JButton("Retrieve"); private int[][] loadedImage; public ImageStegoRetrieve() { setLayout(new GridBagLayout()); setBackground(Color.LIGHT_GRAY); TitledBorder title = BorderFactory.createTitledBorder("Retrieve message"); setBorder(title); // init buttons openImage.addActionListener(new OpenImageButtonListener()); retrieveBits.addActionListener(new RetrieveBitsButtonListener()); // init input fields openedImage.setPreferredSize(Constant.HALF_FIELD); 153 t_coeficient.setPreferredSize(Constant.HALF_FIELD); t_subImageSize.setPreferredSize(Constant.HALF_FIELD); t_message.setText("unnown"); JScrollPane st_message = new JScrollPane(t_message); st_message.setPreferredSize(Constant.MESSAGE_AREA); st_message.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORI ZONTAL_SCROLLBAR_NEVER); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.NONE; c.gridx = 0; c.gridy = 0; c.weightx = Size.wLeft; c.weighty = Size.hVerySmall; add(openImage, c); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridwidth = 2; c.weightx = Size.wRight; add(openedImage, c); c.fill = GridBagConstraints.NONE; 154 c.gridx = 0; c.gridy = 1; c.gridwidth = 1; c.weightx = Size.wLeft; add(l_coeficient, c); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridwidth = 2; c.weightx = Size.wRight; add(t_coeficient, c); c.fill = GridBagConstraints.NONE; c.gridx = 0; c.gridy = 2; c.gridwidth = 1; c.weightx = Size.wLeft; add(l_subImageSize, c); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridwidth = 2; c.weightx = Size.wRight; 155 add(t_subImageSize, c); c.fill = GridBagConstraints.NONE; c.gridx = 0; c.gridy = 3; c.gridwidth = 1; c.weightx = Size.wLeft; add(l_message, c); c.fill = GridBagConstraints.HORIZONTAL; c.gridx = 1; c.gridwidth = 2; c.weightx = Size.wRight; add(st_message, c); c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.EAST; c.gridx = 2; c.gridy = 4; c.gridwidth = 1; c.weightx = 1; c.weighty = Size.hNormal; 156 add(retrieveBits, c); c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.CENTER; c.gridx = 0; c.gridwidth = 3; c.gridy = 5; add(infoLabel, c); setVisible(true); } class OpenImageButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { JFileChooser fc = new JFileChooser(); FileFilter ff = new ImageFileFilter(); fc.setFileFilter(ff); fc.setAcceptAllFileFilterUsed(false); fc.setMultiSelectionEnabled(false); try { 157 int status = fc.showOpenDialog(ImageStegoRetrieve.this); if (status == JFileChooser.APPROVE_OPTION) { File choosenFile = fc.getSelectedFile(); openedImage.setText(choosenFile.getAbsolutePath()); int[][] image = ImageUtils.fileToImage(choosenFile); loadedImage = ImageUtils.convertImageToBitmap(image); sendNotification("File opened"); } else if (status == JFileChooser.ERROR_OPTION) { sendNotification("error opening image file(s)"); } } catch (IOException e) { sendNotification("error reading file"); } } } class RetrieveBitsButtonListener implements ActionListener { 158 @Override public void actionPerformed(ActionEvent e) { final int[][] bitmap = loadedImage; final double coeficient; final int borderSize; if (loadedImage == null) { sendNotification("No image is opened"); return; } try { coeficient = Double.valueOf(t_coeficient.getText()); borderSize = Integer.valueOf(t_subImageSize.getText()); } catch (NumberFormatException ex) { sendNotification("Input data incorrect format"); return; } if (!((coeficient > 0) && (coeficient < 1))) { sendNotification("Value of \"k\" should be from 0 to 1"); return; } 159 List<AreaVO> areas = ImageUtils.getListOfAvailableAreas(bitmap, borderSize, coeficient); final int[] message = new int[areas.size()]; for (final AreaVO area : areas) { boolean isEvenBlackBits = area.getBlackBits() % 2 == 0; message[area.getNumber()] = isEvenBlackBits ? 0 : 1; } t_message.setText(StringUtils.toStringFromArray(message)); sendNotification(message.length + " bits successfully retrieved"); } } } ImageTableVO.java // хранит данные обнаружения; package sut.image.gui; public class ImageTableVO { private String image; private String occurence; public ImageTableVO(String image, String occurence) { 160 suer(); this.image = image; this.occurence = occurence; } public String getImage() { return image; } public void setImage(String image) { this.image = image; } public String getOccurence() { return occurence; } public void setOccurence(String occurence) { this.occurence = occurence; } } IntroPanel.java // панель приветствия; package sut.image.gui; import java.awt.Color; 161 import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import javax.swing.JPanel; public class IntroPanel extends JPanel { private BufferedImage image; public IntroPanel(String filename) { setBackground(Color.GRAY); try { InputStream is = getClass().getResourceAsStream("/"+filename); image = ImageIO.read(is); } catch (IOException ex) { // do not handle } } @Override public void paintComponent(Graphics g) { 162 g.drawImage(image, 0, 0, null); // see javadoc for more info on the } } MainFrame.java // создает общую структуру графической оболочки; package sut.image.gui; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; 163 import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.filechooser.FileFilter; import sut.image.Constant; import sut.image.logic.MaskParseException; import sut.image.logic.ImageUtils; import sut.image.logic.SubImageProcessor; public class MainFrame extends JFrame { public MainFrame(String name) { suer(name); setPreferredSize(Constant.MAIN_WINDOW); setLocation(100,50); Container cp = this.getContentPane(); cp.setBackground(Color.LIGHT_GRAY); // tab pane 164 JTabbedPane tab = new JTabbedPane(); tab.setPreferredSize(Constant.MAIN_WINDOW); JComponent tab1 = new ImageMaskFinder(); JComponent tab2 = new ImageStegoMaster(); tab.addTab("Mask finder", tab1); tab.addTab("Insert bits", tab2); cp.add(tab); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); } } Logical Classes AreaVO.java // хранит данные об областях A; package sut.image.logic; public class AreaVO { public AreaVO(int x, int y) { suer(); this.x = x; this.y = y; } 165 private int x; private int y; private int number; private int type; private int blackBits; public int getBlackBits() { return blackBits; } public void setBlackBits(int blackBits) { this.blackBits = blackBits; } public int getType() { return type; } public void setType(int type) { this.type = type; } public int getX() { return x; } 166 public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } } ImageUtils.java // производит считывание и проверку масок, преобразование изображений в массивы бит и обратно, поиск областей пригодных для вложения, подсчёт количества чёрных пикселей внутри бластей; package sut.image.logic; 167 import java.awt.Dimension; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.StringTokenizer; import javax.imageio.ImageIO; public class ImageUtils { public static int[][] fileToMask(File file) throws MaskParseException, FileNotFoundException, IOException { if (!file.exists()) { throw new FileNotFoundException(); } FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); StringBuilder content = new StringBuilder(); 168 String line = ""; while ((line = br.readLine())!=null) { content.append(line+"\n"); } int[][] mask = validateAndReturnMask(content.toString()); return mask; } public static int[][] fileToImage(File imgFile) throws IOException { BufferedImage bi = ImageIO.read(imgFile); int w = bi.getWidth(); int h = bi.getHeight(); System.out.println(w+" "+h); int[][] pixels = new int[h][w]; for (int i=0; i<h; i++) { for (int j=0; j<w; j++) { pixels[i][j] = bi.getRGB(j, i); } } return pixels; } 169 public static int[][] validateAndReturnMask(String stringMask) throws MaskParseException { if (stringMask.isEmpty()) { throw new MaskParseException(); } String line; int firstLineLength = 0; int rowsNumber = 0; StringTokenizer st = new StringTokenizer(stringMask, "\n"); boolean isfirstLineRead = false; while (st.hasMoreTokens()) { line = st.nextToken(); if (!isfirstLineRead) { firstLineLength = line.length(); isfirstLineRead = true; } if (line.length() != firstLineLength) { throw new MaskParseException(); } rowsNumber++; 170 } st = new StringTokenizer(stringMask, "\n"); int[][] mask = new int[rowsNumber][firstLineLength]; for (int i=0; st.hasMoreTokens(); i++) { String next = st.nextToken(); for (int j=0; j<firstLineLength; j++) { int pix = Integer.valueOf(next.charAt(j)+""); System.out.print(next.charAt(j)+""); if (pix != 0 && pix != 1) { throw new MaskParseException(); } else { mask[i][j] = pix; } } } return mask; } public static int[][] convertBitmapToImage(int[][] bitmap) { int[][] image = new int[bitmap.length][bitmap[0].length]; for (int i=0; i<bitmap.length; i++) { 171 for (int j=0; j<bitmap[0].length; j++) { if (bitmap[i][j] == 0) { image[i][j] = -1; } else { image[i][j] = -16777216; } } } return image; } public static int[] convertBitArrayToList(int[][] array) { int[] list = new int[array.length*array[0].length]; for (int i=0; i<array.length; i++) { for (int j=0; j<array[0].length; j++) { list[i*array[0].length+j] = array[i][j]; } } return list; } public static int[][] convertImageToBitmap(int[][] image) { 172 int[][] bitmap = new int[image.length][image[0].length]; for (int i=0; i<image.length; i++) { for (int j=0; j<image[0].length; j++) { if (image[i][j] == -1) { bitmap[i][j] = 0; } else { bitmap[i][j] = 1; } } } return bitmap; } public static String convertMaskToString(int[][] mask) { StringBuilder builder = new StringBuilder(); for (int i=0; i<mask.length; i++) { if (i != 0) { builder.append("\n"); } for (int j=0; j<mask[i].length; j++) { builder.append(mask[i][j]); 173 } } return builder.toString(); } public static List<AreaVO> getListOfAvailableAreas(int[][] bitmap, int borderSize, double coeficient) { List<AreaVO> list = new LinkedList<AreaVO>(); List<AreaVO> AllAreasList = splitBitmapOnAreas(bitmap, borderSize); int currentNumber = 0; int currentType = -1; for (AreaVO area : AllAreasList) { currentType = recognizeType(area, bitmap, borderSize, coeficient); if (currentType == 0 || currentType == 1 || currentType == 2) { area.setNumber(currentNumber); area.setType(currentType); list.add(area); currentNumber++; } 174 } return list; } private static List<AreaVO> splitBitmapOnAreas(int[][] bitmap, int borderSize) { List<AreaVO> list = new LinkedList<AreaVO>(); Dimension areas = countNumberOfAllAreas(bitmap, borderSize); for (int i=0; i< areas.height; i++) { for (int j=0; j< areas.width; j++) { int x = j*borderSize; int y = i*borderSize; list.add(new AreaVO(x,y)); } } return list; } private static Dimension countNumberOfAllAreas(int[][] bitmap, int borderSize) { int h = bitmap.length; if (h == 0) { 175 return new Dimension(0,0); } int w = bitmap[0].length; int _w = Math.round(w/borderSize); int _h = Math.round(h/borderSize); return new Dimension(_w, _h); } private static int recognizeType(AreaVO area, int[][] bitmap, int borderSize, double coeficient) { int type = -1; int blackBits = countNumberBlackBits(area, bitmap, borderSize); area.setBlackBits(blackBits); if (blackBits == Math.round((1 coeficient)*(borderSize*borderSize))) { type = 1; } else if (blackBits == Math.round(coeficient*(borderSize*borderSize))) { type = 2; } else if ((blackBits > coeficient*(borderSize*borderSize)) && (blackBits < (1 coeficient)*(borderSize*borderSize))) { 176 type = 0; } return type; } private static int countNumberBlackBits(AreaVO area, int[][] bitmap, int borderSize) { int count = 0; for (int i=area.getY(); i<area.getY()+borderSize; i++) { for (int j=area.getX(); j<area.getX()+borderSize; j++) { if (bitmap[i][j] == 1) count++; } } return count; } } InserBitsProcessor.java // производит вложение секретной информации; package sut.image.logic; public class InsertBitsProcessor { private static int[][] bitmap; 177 public void insertBit(AreaVO area, int borderSize, double coefficient, int msg) { int type = area.getType(); int blackBits = area.getBlackBits(); System.out.println("area "+area+" type="+type + " msg="+msg + " m="+blackBits + " l="+coefficient*(borderSize*borderSize)+" r="+(1 coefficient)*(borderSize*borderSize)); // insert bits boolean isEvenBalckBits = blackBits % 2 == 0; switch (type) { case 0: { boolean inserted = false; if ((Integer.valueOf(msg).equals(0) && !isEvenBalckBits) || (Integer.valueOf(msg).equals(1) && isEvenBalckBits)) { System.out.println("***"); for (int i=area.getY()+1; i<area.getY()+borderSize1; i++) { for (int j=area.getX()+1; j<area.getX()+borderSize-1; j++) { if (bitmap[i][j] == 0) { 178 if (changeBit(i,j,1,0)) {inserted=true; break;} } else if (bitmap[i][j] == 1) { if (changeBit(i,j,0,1)) {inserted=true; break;} } } if (inserted) break; } } break; } case 1: { boolean inserted = false; if (msg == 0 && !isEvenBalckBits || msg == 1 && isEvenBalckBits) { for (int i=area.getY()+1; i<area.getY()+borderSize; i++) { for (int j=area.getX()+1; j<area.getX()+borderSize; j++) { if (bitmap[i][j] == 0) { if (changeBit(i,j,1,0)) {inserted=true; break;} 179 } } if (inserted) break; } } break; } case 2: { boolean inserted = false; if (msg == 0 && !isEvenBalckBits || msg == 1 && isEvenBalckBits) { for (int i=area.getY()+1; i<area.getY()+borderSize; i++) { for (int j=area.getX()+1; j<area.getX()+borderSize; j++) { if (bitmap[i][j] == 1) { if (changeBit(i,j,0,1)) {inserted=true; break;} } } if (inserted) break; } 180 } break; } } } private boolean changeBit(int i, int j, int bit, int onBit) { if (bitmap[i][j-1] == bit) {bitmap[i][j-1] = onBit; return true;} if (bitmap[i-1][j] == bit) {bitmap[i-1][j] = onBit; return true;} if (bitmap[i+1][j] == bit) {bitmap[i+1][j] = onBit; return true;} if (bitmap[i][j+1] == bit) {bitmap[i][j+1] = onBit; return true;} return false; } public static void setBitmap(int[][] bitmap) { InsertBitsProcessor.bitmap = bitmap; } public static int[][] getBitmap() { return bitmap; } } 181 MaskParseException // используется при обнаружении ошибок ввода маски; package sut.image.logic; public class MaskParseException extends Exception { } PrintUtils.java // вывод значений массива; package sut.image.logic; public class PrintUtils public static void printObjectMatrix(Object[][] matrix) { for (int i=0; i<matrix.length; i++) { for (int j=0; j<matrix[i].length; j++) { System.out.println(matrix[i][j]+" "); } System.out.println(); } } } StringUtils.java // используется для работы со строками; package sut.image.logic; public class StringUtils { 182 public static int[] toIntArray(String st) { int[] res = new int[st.length()]; for (int i=0; i<st.length(); i++) { res[i] = Integer.valueOf(st.substring(i, i+1)); } return res; } public static String toStringFromArray(int[] ar) { StringBuilder sb = new StringBuilder(); for (int i=0; i<ar.length; i++) { sb.append(ar[i]); } return sb.toString(); } } SubImageProcessor.java // поиск количества совпадений маски с изображением; package sut.image.logic; public class SubImageProcessor { 183 public int findSubImage(int[][] parentImagePix, int[][] subImagePix) { int counter = 0; int parentH = parentImagePix.length; int parentW = parentImagePix[0].length; int subH = subImagePix.length; int subW = subImagePix[0].length; for (int parentImageH=0; parentImageH<parentH-subH; parentImageH++) { for (int parentImageW=0; parentImageW<parentWsubW; parentImageW++) { boolean countThis = true; for (int subImageH=0; subImageH<subH; subImageH++) { for (int subImageW=0; subImageW<subW; subImageW++) { // main compare logic if (subImagePix[subImageH][subImageW] != parentImagePix[parentImageH+subImageH][parentImageW+subImageW]) { countThis = false; } 184 } } if (countThis) { counter++; } } } return counter; } } 185