КАФЕДРА ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

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

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

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

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

 
Выполнил студент группы 614-б Овчинников Денис Юрьевич Подпись:____________________ «____» _________________200_ г Руководитель курсового проекта: Леонова Марина Олеговна Подпись:____________________ «____» _________________200_ г Оценка:_____________________  


 

     

Смоленск

200 9

Оглавление

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

I. Основная часть………………………………………………………….….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

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

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

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

1.4 Сфера применения разработанного программного продукта.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 лет, и сейчас встречаются разработки, пренебрегающие им. Конечно, они не могут применяться в серьезных целях.

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

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

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

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

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

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

Требования

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

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

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

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

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

Приложения

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

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

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

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

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

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

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

Ограничения

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

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

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

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

Контейнеры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ЗАКЛЮЧЕНИЕ

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

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

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

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

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

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

История показывает, что время прохождения технологии от ее зарождения до промышленного применения составляет обычно 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}

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;

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;

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 «Стегонаграфия»

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

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

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

Дата: 2019-12-22, просмотров: 227.