Скрытие конфиденциальной информации при помощи стеганографии

Смоленский промышленно – экономический колледж

КАФЕДРА ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ





Пояснительная записка 

к курсовому проекту 

Тема «Скрытие конфиденциальной информации при помощи стеганографии»









Выполнил студент группы  614-б

Овчинников Денис Юрьевич

Подпись:____________________

«____» _________________200_ г

Руководитель курсового проекта: 

Леонова Марина Олеговна

Подпись:____________________

«____» _________________200_ г

Оценка:_____________________





 





           











Смоленск

2009

Оглавление

Введение…………………………………………………………………………...3

Основная часть………………………………………………………….….6

1.Теоретическое обоснование……………………………………………..6

	1.1 Основные положения стеганографии……………………….....6

	1.2 Встраивание сообщений в незначащие элементы контейнера.14

	1.3 Стеганографические протоколы……………………………....15

          1.4 Практические вопросы встраивания данных………................17

	1.5 Практические оценки стойкости стегосистем……………..…18

      1.6 Скрытие данных в неподвижных изображениях……...……..19

                 1.6.1 Обзор алгоритмов встраивания информации в изображения………………………………………………………..20

	II.   Практическая часть……………………………………………………...23

	  1. Анализ технического задания………………………………………..23

	 Актуальность программного продукта………………………23

	Назначение программного продукта……………………….....24

	Принцип работы программного продукта………………..…..24

	Сфера применения разработанного программного продукта.26

	2.Обоснование выбора средств разработки……………………………..26

	3.Модульная структура программы……………………………………..28

	4.Разработка форм входных и выходных данных………………………29

	4.1Входные данные……………………………………………...…29

	4.2Выходные данные………………………………………………29

	5.Теститрование программного продукта………………………………29

	5.1Тестирование выполнения основных функций программы…….29

	6.Разработка сопроводительных документов…………………………...30

	6.1Описание руководства программиста………………………..…...30

	6.2Описание руководства пользователя……………………………..30

	ЗАКЛЮЧЕНИЕ……………………………………………………..…….32

	СПИСОК ЛИТЕРАТУРЫ………………………………………………..34

	ПРИЛОЖЕНИЕ А…………………………………………………...……35

    ПРИЛОЖЕНИЕ Б…………………………………………………………48

Введение

Актуальность проблемы информационной безопасности постоянно растет и стимулирует поиск новых методов защиты информации. Современные компьютерные технологии, прогресс в области глобальных компьютерных сетей и средств мультимедиа обеспечивает возможность разработки и реализации новых методов, предназначенных для обеспечения компьютерной информационной безопасности. Компьютерные технологии придали новый импульс развитию и совершенствованию нового направления в области защиты информации - компьютерной стеганографии. 

Стеганография (от греч — скрытый и греч— пишу, буквально «тайнопись») — это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. Исторически это направление появилось первым, но затем во многом было вытеснено криптографией. В отличие от криптографии, которая скрывает содержимое секретного сообщения, стеганография скрывает само его существование. Тайнопись осуществляется самыми различными способами. Общей чертой этих способов является то, что скрываемое сообщение встраивается в некоторый безобидный, не привлекающий внимание объект. Затем этот объект открыто транспортируется адресату. При криптографии наличие шифрованного сообщения само по себе привлекает внимание противников, при стеганографии же наличие скрытой связи остается незаметным.

В прошлом веке широко использовались так называемые симпатические чернила, невидимые при обычных условиях. Скрытое сообщение размещали в определенные буквы невинных словосочетаний, передавали при помощи внесения в текст незначительных стилистических, орфографических или пунктуационных погрешностей. С изобретением фотографии появилась технология микрофотоснимков, успешно применяемая Германией во время мировых войн. Крапление карт шулерами – это тоже пример стеганографии.

Во время Второй мировой войны правительством США придавалось большое значение борьбе против тайных методов передачи информации. Были введены определенные ограничения на почтовые отправления. Так, не принимались письма и телеграммы, содержащие кроссворды, ходы шахматных партий, поручения о вручении цветов с указанием времени и их вида; у пересылаемых часов переводились стрелки. Был привлечен многочисленный отряд цензоров, которые занимались даже перефразированием телеграмм без изменения их смысла.

Скрытие информации перечисленными методами возможно лишь благодаря тому, что противнику неизвестен метод скрытия. Между тем, еще в 1883 году Кергофф писал о том, что система защиты информации должна обеспечивать свои функции даже при полной информированности противника о ее структуре и алгоритмах функционирования. Вся секретность системы защиты передаваемой сведений должна заключаться в ключе, то есть в предварительно (как правило) разделенном между адресатами фрагменте информации. Несмотря на то, что этот принцип известен уже более 100 лет, и сейчас встречаются разработки, пренебрегающие им. Конечно, они не могут применяться в серьезных целях.

Развитие средств вычислительной техники в последнее десятилетие дало новый толчок для развития компьютерной стеганографии. Появилось много новых областей применения. Сообщения встраивают теперь в цифровые данные, как правило, имеющие аналоговую природу. Это – речь, аудиозаписи, изображения, видео. Известны также предложения по встраивании информации в текстовые файлы и в исполняемые файлы программ.

Существуют два основных направления в компьютерной стеганографии: связанный с цифровой обработкой сигналов и не связанный. В последнем случае сообщения могут быть встроены в заголовки файлов, заголовки пакетов данных. Это направление имеет ограниченное применение в связи с относительной легкостью вскрытия и/или уничтожения скрытой информации. Большинство текущих исследований в области стеганографии так или иначе связаны с цифровой обработкой сигналов. Это позволяет говорить о цифровой стеганографии. 

Можно выделить две причины популярности исследований в области стеганографии в настоящее время: ограничение на использование криптосредств в ряде стран мира и появление проблемы защиты прав собственности на информацию, представленную в цифровом виде. Первая причина повлекла за собой большое количество исследований в духе классической стеганографии (то есть скрытия факта передачи информации), вторая – еще более многочисленные работы в области так называемых водяных знаков. Цифровой водяной знак (ЦВЗ) – специальная метка, незаметно внедряемая в изображение или другой сигнал с целью тем или иным образом контролировать его использование.

Стеганография является эффективным программно-техническим методом сокрытия данных и защиты их от несанкционированного доступа. Но все же это лишь один из способов защиты информации. Эффективное использование стеганографии совместно с другими методами защиты информации обеспечит многоуровневую безопасность.







































І .ОСНОВНАЯ ЧАСТЬ

1. ТЕОРЕТИЧЕСКОЕ ОБОСНОВАНИЕ

1.1 Основные положения стеганографии

Интерес к стеганографии появился в последнее десятилетие и вызван широким распространением мультимедийных технологий. Методы стеганографии позволяют не только скрытно передавать данные, но и решать задачи помехоустойчивой аутентификации, защиты информации от несанкционированного копирования, отслеживания распространения информации по сетям связи, поиска информации в мультимедийных базах данных.

Международные симпозиумы по скрытию данных проводятся с 1996 года, по стеганографии первый симпозиум состоялся в июле 2002 года. Стеганография – быстро и динамично развивающаяся наука, использующая методы и достижения криптографии, цифровой обработки сигналов, теории связи и информации.

Стеганография занимает свою нишу в обеспечении безопасности: она не заменяет, а дополняет криптографию. Сокрытие сообщения методами стеганографии значительно снижает вероятность обнаружения самого факта передачи сообщения. А если это сообщение к тому же зашифровано, то оно имеет еще один, дополнительный, уровень защиты. 

В настоящее время в связи с бурным развитием вычислительной техники и новых каналов передачи информации появились новые стеганографические методы, в основе которых лежат особенности представления информации в компьютерных файлах, вычислительных сетях и т. п. Это дает возможность говорить о становлении нового направления - компьютерной стеганографии.

Термины и определения

Несмотря на то, что стеганография как способ сокрытия секретных данных известна уже на протяжении тысячелетий, компьютерная стеганография - молодое и развивающееся направление. 

Как и любое новое направление, компьютерная стеганография, несмотря на большое количество открытых публикаций и ежегодные конференции, долгое время не имела единой терминологии. Позднее, на конференции Information Hiding: First Information Workshop в 1996 году было предложено использовать единую терминологию и обговорены основные термины.

Стеганографическая система или стегосистема - совокупность средств и методов, которые используются для формирования скрытого канала передачи информации.

При построении стегосистемы должны учитываться следующие положения: 

противник имеет полное представление о стеганографической системе и деталях ее реализации. Единственной информацией, которая остается неизвестной потенциальному противнику, является ключ, с помощью которого только его держатель может установить факт присутствия и содержание скрытого сообщения; 

если противник каким-то образом узнает о факте существования скрытого сообщения, это не должно позволить ему извлечь подобные сообщения в других данных до тех пор, пока ключ хранится в тайне; 

потенциальный противник должен быть лишен каких-либо технических и иных преимуществ в распознавании или раскрытии содержания тайных сообщений.



Рисунок 1. Обобщенная модель стегосистемы.

В качестве данных может использоваться любая информация: текст, сообщение, изображение и т. д. 

В общем же случае целесообразно использовать слово "сообщение", так как сообщением может быть как текст или изображение, так и, например, аудиоданные.

Контейнер - любая информация, предназначенная для сокрытия тайных сообщений. 

Пустой контейнер - контейнер без встроенного сообщения; заполненный контейнер или стегоконтейнер, содержащий встроенную информацию. 

Встроенное (скрытое) сообщение - сообщение, встраиваемое в контейнер. 

Стеганографический канал или просто стегоканал - канал передачи стего. 

Стегоключ или просто ключ - секретный ключ, необходимый для сокрытия информации. В зависимости от количества уровней защиты (например, встраивание предварительно зашифрованного сообщения) в стегосистеме может быть один или несколько стегоключей. 

По аналогии с криптографией, по типу стегоключа стегосистемы можно подразделить на два типа: 

с секретным ключом; 

с открытым ключом. 

В стегосистеме с секретным ключом используется один ключ, который должен быть определен либо до начала обмена секретными сообщениями, либо передан по защищенному каналу. 

В стегосистеме с открытым ключом для встраивания и извлечения сообщения используются разные ключи, которые различаются таким образом, что с помощью вычислений невозможно вывести один ключ из другого. Поэтому один ключ (открытый) может передаваться свободно по незащищенному каналу связи. Кроме того, данная схема хорошо работает и при взаимном недоверии отправителя и получателя. 



Требования

Любая стегосистема должна отвечать следующим требованиям: 

Свойства контейнера должны быть модифицированы, чтобы изменение невозможно было выявить при визуальном контроле. Это требование определяет качество сокрытия внедряемого сообщения: для обеспечения беспрепятственного прохождения стегосообщения по каналу связи оно никоим образом не должно привлечь внимание атакующего. 

Стегосообщение должно быть устойчиво к искажениям, в том числе и злонамеренным. В процессе передачи изображение (звук или другой контейнер) может претерпевать различные трансформации: уменьшаться или увеличиваться, преобразовываться в другой формат и т. д. Кроме того, оно может быть сжато, в том числе и с использованием алгоритмов сжатия с потерей данных. 

Для сохранения целостности встраиваемого сообщения необходимо использование кода с исправлением ошибки. 

Для повышения надежности встраиваемое сообщение должно быть продублировано. 

Приложения

В настоящее время можно выделить три тесно связанных между собой и имеющих одни корни направления приложения стеганографии: сокрытие данных (сообщений), цифровые водяные знаки и заголовки. 

Сокрытие внедряемых данных, которые в большинстве случаев имеют большой объем, предъявляет серьезные требования к контейнеру: размер контейнера в несколько раз должен превышать размер встраиваемых данных. 

Цифровые водяные знаки используются для защиты авторских или имущественных прав на цифровые изображения, фотографии или другие оцифрованные произведения искусства. Основными требованиями, которые предъявляются к таким встроенным данным, являются надежность и устойчивость к искажениям. 

Цифровые водяные знаки имеют небольшой объем, однако, с учетом указанных выше требований, для их встраивания используются более сложные методы, чем для встраивания просто сообщений или заголовков. 

Третье приложение, заголовки, используется в основном для маркирования изображений в больших электронных хранилищах (библиотеках) цифровых изображений, аудио и видеофайлов. 

В данном случае стеганографические методы используются не только для внедрения идентифицирующего заголовка, но и иных индивидуальных признаков файла. 

Внедряемые заголовки имеют небольшой объем, а предъявляемые к ним требования минимальны: заголовки должны вносить незначительные искажения и быть устойчивы к основным геометрическим преобразованиям. 



Ограничения

Каждое из перечисленных выше приложений требует определенного соотношения между устойчивостью встроенного сообщения к внешним воздействиям (в том числе и стегоанализу) и размером самого встраиваемого сообщения. 

Для большинства современных методов, используемых для сокрытия сообщения в цифровых контейнерах, имеет место следующая зависимость надежности системы от объема встраиваемых данных (рис. 2). 



Рисунок 2. Зависимость надежности системы от объема встраиваемых данных

Данная зависимость показывает, что при увеличении объема встраиваемых данных снижается надежность системы (при неизменности размера контейнера). Таким образом, используемый в стегосистеме контейнер накладывает ограничения на размер встраиваемых данных. 

Контейнеры

Существенное влияние на надежность стегосистемы и возможность обнаружения факта передачи скрытого сообщения оказывает выбор контейнера. 

По протяженности контейнеры можно подразделить на два типа: непрерывные (потоковые) и ограниченной (фиксированной) длины. Особенностью потокового контейнера является то, что невозможно определить его начало или конец. Более того, нет возможности узнать заранее, какими будут последующие шумовые биты, что приводит к необходимости включать скрывающие сообщение биты в поток в реальном масштабе времени, а сами скрывающие биты выбираются с помощью специального генератора, задающего расстояние между последовательными битами в потоке. 

В непрерывном потоке данных самая большая трудность для получателя - определить, когда начинается скрытое сообщение. При наличии в потоковом контейнере сигналов синхронизации или границ пакета, скрытое сообщение начинается сразу после одного из них. В свою очередь, для отправителя возможны проблемы, если он не уверен в том, что поток контейнера будет достаточно долгим для размещения целого тайного сообщения. 

При использовании контейнеров фиксированной длины отправитель заранее знает размер файла и может выбрать скрывающие биты в подходящей псевдослучайной последовательности. С другой стороны, контейнеры фиксированной длины, как это уже отмечалось выше, имеют ограниченный объем и иногда встраиваемое сообщение может не поместиться в файл-контейнер. 

Другой недостаток заключается в том, что расстояния между скрывающими битами равномерно распределены между наиболее коротким и наиболее длинным заданными расстояниями, в то время как истинный случайный шум будет иметь экспоненциальное распределение длин интервала. Конечно, можно породить псевдослучайные экспоненциально распределенные числа, но этот путь обычно слишком трудоемок. Однако на практике чаще всего используются именно контейнеры фиксированной длины, как наиболее распространенные и доступные. 

Возможны следующие варианты контейнеров: 

Контейнер генерируется самой стегосистемой.

Контейнер выбирается из некоторого множества контейнеров. В этом случае генерируется большое число альтернативных контейнеров, чтобы затем выбрать наиболее подходящий для сокрытия сообщения. Такой подход можно назвать селектирующей стеганографией. В данном случае при выборе оптимального контейнера из множества сгенерированных важнейшим требованием является естественность контейнера. Единственной же проблемой остается то, что даже оптимально организованный контейнер позволяет спрятать незначительное количество данных при очень большом объеме самого контейнера. 

Контейнер поступает извне. В данном случае отсутствует возможность выбора контейнера и для сокрытия сообщения берется первый попавшийся контейнер, не всегда подходящий к встраиваемому сообщению. Методы

В настоящее время существует достаточно много различных методов (и их вариантов) встраивания сообщений (имеется в виду и встраивание цифровых водяных знаков).

Методы сокрытия информации

В настоящее время наиболее распространенным, но наименее стойким является метод замены наименьших значащих битов или LSB-метод. Он заключается в использовании погрешности дискретизации, которая всегда существует в оцифрованных изображениях или аудио- и видеофайлах. Данная погрешность равна наименьшему значащему разряду числа, определяющему величину цветовой составляющей элемента изображения (пикселя). Поэтому модификация младших битов в большинстве случаев не вызывает значительной трансформации изображения и не обнаруживается визуально.

Другим популярным методом встраивания сообщений является использование особенностей форматов данных, использующих сжатие с потерей данных (например JPEG). Этот метод (в отличии от LSB) более стоек к геометрическим преобразованиям и обнаружению канала передачи, так как имеется возможность в широком диапазоне варьировать качество сжатого изображения, что делает невозможным определение происхождения искажения. 

Для встраивания цифровых водяных знаков используются более сложные методы. 

Цифровые водяные знаки.

В современных системах формирования цифровых водяных знаков используется принцип встраивания метки, являющейся узкополосным сигналом, в широком диапазоне частот маркируемого изображения. Указанный метод реализуется при помощи двух различных алгоритмов и их возможных модификаций. В первом случае информация скрывается путем фазовой модуляции информационного сигнала (несущей) с псевдослучайной последовательностью чисел. Во втором - имеющийся диапазон частот делится на несколько каналов и передача производится между этими каналами. Относительно исходного изображения метка является некоторым дополнительным шумом, но так как шум в сигнале присутствует всегда, его незначительное возрастание за счет внедрения метки не дает заметных на глаз искажений. Кроме того, метка рассеивается по всему исходному изображению, в результате чего становится более устойчивой к вырезанию. 

1.2 Встраивание сообщений в незначащие элементы контейнера

Цифровые изображения представляют собой матрицу пикселов. Пиксель – это единичный элемент изображения. Он   имеет   фиксированную

разрядность двоичного представления. Например, пиксели полутонового изображения кодируются 8 битами (значения яркости изменяются от 0 до 255).

Младший значащий бит (LSB) изображения несет в себе меньше всего информации. Известно, что человек обычно не способен заметить изменение в этом бите. Фактически, он является шумом. Поэтому его можно использовать для встраивания информации. Таким образом, для полутонового изображения объем встраиваемых данных может составлять 1/8 объема контейнера. Например, в изображение размером 512х512 можно встроить 32 килобайта информации. Если модифицировать два младших бита (что также почти незаметно), то можно скрытно передать вдвое больший объем данных.

Достоинства рассматриваемого метода заключаются в его простоте и сравнительно большом объеме встраиваемых данных. Однако, он имеет серьезные недостатки. Во-первых, скрытое сообщение легко разрушить. Во-вторых, не обеспечена секретность встраивания информации. Нарушителю точно известно местоположение всего ЦВЗ. Для преодоления последнего недостатка было предложено встраивать ЦВЗ не во все пикселы изображения, а лишь в некоторые из них, определяемые по псевдослучайному закону в соответствии с ключом, известному только законному пользователю. Пропускная способность при этом уменьшается.

Рассмотрим подробнее вопрос выбора пикселов изображения для встраивания в них скрытого сообщения.

В процессе работы отмечается неслучайный характер поведения младшего значащего бита изображений. Скрываемое сообщение не должно изменять статистики изображения. Для этого, в принципе возможно, располагая достаточно большим количеством незаполненных контейнеров, подыскать наиболее подходящий. Теоретически возможно найти контейнер, уже содержащий в себе наше сообщение при данном ключе. Тогда изменять вообще ничего не надо, и вскрыть факт передачи будет невозможно. Эту ситуацию можно сравнить с применением одноразового блокнота в криптографии. Метод выбора подходящего контейнера требует выполнения большого количества вычислений и обладает малой пропускной способностью.

Альтернативным подходом является моделирование характеристик поведения LSB. Встраиваемое сообщение будет в этом случае частично или полностью зависеть от контейнера. Процесс моделирования является вычислительно трудоемким, кроме того, его надо повторять для каждого контейнера. Главным недостатком этого метода является то, что процесс моделирования может быть повторен нарушителем, возможно обладающим большим вычислительным ресурсом, создающим лучшие модели, что приведет к обнаружению скрытого сообщения. Это противоречит требованию о независимости безопасности стегосистемы от вычислительной мощности сторон. Кроме того, для обеспечения скрытности, необходимо держать используемую модель шума в тайне. А как нам уже известно, нарушителю неизвестен должен быть лишь ключ.

В силу указанных трудностей на практике обычно ограничиваются поиском пикселов, модификация которых не вносит заметных искажений в изображение. Затем из этих пикселов в соответствии с ключом выбираются те, которые будут модифицироваться. Скрываемое сообщение шифруется с применением другого ключа. Этот этап может быть дополнен предварительной компрессией для уменьшения объема сообщения.

1.3 Стеганографические протоколы

Важное значение для достижения целей стеганографии имеют протоколы.Под протоколом понимается порядок действий, предпринимаемых двумя или более сторонами, предназначенный для решения определенной задачи. Можно разработать исключительно эффективный алгоритм скрытия информации, но из-за его неправильного применения не добиться своей цели. И протокол и алгоритм есть некоторая последовательность действий. Различие заключается в том, что в протокол должны быть обязательно вовлечены двое или более сторон. При этом предполагается, что участники принимают на себя обязательство следовать протоколу. Также как и алгоритм, протокол состоит из шагов. На каждом шаге протокола выполняются некоторые действия, которые могут заключаться, например, в производстве каких-то вычислений, или осуществлении некоторых действий.

Основные стеганографические протоколы:

Стеганография с открытым ключом. Понятие «открытый ключ» означает, что для дешифровки сообщения используется другой ключ, чем при его шифровании. При этом один из ключей делается общедоступным, открытым. Криптографическая система с открытым ключом используется, например, при цифровой подписи. При этом сообщение подписывается закрытым ключом, и любой, имеющий  соответствующий открытый ключ, может удостовериться в ее подлинности. При шифровании данных используют обратный порядок: сообщение подписывается открытым ключом, а прочитать его может лишь имеющий соответствующий закрытый ключ. Естественно, что из открытого ключа никакими способами нельзя получить закрытый ключ (в вычислительном смысле).

Обнаружение ЦВЗ с нулевым знанием. Робастные ЦВЗ могут применяться в различных приложениях, соответственно, и требования к ним могут предъявляться различные. Можно выделить следующие категории требований к робастным ЦВЗ:

	ЦВЗ обнаруживается всеми желающими. В этом случае он служит для уведомления о собственнике защищаемого контента и для предотвращения непреднамеренного нарушения прав собственника.

	ЦВЗ обнаруживается, по крайней мере, одной стороной. В этом случае его использование связано с поиском нелегально распространяемых копий, например, в сети Интернет.

	ЦВЗ крайне трудно модифицировать или извлечь из контента. В этом случае ЦВЗ служит для аутентификации.

	1.4 Практические вопросы встраивания данных

Часто используют следующий принцип встраивания данных. Пусть сигнал контейнера представлен последовательностью из n бит. Процесс скрытия информации начинается с определения бит контейнера, которые можно изменять без внесения заметных искажений - стегопути. Далее среди этих бит обычно в соответствии с ключом выбираются биты, заменяемые битами ЦВЗ.

Возможные способы внедрения в контейнер битов ЦВЗ.

	1)Инверсия бита. Значения битов стегопути заменяются на противоположные. При этом «1» может соответствовать замена 0>1, «0» -замена 1>0.

	Вставка бита. Перед битом стегопути вставляется бит ЦВЗ. При этом значение бита ЦВЗ должно быть противоположно значению бита контейнера.

	Удаление бита. Выбираются пары «01» или «10» битов стегопути, соответствующие разным значениям бита ЦВЗ. Затем первый бит пары удаляется.

	Использование бита-флага. При этом на то, что очередной бит контейнера (неизменяемый!) является битом ЦВЗ указывает инверсия предшествующего бита-флага.

	Применение пороговых бит. Также как и в предыдущем методе используется бит-флаг. Однако, одному биту ЦВЗ соответствует несколько идущих следом за флагом бит (нечетное число). Если среди этих бит больше единиц, то бит ЦВЗ равен «1».

	Использование табличных значений. Для определения бита ЦВЗ в предыдущем методе, фактически, использовалась проверка на четность. С тем же успехом можно было бы применять и любое другое отображение множества бит в 1 бит, либо находить его значение по таблице.

	Динамически изменяемая таблица. Метод тот же, что и в предыдущем случае, но таблица изменяется на каждом шаге. Например, использованное значение из таблицы может быть заменено на случайное.

	Косвенная динамическая таблица. Так как табличные значения (биты контейнера) знает и кодер и декодер, то их можно не передавать.

	1.5 Практические оценки стойкости стегосистем.

Теоретические оценки стойкости стегосистем, например, теоретико-информационные, предполагают, что скрывающий информацию и нарушитель обладают неограниченными вычислительными ресурсами для построения стегосистем и, соответственно, стегоатак на них, придерживаются оптимальных стратегий скрывающего преобразования и стегоанализа, располагают бесконечным временем для передачи и обнару-жения скрываемых сообщений и т.д. Разумеется, такие идеальные модели скрывающего информацию и нарушителя неприменимы для реалий практических стегосистем. Поэтому рассмотрим известные к настоящему времени практические оценки стойкости некоторых стегосистем, реально используемых для скрытия информации.

В последние годы появились программно реализованные стегосистемы, обеспечивающие скрытие информации в цифровых видео- и аудиофайлах. Такие программы свободно распространяются, легко устанавливаются на персональные компьютеры, сопрягаются с современными информационными технологиями и не требуют специальной подготовки при их использовании. Они обеспечивают встраивание текста в изображение, изображение в изображение, текста в аудиосигнал и т.п. В современных телекоммуникационных сетях типа Интернет передаются очень большие потоки мультимедийных сообщений, которые потециально могут быть использованы для скрытия информации. Одной из наиболее актуальных и сложных проблем цифровой стеганографии является выявление факта такого скрытия. В реальных условиях наиболее типичным видом атаки нарушителя является атака только со стего, так как истинный контейнер ему обычно неизвестен. В этих условиях обнаружение скрытого сообщения возможно на основе выявления нарушений зависимостей, присущих естественным контейнерам. Практический стегоанализ цифровых стегосистем является очень молодой наукой, однако в его арсенале уже имеется ряд методов, позволяющих с высокой вероятностью обнаруживать факт наличия стегоканала, образованных некоторыми предложенными к настоящему времени стегосистемами. Среди методов практического стегоанализа существуют визуальная атака и ряд статистических атак. Эти атаки первоначально были предложены для выявления факта внедрения скрываемой информации в младшие разряды элементов контейнера, которые принято называть наименее значимыми битами (НЗБ).

	1.6 Скрытие данных в неподвижных изображениях.

Большинство исследований посвящено использованию в качестве стего-контейнеров изображений. Это обусловлено следующими причинами:

	существованием практически значимой задачей защиты фотографий,
картин, видео от незаконного тиражирования и распространения;

	относительно большим объемом цифрового представления изображений, что позволяет внедрять ЦВЗ большого объема либо повышать робастность внедрения;

	заранее известным размером контейнера, отсутствием ограничений, накладываемых требованиями реального времени;

	наличием в большинстве реальных изображений текстурных областей, имеющих шумовую структуру и хорошо подходящих для встраивания информации;

	слабой чувствительностью человеческого глаза к незначительным изменениям цветов изображения, его яркости, контрастности, содержанию в нем шума, искажениям вблизи контуров;

	хорошо разработанными в последнее время методами цифровой обработки изображений.

Последняя причина вызывает значительные трудности в обеспечении робастности ЦВЗ: чем более совершенными становятся методы сжатия, тем меньше остается возможностей для встраивания посторонней информации. Развитие теории и практики алгоритмов сжатия изображений привело к изменению представлений о технике внедрения ЦВЗ. Если первоначально предлагалось вкладывать информацию в незначащие биты для уменьшения визуальной заметности, то современный подход заключается во встраивании ЦВЗ в наиболее существенные области изображений, разрушение которых приведет к полной деградации самого изображения. Не случайно поэтому стегоалгоритмы учитывают свойства системы человеческого зрения (СЧЗ), аналогично алгоритмам сжатия изображений. В стегоалгоритмах зачастую используются те же преобразования, что и в современных алгоритмах сжатия (дискретное косинусное преобразование в JPEG, вейвлет-преобразование в JPEG2000). При этом существуют, очевидно, три возможности. Вложение информации может производиться в исходное изображение, либо одновременно с осуществлением сжатия изображения-контейнера, либо в уже сжатое алгоритмом JPEG изображение.

Выполнение линейных ортогональных преобразований изображений – вычислительно трудоемкий процесс, несмотря на наличие быстрых алгоритмов. Поэтому, в некоторых случаях можно ограничиться встраиванием информации в пространственной области изображения. Более эффективные стегоалгоритмы реализуют внедрение ЦВЗ в области преобразования.

	1.6.1 Обзор алгоритмов встраивания информации в изображения.

По способу встраивания информации стегоалгоритмы можно разделить на линейные (аддитивные), нелинейные и другие. Алгоритмы аддитивного внедрения информации заключаются в линейной модификации исходного изображения, а ее извлечение в декодере производится корреляционными методами. При этом ЦВЗ обычно складывается с изображением-контейнером, либо «вплавляется» (fusion) в него. В нелинейных методах встраивания информации используется скалярное либо векторное квантование. Среди других методов определенный интерес представляют методы, использующие идеи фрактального кодирования изображений.

Аддитивные алгоритмы. В аддитивных методах внедрения, ЦВЗ представляет собой последовательность чисел wi длины N, которая внедряется в выбранное подмножество отсчетов исходного изображения f . Основное и наиболее часто используемое выражение для встраивания информации в этом случае: f/(m,n) = f(m,n)(1 + αwi), где α - весовой коэффициент, а f/ - модифицированный пиксель изображения.

Алгоритм на основе слияния ЦВЗ и контейнера. Если вместо последовательности псевдослучайных чисел в изображение встраивается другое изображение (например, логотип фирмы), то соответствующие алгоритмы внедрения называются алгоритмами слияния. Размер внедряемого сообщения намного меньше размера исходного изображения. Перед встраиванием оно может быть зашифровано или преобразовано каким-нибудь иным образом. У таких алгоритмов есть два преимущества:

Во-первых, можно допустить некоторое искажение скрытого сообщения, так как человек все равно сможет распознать его.

Во-вторых, наличие внедренного логотипа является более убедительным доказательством прав собственности, чем наличие некоторого псевдослучайного числа.

Стеганографические методы на основе квантования. Под квантованием понимается процесс сопоставления большого (возможно и бесконечного) множества значений с некоторым конечным множеством чисел. При этом происходит уменьшение объема информации за счет ее искажения. Квантование находит применение в алгоритмах сжатия с потерями. Различают скалярное и векторное квантование. При векторном квантовании, в отличие от скалярного, происходит отображение не отдельно взятого отсчета, а их совокупности (вектора). Из теории информации известно, что векторное квантование эффективнее скалярного по степени сжатия, обладая большей сложностью. В стеганографии находят применение оба вида квантования.

Стегоалгоритмы, использующие фрактальное преобразование. Основная идея метода сжатия заключается в поиске последовательности афинных преобразований (поворот, сдвиг, масштабирование), позволяющих аппроксимировать блоки изображения малого размера (ранговые) блоками большего размера (доменами). То есть считается, что изображение самоподобно. Эта последовательность преобразований и передается декодеру. Будучи примененными к любому изображению, эти преобразования дают в результате искомое изображение. Фрактальное кодирование может рассматриваться, как разновидность векторного квантования, причем в качестве кодовой книги выступают различные преобразования.



	

	

	

	

	

	



ІІ. Практическая часть

1. Анализ технического задания

Актуальность программного продукта

Стеганографические системы активно используются для решения большого круга задач:

для защиты конфиденциальной информации от возможного саботажа, кражи или несанкционированного просмотра;

для преодоления систем мониторинга и управления сетевыми ресурсами;

при камуфлировании программного обеспечения. В случаях, когда использование программного обеспечения незарегистрированными пользователями является нежелательным, оно может быть закамуфлировано под стандартные программные продукты;

для защиты авторского права на некоторые виды интеллектуальной собственности. На компьютерные графические изображения наносится специальная метка, которая остается невидимой для глаз, но распознается специальным программным обеспечением.

	Кроме скрытой передачи сообщений, стеганография является одной из самых перспективных направлений, применяемых для аутентификации и маркировки авторской продукции. При этом, часто в качестве внедряемой информации используются дата и место создания продукта, данные об авторе, номер лицензии, серийный номер, дата истечения срока работы (удобно для распространения shareware-программ) и др. Эта информация обычно внедряется как в графические и аудио произведения так и в защищаемые программные продукты. Все внесенные сведения могут рассматриваться как веские доказательства при рассмотрении вопросов и судебных разбирательств об авторстве или для доказательства факта нелегального копирования, и часто имеют решающее значение.

	

	

1.2 Назначение программного продукта

	Программных продукт, применяются для целей стеганографии, реализующий средства внедрения секретных данных в графические файлы.

Данный программный продукт скрывает конфиденциальную информацию в изображениях, которые можно передавать по сети и в дальнейшем извлекать данную информацию. Применение продукта возможно на любом пользовательском компьютере.

	

	1.3 Принцип работы программного продукта

При реализации методов стеганографии на компьютере (компьютерная стеганография) определяющим фактором является выбор способа кодирования данных. Так же часто стараются придерживаться следующих принципов:

В качестве носителя скрытой информации должен выступать объект (файл), допускающий искажения собственной информации, не нарушающие его функциональность и суть. 

Внесенные искажения должны быть ниже уровня чувствительности средств распознавания.

В качестве носителя обычно используются файлы изображений или звуковые файлы. Скрываемое сообщение может быть простым набором чисел, изображением, простым или зашифрованным текстом.

При передаче объемных файлов (например по E-Mail или через интерактивные службы интернет – WWW и FTP) используются разнообразные методы сжатия, из которых для целей стеганографии предпочтительны те методы, которые обеспечивают сжатие без потерь, поскольку требуется точное восстановление спрятанных данных. Такие виды сжатия типичны для изображений в форматах GIF2, TIFF и BMP, а также звуковых форматов WAV, AU и др.

После запуска программы необходимо загрузить изображение (контейнер) в формате BMP. Далее необходимо ввести данные в текстовое поле, которые требуется зашифровать. После этого вводим ключ, известный отправителю и получателю и вшиваем информацию в изображение. Затем сохраняем изображение на носитель и отправляем его получателю.

1.4 Сфера применения разработанного программного продукта

В связи с возрастанием роли глобальных компьютерных сетей становится все более важным значение стеганографии. Анализ информационных источников компьютерной сети Internet позволяет сделать вывод, что в настоящее время стеганографические системы активно используются для решения следующих основных задач:

1.Защита конфиденциальной информации от несанкционированного доступа;

2.Преодоление систем мониторинга и управления сетевыми ресурсами;

3.Камуфлирования программного обеспечения;

4.Защита авторского права на некоторые виды интеллектуальной собственности.

Защита конфиденциальной информации от несанкционированного доступа

Это область использования КС является наиболее эффективной при решении проблемы защиты конфиденциальной информации. Так, например, только одна секунда оцифрованного звука с частотой дискретизации 44100 Гц и уровнем отсчета 8 бит в стерео режиме позволяет скрыть за счет замены наименее значимых младших разрядов на скрываемое сообщение около 10 Кбайт информации. При этом изменение значений отсчетов составляет менее 1%. Такое изменение практически не обнаруживается при прослушивании файла большинством людей.

Преодоление систем мониторинга и управления сетевыми ресурсами

Стеганографические методы, направленные на противодействие системам мониторинга и управления сетевыми ресурсами промышленного шпионажа, позволяют противостоять попыткам контроля над информационным пространством при прохождении информации через серверы управления локальных и глобальных вычислительных сетей.

Камуфлирование программного обеспечения (ПО)

Другой важной задачей стеганографии является камуфлирование ПО. В тех случаях, когда использование ПО незарегистрированными пользователями является нежелательным, оно может быть закамуфлировано под стандартные универсальные программные продукты (например, текстовые редакторы) или скрыто в файлах мультимедиа (например, в изображениях, входящих в пакет программы). 

Защита авторских прав

Еще одной областью использования стеганографии является защита авторского права от пиратства. На компьютерные графические изображения наносится специальная метка, которая остается невидимой для глаз, но распознается специальным ПО. Такое программное обеспечение уже используется в компьютерных версиях некоторых журналов. Данное направление стеганографии предназначено не только для обработки изображений, но и для файлов с аудио- и видеоинформацией и призвано обеспечить защиту интеллектуальной собственности.

Обоснование выбора средств разработки

Для достижения поставленной цели, в качестве среды разработки данной программы, несомненно, была выбрана система визуального программирования Borland Delphi 7.0, построенная на основе языка программирования Object Pascal.  Данная система была выбрана по нескольким критериям:

гибкость и надежность;

простота и ясность конструкции;

легкость реализации на современных компьютерах;

возможность достаточного контроля правильности программы, как на этапе компиляции, так и во время выполнения;

наличие набора структурных типов данных;

применение структурного программирования;

наличие средств связи разрабатываемой программы с сервером баз данных;

 Delphi компилирует проект намного быстрее остальных языков программирования, хотя  получаемые программные модули получаются большими размерами. В данной среде наиболее проработана справочная система и контекстная справка, что ускоряет написание программ. Наглядность и простота программ на Borland Delphi говорит сама за себя.

Преимущества Delphi по сравнению с другими программными продуктами. 

Быстрота разработки приложения. 

Высокая производительность разработанного приложения 

настоящий 32-битный код полученный в результате компиляции оптимизирующим компилятором. 

Hизкие требования разработанного приложения к ресурсам компьютера. 

Возможность полного доступа к функциям операционных систем Windows95 и Windows NT. 

Hаращиваемость за счет встраивания новых компонент и инструментов в среду Delphi. 

Возможность разработки новых компонент и инструментов собственными средствами Delphi (существующие компоненты и инструменты доступны в исходных текстах) 

Удачная проработка иерархии объектов 

Де-факто уже доступно огромное количество визуальных компонент третьих фирм, часть из которых freeware, часть shareware, часть - коммерческие 

Но основным преимуществом Delphi является его среда программирования с визуальным конструктором программ. Эта среда (вместе с объектной библиотекой VCL) позволяет эффективно программировать под MS Windows, не отвлекаясь на выяснение всех деталей WinAPI, а работать над логикой программы.

Delphi  — язык программирования, ранее известный как Object Pascal, разработанный фирмой Borland и изначально реализованный в её пакете Borland Delphi, от которого и получил в 2003 году своё нынешнее название. По сути, является наследником языка Pascal с объектно-ориентированными расширениями.

Среда разработки Delphi ориентирована, прежде всего, на создание программ для семейства операционных систем Windows. При этом большое внимание уделяется возможности визуальной разработки приложений с помощью большого набора готовых компонентов, а в стандартную поставку Delphi входят основные объекты, которые образуют удачно подобранную иерархию из 270 базовых классов, позволяющих избежать ручного кодирования. Эти компоненты охватывают практически все аспекты применения современных информационных технологий. 

Модульная структура программы

Модуль – это кусок программы, компилируемый  отдельно из остальных ее частей.



Ustenograf

TfrmStenograf.N20Click

TfrmStenograf.N25Click

TfrmStenograf.N21Click

TfrmStenograf.N18Click

TfrmStenograf.N30Clic

TfrmStenograf.N32Click

TfrmStenograf.N33Click

TfrmStenograf.N27Click

TfrmStenograf.Timer1Timer

TfrmStenograf.N38Click

TfrmStenograf.N39Click

TfrmStenograf.N26Click

GetStart

Picture.LoadFromFileМодульная структура – это структура модулей программ, находящихся в иерархической связи.





















	Разработка форм входных и выходных данных

4.1 Входные данные

Входные данные – это данные, которые позволяют получить выходные денные.

В разработанном программном продукте входными данными являются изображения, загружаемые пользователем, а также текстовая информация, которую необходимо скрыть.

4.2 Выходные данные

Выходные данные – это данные полученные путем преобразования входных данных в соответствии с устройством или программой. 

В разработанном программном продукте выходные данные получаются после сохранения изображения. Данные хранятся внутри объекта.

	Тестирование программного продукта

Тестирование программного продукта – это процесс выявления и отладки ошибок возникающих при разработки программного продукта. Целью тестирования является определения положительных и отрицательных сторон программного продукта. В ходе тестирования данного приложения (программы стегонаграфии) не было выявлено ни каких ошибок и искажений.

Тестирование ввода данных (при допустимых, не допустимых значениях)

В ходе тестирования на ввод данных не было выявлено никаких ошибок.

Тестирование выполнения основных функций программ

При нажатии кнопки «Текст->Загрузит текст » происходит открытие диалогового окна с возможностью выбор текстового файла. После выполнения данной операции содержимое файла отобразится в текстовом поле.

При нажатии кнопки «Текст->Сохранить текст» происходит открытие диалогового окна с возможностью сохранения текстового файла.

При нажатии кнопки « Изображение->Загрузить изображение» происходит открытие диалогового окна с возможностью выбора графического файла в формате BMP.

При нажатии кнопки «Изображение->Сохранить изображение» происходит открытие диалогового окна с возможностью сохранения изображения в одном из доступных форматов.

При нажатии кнопки «Изображение->Вшить информацию» происходит вшитие текстовой информации в графическое изображение.

При нажатии кнопки «Изображение->Извлечь информацию» происходит извлечение текстовой информации.

Разработка сопроводительных документов

Описание руководства программиста

Программный продукт устанавливается на компьютеры, которые участвуют в обмене конфиденциальной информации. Минимальные системные требования: необходима установка одной из операционных систем, таких как Windows 98 – Vista, Unix, Linux. После запуска программы необходимо открыть файл изображения в формате BMP.Далее необходимо либо с клавиатуры, либо путем открытия с помощью соответствующих кнопок на форме ввести в текстовое поле ту информацию, которую необходимо скрыть. После этого вводим ключ шифрования, который в свою очередь должен хранится в тайне и быть известен только участникам файлового обмена. Далее следует нажать кнопку «Изображение->Вшить информацию» информация будет сохранена в изображении. Затем следует сохранить графический файл на носитель. Процесс извлечения осуществляется в обратном порядке. В нижнем меню формы отображается информация о количестве набранных символов, максимальном количестве символов для открытого изображения и полный путь до файла  изображения.

6.2 Описание руководства пользователя

        Данный программный продукт создан для сокрытия конфиденциальной информации в графических файлах. 

Перед началом работы программа должна быть установлена на компьютере пользователей, участвующих в файловом обмене. После того как программа установлена, можно начинать работу. Для того чтобы запустить программу вам необходимо два раза кликнуть левой клавишей по значку программы(PStenografia.exe). Откроется форма, на которой располагаются кнопки управления  программой. При нажатии пункта контекстного меню «Текст->Загрузить текст» открывается диалоговое окно с возможностью открытия текстового файла. При нажатии пункта контекстного меню «Текст->Сохранить текст» открывается диалоговое окно с возможностью сохранения текстового файла.

Также  на форме расположены пункта контекстного меню « Изображение->Загрузить изображение» происходит открытие диалогового окна с возможностью выбора графического файла в формате BMP. После того как выбрана информация для сокрытия и соответствующее  количеству данных изображение, а также заполнено поле «Ключ» необходимо нажать в пункте контекстного меню «Изображение->Вшить информацию» происходит сокрытие текстовой информации в графическое изображение. Далее сохраняем его при помощи нажатия кнопки «Изображение->Сохранить изображение» происходит открытие диалогового окна с возможностью сохранения изображения в одном из доступных форматов.

В нижнем меню формы отображается информация о количестве набранных символов, максимальном количестве символов для открытого изображения и полный путь до файла  изображения. 

       Также в контекстном меню можно получить информацию «Об авторе» и «О программе», нажав команду «Справка» Для выхода из программы вы можете нажать на крестик, в верхнем правом углу, либо выбрать команду «Выход» в контекстном меню «Файл».







ЗАКЛЮЧЕНИЕ

Все большее значение в нашем быстро изменяющемся мире приобретает защита информации. Это относится и к государственным секретам, которые надо теперь скрывать не только от разведок известно каких стран мира, но и от внутренних врагов – агентов мирового терроризма и экстремизма. Это относится и к секретам фирм, и личным делам граждан. Последние изменения в законодательстве ряда стран, в том числе и США, показывают популярность на правительственном уровне идеи всеобщей слежки и непротивление ей граждан.

Отстоять свободу личности, самостоятельность фирмы, сохранить государственную тайну помогут, наряду с другими средствами, и стеганографические методы защиты информации. В развитии этих средств сделан пока лишь первый шаг, как в теоретическом, так и в практическом плане. Перечислим некоторые интересные задачи, решение которых поможет увеличить эффективность подобных средств.

Прежде всего, необходима разработка математических моделей мультимедийных контейнеров: речи, изображений, видео. Большой поток исследований в этой области, связанный с разработкой алгоритмов сжатия информации, не привел пока к появлению конструктивных универсальных моделей.

Важным представляется дальнейшее развитие методов теории распознавания образов. Особенно в свете появления таких новых математических инструментов, как нейронные сети, генетические алгоритмы, нечеткая логика.

Совершенствование методов встраивания информации будет выполняться за счет применения сигналов с расширенным спектром, помехоустойчивых кодов.

В стегоанализе необходимо введение в рассмотрение иных, чем всеми любимый хи-квадрат, критериев проверки статистических гипотез. Для тестирования качества последовательностей, генерируемых псевдослучайным генератором случайных чисел, в настоящее время известны десятки различных критериев. Возможно, многие из них найдут применение в стеганографии.

История показывает, что время прохождения технологии от ее зарождения до промышленного применения составляет обычно 20-25 лет. Если считать, что цифровая стеганография зародилась в середине 90-х годов прошлого века, то у нее все еще впереди.















































Список литературы

	1)В. Г. Грибунин, И. Н. Оков, И. В. Туринцев "Цифровая стеганография". Издательство СОЛОН-пресс 2002 год.

	2) Жельников В. Криптография от папируса до компьютера.- М., 1996.

  2) Карасев Андрей. Компьютерная тайнопись – графика и звук приобретают подтекст. – Мир ПК. - № 1/97. – С.132-134.

3) Шеннон К. Работы по теории информации и кибернетики / Пер. с англ. –М.: Иностранная литература, 1963. – 829с.

	4) Алферов А.П., Зубов А.Ю., Кузьмин А.С., Черемушкин А.В. Основы криптографии.–М.: Гелиус АРВ, 2001.– 480 с.

 5) http://www.cl.cam.ac.uk/~fapp2/steganography/

 6) http://www.demcom.com/english/steganos/ 

7) http://eprint.iacr.org/2005/305

8) http://www.topreferats.ru/comp/6636.html 

9) http://www.signumtech.com































ПРИЛОЖЕНИЕ А

unit UStenograf;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Buttons, ExtCtrls, ExtDlgs, Menus, ComCtrls, XPMan;



type

  TfrmStenograf = class(TForm)

    Memo1: TMemo;

    Image1: TImage;

    OpenPictureDialog1: TOpenPictureDialog;

    Edit1: TEdit;

    Label2: TLabel;

    SavePictureDialog1: TSavePictureDialog;

    MainMenu1: TMainMenu;

    PopupMenu1: TPopupMenu;

    PopupMenu2: TPopupMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    N6: TMenuItem;

    N7: TMenuItem;

    N8: TMenuItem;

    N9: TMenuItem;

    N10: TMenuItem;

    N11: TMenuItem;

    N12: TMenuItem;

    N13: TMenuItem;

    N14: TMenuItem;

    N15: TMenuItem;

    N16: TMenuItem;

    N17: TMenuItem;

    N18: TMenuItem;

    N19: TMenuItem;

    N20: TMenuItem;

    N21: TMenuItem;

    N22: TMenuItem;

    N23: TMenuItem;

    N24: TMenuItem;

    N25: TMenuItem;

    N26: TMenuItem;

    N27: TMenuItem;

    N28: TMenuItem;

    N29: TMenuItem;

    N30: TMenuItem;

    N31: TMenuItem;

    N32: TMenuItem;

    N33: TMenuItem;

    N34: TMenuItem;

    N35: TMenuItem;

    N36: TMenuItem;

    OpenDialog1: TOpenDialog;

    SaveDialog1: TSaveDialog;

    N37: TMenuItem;

    N38: TMenuItem;

    N39: TMenuItem;

    StatusBar1: TStatusBar;

    Timer1: TTimer;

    XPManifest1: TXPManifest;

    procedure N18Click(Sender: TObject);

    procedure N20Click(Sender: TObject);

    procedure N21Click(Sender: TObject);

    procedure N25Click(Sender: TObject);

    procedure N26Click(Sender: TObject);

    procedure N27Click(Sender: TObject);

    procedure N30Click(Sender: TObject);

    procedure N32Click(Sender: TObject);

    procedure N33Click(Sender: TObject);

    procedure N38Click(Sender: TObject);

    procedure N39Click(Sender: TObject);

    procedure N1Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure N6Click(Sender: TObject);

    procedure N7Click(Sender: TObject);

    procedure N8Click(Sender: TObject);

    procedure N11Click(Sender: TObject);

    procedure N12Click(Sender: TObject);

    procedure N13Click(Sender: TObject);

    procedure N15Click(Sender: TObject);

    procedure N16Click(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  frmStenograf: TfrmStenograf;

  X, Y: Word;





implementation



{$R *.dfm}



function GetStart(Str: String): Word;  //задать начальное значение генератора

Var i: byte;

  Res: Word;

begin

  Res:= 0;

  for i:= 1 to length(Str) do begin

    Res:= Res xor (Ord(Str[i]) shl 1); //Вычисляет значение простой хеш-функции (xor + циклический сдвиг) для блока данных.

  end;

  Result:= (Res mod frmStenograf.Image1.Width)+1;

end;



procedure TfrmStenograf.N18Click(Sender: TObject);

begin

  frmStenograf.Close;

end;



procedure TfrmStenograf.N20Click(Sender: TObject);

begin

  If OpenDialog1.Execute then

    Memo1.Lines.LoadFromFile(OpenDialog1.FileName);

end;



procedure TfrmStenograf.N21Click(Sender: TObject);

begin

  If SaveDialog1.Execute then

    Memo1.Lines.SaveToFile(SaveDialog1.FileName+'.txt');

end;



procedure TfrmStenograf.N25Click(Sender: TObject);

begin

  Memo1.CutToClipboard;

end;



procedure TfrmStenograf.N26Click(Sender: TObject);

begin

  Memo1.CopyToClipboard;

end;



procedure TfrmStenograf.N27Click(Sender: TObject);

begin

  Memo1.PasteFromClipboard;

end;



procedure TfrmStenograf.N30Click(Sender: TObject);

begin

  Memo1.SelectAll;

end;



procedure TfrmStenograf.N32Click(Sender: TObject); //загрузка картинки

Var i, j: Word;

  a: TColor;

  r, g, b: byte;

begin

  if OpenPictureDialog1.Execute then

  with Image1 do begin

    Visible:= False;

    Picture.LoadFromFile(OpenPictureDialog1.FileName);

    if Picture.Bitmap.PixelFormat < pf16bit then

      ShowMessage('Требуется большая глубина цвета')

    else

      for i:= 0 to Width-1 do

        for j:= 0 to Height-1 do begin

          a:= Canvas.Pixels[i, j];

          r:= GetRValue(a);

          if r = 255 then r:= 254;

          g:= GetGValue(a);

          if g = 255 then g:= 254;

          b:= GetBValue(a);

          if b = 255 then b:= 254;

          Canvas.Pixels[i, j]:= RGB(r, g, b);

        end;

    Visible:= True;

    Memo1.MaxLength:= Image1.Height-5;

  end;

end;



procedure TfrmStenograf.N33Click(Sender: TObject);

begin

  if SavePictureDialog1.Execute then

    Image1.Picture.SaveToFile(SavePictureDialog1.FileName);

end;



procedure TfrmStenograf.N38Click(Sender: TObject);  //вшить информацию в рисунок

Type TColoreArr= array[1..9] of byte;

Var i: Word;

  r, g, b: Integer;

  j: byte;

  Str: String;

  RedArr, GreenArr, BlueArr: TColoreArr;

  a: TColor;

begin

  X:= GetStart(Edit1.Text);

  Y:= 2;

  Str:= Memo1.Text;

  if length(Str) > Image1.Height-5 then ShowMessage('Маленькая картинка') else begin

    i:= 1;

    with Image1.Canvas do begin

      while length(Str) mod 3 <> 0 do Str:= Str + ' ';

      Pixels[x, y]:= RGB(length(Str) div 65536, (length(Str) mod 65536) div 255, (length(Str) mod 65536) mod 255);  //записали кол-во символов

      repeat

        X:= 2 + (106*X+1230) mod (Image1.Width-3); //генератор псевдослучайной последовательности

        Y:= Y + 3; //через три пикселя, для обеспечения размытия



        //размоем точки методотом луча

        a:= Pixels[X-1, Y];

        RedArr[1]:= GetRValue(a);

        GreenArr[1]:= GetGValue(a);

        BlueArr[1]:= GetBValue(a);

        a:= Pixels[X-1, Y+1];

        RedArr[2]:= GetRValue(a);

        GreenArr[2]:= GetGValue(a);

        BlueArr[2]:= GetBValue(a);

        a:= Pixels[X, Y+1];

        RedArr[3]:= GetRValue(a);

        GreenArr[3]:= GetGValue(a);

        BlueArr[3]:= GetBValue(a);

        a:= Pixels[X+1, Y+1];

        RedArr[4]:= GetRValue(a);

        GreenArr[4]:= GetGValue(a);

        BlueArr[4]:= GetBValue(a);

        a:= Pixels[X+1, Y];

        RedArr[5]:= GetRValue(a);

        GreenArr[5]:= GetGValue(a);

        BlueArr[5]:= GetBValue(a);

        a:= Pixels[X+1, Y-1];

        RedArr[6]:= GetRValue(a);

        GreenArr[6]:= GetGValue(a);

        BlueArr[6]:= GetBValue(a);

        a:= Pixels[X, Y-1];

        RedArr[7]:= GetRValue(a);

        GreenArr[7]:= GetGValue(a);

        BlueArr[7]:= GetBValue(a);

        a:= Pixels[X-1, Y-1];

        RedArr[8]:= GetRValue(a);

        GreenArr[8]:= GetGValue(a);

        BlueArr[8]:= GetBValue(a);

        RedArr[9]:= ord(Str[i]);

        GreenArr[9]:= ord(Str[i+1]);

        BlueArr[9]:= ord(Str[i+2]);

        r:= 0;     //читаем информацию из соседних пикселей

        g:= 0;

        b:= 0;

        for j:= 1 to 9 do begin

          r:= (r + RedArr[j]);

          g:= (g + GreenArr[j]);

          b:= (b + BlueArr[j]);

        end;

        j:=1;

        while r mod 9 <> 0 do begin//добавим соседние точки до кратности 9

          Case j of

            1: begin

                 RedArr[1]:= RedArr[1]+1;

                 Pixels[X-1, Y+1]:= RGB(RedArr[1], GreenArr[1], BlueArr[1]);

                 j:= j+1;

              end;

            2: begin

                 RedArr[2]:= RedArr[2]+1;

                 Pixels[X-1, Y]:= RGB(RedArr[2], GreenArr[2], BlueArr[2]);

                 j:= j+1;

              end;

            3: begin

                 RedArr[3]:= RedArr[3]+1;

                 Pixels[X, Y+1]:= RGB(RedArr[3], GreenArr[3], BlueArr[3]);

                 j:= j+1;

              end;

            4: begin

                 RedArr[4]:= RedArr[4]+1;

                 Pixels[X+1, Y+1]:= RGB(RedArr[4], GreenArr[4], BlueArr[4]);

                 j:= j+1;

              end;

            5: begin

                 RedArr[5]:= RedArr[5]+1;

                 Pixels[X+1, Y]:= RGB(RedArr[5], GreenArr[5], BlueArr[5]);

                 j:= j+1;

              end;

            6: begin

                 RedArr[6]:= RedArr[6]+1;

                 Pixels[X+1, Y-1]:= RGB(RedArr[6], GreenArr[6], BlueArr[6]);

                 j:= j+1;

              end;

            7: begin

                 RedArr[7]:= RedArr[7]+1;

                 Pixels[X, Y-1]:= RGB(RedArr[7], GreenArr[7], BlueArr[7]);

                 j:= j+1;

              end;

            8: begin

                 RedArr[8]:= RedArr[8]+1;

                 Pixels[X-1, Y-1]:= RGB(RedArr[8], GreenArr[8], BlueArr[8]);

                 j:= j+1;

              end;

          end;

          r:= r+1;

        end;

        j:=1;

        while g mod 9 <> 0 do begin

          Case j of

            1: begin

                 GreenArr[1]:= GreenArr[1]+1;

                 Pixels[X-1, Y+1]:= RGB(RedArr[1], GreenArr[1], BlueArr[1]);

                 j:= j+1;

              end;

            2: begin

                 GreenArr[2]:= GreenArr[2]+1;

                 Pixels[X-1, Y]:= RGB(RedArr[2], GreenArr[2], BlueArr[2]);

                 j:= j+1;

              end;

            3: begin

                 GreenArr[3]:= GreenArr[3]+1;

                 Pixels[X, Y+1]:= RGB(RedArr[3], GreenArr[3], BlueArr[3]);

                 j:= j+1;

              end;

            4: begin

                 GreenArr[4]:= GreenArr[4]+1;

                 Pixels[X+1, Y+1]:= RGB(RedArr[4], GreenArr[4], BlueArr[4]);

                 j:= j+1;

              end;

            5: begin

                 GreenArr[5]:= GreenArr[5]+1;

                 Pixels[X+1, Y]:= RGB(RedArr[5], GreenArr[5], BlueArr[5]);

                 j:= j+1;

              end;

            6: begin

                 GreenArr[6]:= GreenArr[6]+1;

                 Pixels[X+1, Y-1]:= RGB(RedArr[6], GreenArr[6], BlueArr[6]);

                 j:= j+1;

              end;

            7: begin

                 GreenArr[7]:= GreenArr[7]+1;

                 Pixels[X, Y-1]:= RGB(RedArr[7], GreenArr[7], BlueArr[7]);

                 j:= j+1;

              end;

            8: begin

                 GreenArr[8]:= GreenArr[8]+1;

                 Pixels[X-1, Y-1]:= RGB(RedArr[8], GreenArr[8], BlueArr[8]);

                 j:= j+1;

              end;

          end;

          g:= g+1;

        end;

        j:=1;

        while b mod 9 <> 0 do begin

          Case j of

            1: begin

                 BlueArr[1]:= BlueArr[1]+1;

                 Pixels[X-1, Y+1]:= RGB(RedArr[1], GreenArr[1], BlueArr[1]);

                 j:= j+1;

              end;

            2: begin

                 BlueArr[2]:= BlueArr[2]+1;

                 Pixels[X-1, Y]:= RGB(RedArr[2], GreenArr[2], BlueArr[2]);

                 j:= j+1;

              end;

            3: begin

                 BlueArr[3]:= BlueArr[3]+1;

                 Pixels[X, Y+1]:= RGB(RedArr[3], GreenArr[3], BlueArr[3]);

                 j:= j+1;

              end;

            4: begin

                 BlueArr[4]:= BlueArr[4]+1;

                 Pixels[X+1, Y+1]:= RGB(RedArr[4], GreenArr[4], BlueArr[4]);

                 j:= j+1;

              end;

            5: begin

                 BlueArr[5]:= BlueArr[5]+1;

                 Pixels[X+1, Y]:= RGB(RedArr[5], GreenArr[5], BlueArr[5]);

                 j:= j+1;

              end;

            6: begin

                 BlueArr[6]:= BlueArr[6]+1;

                 Pixels[X+1, Y-1]:= RGB(RedArr[6], GreenArr[6], BlueArr[6]);

                 j:= j+1;

              end;

            7: begin

                 BlueArr[7]:= BlueArr[7]+1;

                 Pixels[X, Y-1]:= RGB(RedArr[7], GreenArr[7], BlueArr[7]);

                 j:= j+1;

              end;

            8: begin

                 BlueArr[8]:= BlueArr[8]+1;

                 Pixels[X-1, Y-1]:= RGB(RedArr[8], GreenArr[8], BlueArr[8]);

                 j:= j+1;

              end;

          end;

          b:= b+1;

        end;

        r:= r div 9;

        g:= g div 9;

        b:= b div 9;

        //закончили размытие точки

        Image1.Canvas.Pixels[x, y]:= RGB(r, g, b);  //в каждый пиксель помещаем три символа текста

        i:= i+3;

      Until i = length(Str)+1;

    end;

  end;

  Image1.Repaint;

end;



procedure TfrmStenograf.N39Click(Sender: TObject); //вытащить информацию из рисунка

Type TColoreArr= array[1..8] of byte;

Var a: TColor;

  RedArr, GreenArr, BlueArr: TColoreArr;

  r, g, b: Integer;

  j: byte;

  i: LongWord;

  Str: String;

begin

  X:= GetStart(Edit1.Text);

  Y:= 2;

  Str:= '';

  a:= Image1.Canvas.Pixels[X, Y];

  i:= GetRValue(a)*65536 + GetGValue(a)*255 + GetBValue(a); //считываем длину текста

    repeat

      X:= 2 + (106*X+1230) mod (Image1.Width-3); //генератор псевдослучайной последовательности

      Y:= Y + 3;

      with Image1.Canvas do begin

        // устраним размытие точки

        a:= Pixels[X-1, Y];

        RedArr[1]:= GetRValue(a);

        GreenArr[1]:= GetGValue(a);

        BlueArr[1]:= GetBValue(a);

        a:= Pixels[X-1, Y+1];

        RedArr[2]:= GetRValue(a);

        GreenArr[2]:= GetGValue(a);

        BlueArr[2]:= GetBValue(a);

        a:= Pixels[X, Y+1];

        RedArr[3]:= GetRValue(a);

        GreenArr[3]:= GetGValue(a);

        BlueArr[3]:= GetBValue(a);

        a:= Pixels[X+1, Y+1];

        RedArr[4]:= GetRValue(a);

        GreenArr[4]:= GetGValue(a);

        BlueArr[4]:= GetBValue(a);

        a:= Pixels[X+1, Y];

        RedArr[5]:= GetRValue(a);

        GreenArr[5]:= GetGValue(a);

        BlueArr[5]:= GetBValue(a);

        a:= Pixels[X+1, Y-1];

        RedArr[6]:= GetRValue(a);

        GreenArr[6]:= GetGValue(a);

        BlueArr[6]:= GetBValue(a);

        a:= Pixels[X, Y-1];

        RedArr[7]:= GetRValue(a);

        GreenArr[7]:= GetGValue(a);

        BlueArr[7]:= GetBValue(a);

        a:= Pixels[X-1, Y-1];

        RedArr[8]:= GetRValue(a);

        GreenArr[8]:= GetGValue(a);

        BlueArr[8]:= GetBValue(a);

        r:= 0;     //читаем информацию из соседних пикселей

        g:= 0;

        b:= 0;

        for j:= 1 to 8 do begin

          r:= (r + RedArr[j]);

          g:= (g + GreenArr[j]);

          b:= (b + BlueArr[j]);

        end;

      end;

      //устранили размытость

      a:= Image1.Canvas.Pixels[X, Y]; //читаем информацию из пикселя

      r:= 9*GetRValue(a) - r;

      g:= 9*GetGValue(a) - g;

      b:= 9*GetBValue(a) - b;

      Str:= Str + chr(r);

      Str:= Str + chr(g);

      Str:= Str + chr(b);

      i:= i-3;

    Until i = 0;

  Memo1.Text:= Str;

end;



procedure TfrmStenograf.N1Click(Sender: TObject);

begin

  N20.Click;

end;



procedure TfrmStenograf.N2Click(Sender: TObject);

begin

  N21.Click;

end;



procedure TfrmStenograf.N6Click(Sender: TObject);

begin

  N25.Click;

end;



procedure TfrmStenograf.N7Click(Sender: TObject);

begin

  N26.Click;

end;



procedure TfrmStenograf.N8Click(Sender: TObject);

begin

  N27.Click;

end;



procedure TfrmStenograf.N11Click(Sender: TObject);

begin

  N30.Click;

end;



procedure TfrmStenograf.N12Click(Sender: TObject);

begin

  N32.Click;

end;



procedure TfrmStenograf.N13Click(Sender: TObject);

begin

  N33.Click;

end;



procedure TfrmStenograf.N15Click(Sender: TObject);

begin

  N38.Click;

end;



procedure TfrmStenograf.N16Click(Sender: TObject);

begin

  N39.Click;

end;



procedure TfrmStenograf.Timer1Timer(Sender: TObject);

begin

  StatusBar1.Panels[0].Text:= 'Символов набрано: ' + IntToStr(length(Memo1.Text));

  StatusBar1.Panels[1].Text:= 'Символов максимум: ' + IntToStr(Memo1.MaxLength);

  StatusBar1.Panels[2].Text:= 'Рабочий файл: ' + OpenPictureDialog1.FileName;

end;

end.



























ПРИОЖЕНИЕ Б





Рисунок 1. – форма 1 «Стегонаграфия» 







Рисунок 2. - форма 1 «Стегонаграфия»





28