Разработка программы цифровой стеганографии

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.02.2019
Размер файла 2,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Разработка программы цифровой стеганографии

Введение

цифровой стенография алгоритм программа

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

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

Целью курсовой работы является исследование и реализация метода наименьших значащих бит (LSB - Least Significant Bit), используя в качестве файла-контейнера растровое изображение формата BitMap.

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

1. Обзор литературы

1.1 Изображение BitMap

Основная информация

BMP (от англ. Bitmap Picture) - формат хранения растровых изображений, разработанный компанией Microsoft. Файлы формата BMP могут иметь расширения.bmp.dib и.rle.

С форматом BMP работает огромное количество программ, так как его поддержка интегрирована в операционные системы Windows и OS/2. Кроме того, данные этого формата включаются в двоичные файлы ресурсов RES и в PE-файлы.

В данном формате можно хранить только однослойные растры. На каждый пиксель в разных файлах может приходиться разное количество бит (глубина цвета). Microsoft предлагает битности 1, 2, 4, 8, 16, 24, 32, 48 и 64. В битностях 8 и ниже он указывается индексом из таблицы цветов (палитры), а при больших непосредственным значением. Цвет же в любом случае можно задать только в цветовой модели RGB (как при непосредственном указании в пикселе, так и в таблице цветов), но в битностях 16 и 32 можно получить Grayscale с глубиной до 16 и 32 бит соответственно. Частичная прозрачность реализована альфа-каналом различных битностей, но при этом прозрачность без градаций можно косвенно получить RLE-кодированием.

В большинстве случаев пиксели хранятся в виде относительно простого двумерного массива. Для битностей 4 и 8 доступно RLE-кодирование, которое может уменьшить их размер. Формат BMP также поддерживает встраивание данных в форматах JPEG и PNG. Но последнее скорее больше предназначено не для компактного хранения, а для обхода ограничений архитектуры GDI, которая не предусматривает прямую работу с изображениями отличных от BMP форматов.

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

Структура BitMap файла

Изображение формата BMP состоит из заголовка файла, информации об изображении и информации о палитре (таблица 1.1).

Таблица 1.1. Структура BMP файла

Смещение

Длина поля

Описание поля

Заголовок файла

0

2

Код 4D42h - Буквы 'BM'

2

4

Размер файла в байтах

6

2

0 (Резервное поле)

8

2

0 (Резервное поле)

10

4

Смещение, с которого начинается само изображение (растр)

Заголовок BitMap (Информация об изображении)

14

4

Размер заголовка BITMAP (в байтах) равно 40

18

4

Ширина изображения в пикселях

22

4

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

26

2

Число плоскостей, должно быть 1

28

2

Бит/пиксел: 1, 4, 8 или 24

30

4

Тип сжатия

34

4

0 или размер сжатого изображения в байтах

38

4

Горизонтальное разрешение, пиксел/м

42

4

Вертикальное разрешение, пиксел/м

46

4

Количество используемых цветов

50

4

Количество «важных» цветов

Палитра (Карта цветов для N цветов), если используется

54

4*N

Палитра

1.2 Метод наименьшего значащего бита

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

Суть метода заключается в следующем: допустим, имеется 8-битное изображение в градациях серого. 00h (00000000b) обозначает чёрный цвет, FFh (11111111b) - белый. Всего имеется 256 градаций (2^8). Также предположим, что сообщение состоит из 1 байта - например, 01101011b. При использовании 2 младших бит в описаниях пикселей, нам потребуется 4 пикселя. Допустим, они чёрного цвета. Тогда пиксели, содержащие скрытое сообщение, будут выглядеть следующим образом: 00000001 00000010 00000010 00000011. Тогда цвет пикселей изменится: первого - на 1/255, второго и третьего - на 2/255 и четвёртого - на 3/255. Такие градации, мало того, что незаметны для человека, могут вообще не отобразиться при использовании низкокачественных устройств вывода.

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

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

Все методы LSB являются, как правило, аддитивными (A17, L18D).

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

1.3 Классы

Класс - тип, сочетающий в себе абстрактные данные и методы. Экземпляр класса - объект. Он содержит конкретные данные.

Класс содержит в себе члены. Членом класса может быть:

а) поле (field) с данными. Согласно принятому соглашению имена полей начинают с буквы F;

б) свойство (property) для доступа к полям;

в) метод (процедура или функция), определяющее поведение объекта;

г) событие (event), на которые объект реагирует;

Члены класса могут группироваться. Группы регулируют видимость членов класса:

а) private - частные. Доступны внутри модуля, где они находятся;

б) protected - защищенные. Доступны внутри модуля, где они находятся, и для порожденных классов;

в) public - общедоступные. Доступны в любом месте программы, где доступен класс;

г) published - опубликованные. Дополнительно к public порождают информацию во время выполнения программы для проверок.

В классе-потомке можно изменять видимость свойств в сторону повышения. Например, свойство из раздела protected можно перенести в public, но не в private. Доступ к члену класса по составному имени: <Класс>.<Член класса>

Классы и объекты могут наследовать поля и методы у своих предков. Это означает, что эти поля и методы могут быть использованы так, будто они были включены в классы или объекты, объявляемые как потомки.

Классы FPC организованы иерархически. Верхушка иерархического дерева - абстрактный класс TObject, определенный в модуле System. В нем определены средства, необходимые всем классам: конструктор, деструктор и др.

1.4 Процедуры

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

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

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

1.5 Функции

Описание функции также состоит из заголовка и тела:

function имя_функции (список_формальных_параметров):тип_результата;

label

список_меток;

const

список_констант;

type

список_типов;

var

список_переменных;

begin

 // Тело функции.

end;

Заголовок функции содержит: служебное слово function, любои? допустимыи? в языке Free Pascal идентификатор - имя_функции; имена формальных параметров и их типы, разделе?нные точкои? с запятои? - список_формальных_параметров, тип возвращаемого функциеи? значения - тип_результата (функции могут возвращать скалярные значения целого, вещественного, логического, символьного или ссылочного типов).

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

Обращение к функции осуществляется по имени с указанием списка фактических параметров.

1.6 Циклы

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

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

Цикл FOR

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

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

Цикл WHILE

Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false - то нет.

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

1.7 Lazarus и FreePascal

Lazarus это бесплатный инструмент разработки с открытым кодом. IDE Lazarus представляет собой среду с графическим интерфейсом для быстрой разработки программ, аналогичную Delphi, и базируется на оригинальной кроссплатформенной библиотеке визуальных компонентов LCL (Lazarus Component Library), совместимых с VCL Delphi. В состав IDE входят и не визуальные компоненты. В принципе такого набора достаточно для создания программ с графическим интерфейсом и приложений, работающих с базами данных и Интернетом.

Free Pascal (полное название Free Pascal Compiler, часто используется сокращение FPC) - свободно распространяемый компилятор языка программирования Object Pascal.

Форма

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

Компоненты Lazarus

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

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

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

Компонент TLabel

Этот компонент позволяет отобразить текст на экране в виде надписи.

Компонент TEdit

С помощью этого компонента можно вводить и редактировать текст. Этот компонент носит также название однострочный редактор.

Кнопка TButton

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

В программе использовался компонент TButton.

Компонент TImage

Компонент Изображение (TImage) предназначен для вывода на форму графического рисунка. Он поддерживает многочисленные форматы графических файлов, включая.bmp.ico.jpg и т.д.

Компонент TTimer

С помощью таймера (Timer) можно запрограммировать выполнение определенного кода через равные интервалы времени. Когда таймер установлен на форме, система периодически генерирует событие OnTimer. Для пользователя таймер невидим.

Компонент TOpenDialog

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

Компонент TSaveDialog

Компонент TSaveDialog предназначен для последующего сохранения файла.

Компонент TBitMap

Класс TBitmap является основой растровой графики в Lazarus, он определяет класс изображений или битовых карт, где изображение задается цветами всех своих пикселей. Это единственный стандартный класс, который позволяет редактировать свое изображение: в программе - канва битовой карты доступна через свойство Canvas (другие потомки TGraphic канвы не имеют).

Компонент TProcess

Это класс позволяющий запускать процессы и управлять ими.

2. Алгоритм и описание программы

2.1 Алгоритм

Структуру программы можно разбить на несколько частей, а именно на хеширование введённого пользователем пароля, шифрование, дешифрование, запись файла из контейнера и извлечение файла из контейнера. Программа совместима с различными операционными системами, а именно с Windows и Unix подобными системами, такими как OS X и различными Linux дистрибутивами. Общий алгоритм работы программы представлен в виде блок-схемы (см. приложение А).

2.1.1 Функция хеширование пароля

Хеширование пароля осуществляется функцией TCreepy. HashIt.

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

Рисунок 1. Блок-схема функции хеширования пароля

Функция шифрования и дешифрования файла

Записываемый в контейнер файл шифруется введённым пользователем паролем с помощью алгоритма шифрования AES-256-CBC посредством криптографического пакета с открытым исходным кодом - OpenSSL. Несмотря на то, что данный алгоритм был скомпрометирован, а именно появился способ понизить его криптографическую стойкость ускорив подбор пароля в два раза, данный метод шифрования до сих пор является достаточно надежным, так как используя уязвимость AES данный алгоритм можно понизить максимум до AES-128-CBC. Подбор ключа AES-128 с помощью триллиона машин, которые способны обрабатывать миллиард комбинаций в секунду займет 2 миллиарда лет. Таким образом, можно сделать вывод, что выбор данного алгоритма шифрования для защиты информации является приемлемым. Вообще говоря, выбранный пользователем пароль является основным фактором криптографической стойкости скрываемой информации.

Шифрование файла осуществляется функцией TCreepy. Encrypt.

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

Рисунок 2. Блок-схема алгоритма шифрования файла

Дешифрование извлеченного из контейнера файла осуществляется функцией TCreepy. Decrypt.

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

Рисунок 3. Блок-схема алгоритма дешифрования файла

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

Загруженный пользователем файл шифруется с помощью функции TCreepy. Encrypt, создается новый файл с расширением - «.enc». Путь до полученного файла запоминается. Далее происходит считывание введенного пользователем пароля из поля Password. Text и выполняется его хеширование с помощью алгоритма MD5. Посредством потока данных и процедуры записи буфера в контейнер TStegano. WriteBufferToContainer, реализуется запись цифровой подписи, хеша пароля и зашифрованного файла в изображение-контейнер. Работа данного алгоритма подробно описана в блок-схеме (см. приложение Б).

Процедура извлечения файла из изображения-контейнера

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

Процедура записи данных из потока в контейнер

Процедура записи данных из потока TStegano. WriteBufferToContainer осуществляет поточное считывание информации и запись ее в наименьшие значащие биты пикселей растрового изображения BitMap (метод LSB), которое является контейнером. Работа данного алгоритма подробно описана в блок-схеме (см. приложение Г).

Процедура чтения данных из контейнера в поток

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

2.2 Описание программы

Проект «StegIT!» («project1») предназначен для шифрования и скрытия различных цифровых данных в растровом-изображении формата BitMap. Эта полезная программа может быть использована в целях скрытия факта передачи информации. Программный продукт позволяет как записать, так и извлечь информацию из загруженного пользователем картинки-контейнера. При старте программы доступна лишь одна операция - загрузка картинки (рисунок 4).

Программа считывает изображение из указанного пользователем файла и определяет доступные операции над картинкой. Если в открытом контейнере уже есть записанная информация-то доступны операции извлечения и записи (рисунок 5), иначе - только извлечения (рисунок 6).

Рисунок 4. Главное окно программы

Рисунок 5. Окно программы с открытым, записанным контейнером

Рисунок 6. Окно программы с открытым незаписанным контейнером

Листинг программы приведен в приложении Е.

3. Руководство пользователя программой

Данная программа позволяет осуществить операцию записи информации в изображение и операцию извлечения данных из изображения. Пользователь должен загрузить растровое изображение формата BitMap с цветовой моделью RGB. Программа имеет поддержку различных операционных систем, а именно Windows, OS X и различных Unix - дистрибутивов.

Ограничения эксплуатации программы.

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

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

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

Для того чтобы открыть программу в операционной системе Windows необходимо два раза нажать на файл «StegIT!.exe», в операционной системе OS X необходимо два раза нажать на файл «StegIT!.app».

После открытия программы пользователю будет предложено загрузить изображение (рисунок 4).

После открытия изображения пользователю будет предложены доступные операции над ним. Если в изображении уже была записана информация, то - операция извлечения (кнопка «Извлечь») и операция записи информации (кнопка «Спрятать»). Если картинка-контейнер пуста, то - только операция записи (кнопка «Спрятать») (рисунок 5), операция извлечения будет недоступна (рисунок 6).

В случае записи или перезаписи информации в контейнер, пользователь должен нажать кнопку «Спрятать». После нажатия на кнопку появятся поле для ввода пароля, кнопка для выбора записываемого файла (кнопка «Выбрать файл»), кнопка «Спрятать» и кнопка «Назад» (рисунок 7).

Рисунок 7. Окно программы после нажатия кнопки «Спрятать»

Пользователь должен ввести пароль, выбрать файл и нажать кнопку «Спрятать» (Рисунок 8). В версии программы для операционной системы Windows, к сожалению, отсутствуют символы точек в поле ввода пароля.

Рисунок 8. Окно программы после загрузки записываемого файла и ввода пароля

Если выбранный файл меньше либо равен объему возможной записываемой информации и был введен пароль то программа успешно выполнит шифрование и запись информации в изображение и предложит сохранить записанный контейнер (рисунок 9). Диалоговое окно сохранения записанного контейнера в операционной системе Windows - рисунок 10.

Рисунок 9. Окно программы после успешной записи в контейнер в ОС OS X

Рисунок 10. Окно программы после успешной записи в контейнер в ОС Windows

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

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

В случае извлечения информации из изображения пользователь должен нажать на кнопку «Извлечь». После нажатия на кнопку появятся поле для ввода пароля, кнопка «Извлечь» и кнопка «Назад». Пользователю необходимо ввести пароль (рисунок 11).

Рисунок 11. Окно программы после заполнения поля для ввода пароля

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

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

Рисунок 12. Окно программы после заполнения поля для ввода пароля и нажатия на кнопку «Извлечь»

4. Решение контрольных примеров

4.1 Запись информации в однобитное изображение

В качестве контейнера будет использоваться изображение формата BitMap содержащий только один цветовой канал (рисунок 13).

Рисунок 13. Контрольное изображение контейнер

Результат работы программы представлен ниже (рисунок 14).

Рисунок 14. Результат работы программы

4.2 Запись информации в «мнимый» BitMap

В качестве контейнера будет использоваться изображение формата JPEG, с расширением «.bmp».

Результат работы программы представлен ниже (рисунок 15).

Рисунок 15. Результат работы программы

4.3 Запись информации в растровое изображение формата BitMap с цветовой моделью RGB

В качестве контейнера будет использоваться изображение формата JPEG, с расширением «.bmp». Будет записываться текстовый файл «2.pas».

Результаты работы программы представлен выше (рисунки 8,9,10).

4.4 Извлечение информации из растрового изображение формата BitMap с цветовой моделью RGB

В качестве контейнера будет использоваться изображение формата JPEG, с расширением «.bmp». Будет извлекаться записанный файл «2.pas».

Результаты работы программы представлен выше (рисунки 11,12).

Заключение

цифровой стенография алгоритм программа

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

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

Библиографический список

1. Е.Р. Алексеев, О.В. Чеснокова, Т.В. Кучер «Free Pascal и Lazarus Учебник по программированию» (Москва ALT Linux; Издательский дом ДМК-пресс 2010)

2. «Формат хранения растровых изображений BMP» [Электронный ресурс] Режим доступа: https://ru.wikipedia.org/wiki/BMP

3. «Структура BMP файла» [Электронный ресурс] Режим доступа: http://c-site.h1.ru/infa/bmp_struct.htm

4. «Метод снижения криптостойкости алгоритма AES» [Электронный ресурс] Режим доступа: https://www.opennet.ru/opennews/art.shtml? num=31521

5. «Документация Lazarus» [Электронный ресурс] Режим доступа: http://wiki.freepascal.org/Lazarus_Documentation/ru

6. «Электронный учебник по языку Pascal» [Электронный ресурс] Режим доступа: http://valera.asf.ru/delphi/book/

7. К.Т. Мансуров «Основы программирования в среде Lazarus», 2010.

Приложения

Приложение А

Рисунок А.1. Блок-схема (часть 1)

Рисунок А.2. Блок-схема (часть 2)

Рисунок А.3.Блок-схема (часть 3)

Приложение Б

Блок-схема алгоритма записи скрываемого файла в изображение-контейнер

Рисунок Б.1. Блок-схема (часть 1)

Рисунок Б.2. Блок-схема (часть 2)

Приложение В

Блок-схема алгоритма извлечения файла из изображения-контейнера

Рисунок В.1. Блок-схема (часть 1)

Рисунок В.2. Блок-схема (часть 2)

Приложение Г

Блок-схема алгоритма записи данных из потока в контейнер

Рисунок Г.1. Блок-схема (часть 1)

Рисунок Г.2. Блок-схема (часть 2)

Рисунок Г.3. Блок-схема (часть 3)

Рисунок Г.4. Блок-схема (часть 4)

Приложение Д

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

Рисунок Д.1. Блок-схема (часть 1)

Рисунок Д.2. Блок-схема (часть 2)

Рисунок Д.3. Блок-схема (часть 3)

Приложение Е

Листинг основной программы

Project1.lpi

<? xml version= «1.0» encoding= «UTF-8»?>

<CONFIG>

<ProjectOptions>

<Version Value= «9»/>

<General>

<SessionStorage Value= «InProjectDir»/>

<MainUnit Value= «0»/>

<Title Value= «SteganoGrapher3000»/>

<ResourceType Value= «res»/>

<UseXPManifest Value= «True»/>

<Icon Value= «0»/>

</General>

<i18n>

<EnableI18N LFM= «False»/>

</i18n>

<VersionInfo>

<StringTable ProductVersion=»"/>

</VersionInfo>

<BuildModes Count= «1»>

<Item1 Name= «Default» Default= «True»/>

</BuildModes>

<PublishOptions>

<Version Value= «2»/>

</PublishOptions>

<RunParams>

<local>

<FormatVersion Value= «1»/>

</local>

</RunParams>

<RequiredPackages Count= «1»>

<Item1>

<PackageName Value= «LCL»/>

</Item1>

</RequiredPackages>

<Units Count= «4»>

<Unit0>

<Filename Value= «project1.lpr»/>

<IsPartOfProject Value= «True»/>

</Unit0>

<Unit1>

<Filename Value= «unit1.pas»/>

<IsPartOfProject Value= «True»/>

<ComponentName Value= «Form1»/>

<HasResources Value= «True»/>

<ResourceBaseClass Value= «Form»/>

<UnitName Value= «Unit1»/>

</Unit1>

<Unit2>

<Filename Value= «unit2.pas»/>

<IsPartOfProject Value= «True»/>

<UnitName Value= «Unit2»/>

</Unit2>

<Unit3>

<Filename Value= «unit3.pas»/>

<IsPartOfProject Value= «True»/>

<UnitName Value= «Unit3»/>

</Unit3>

</Units>

</ProjectOptions>

<CompilerOptions>

<Version Value= «11»/>

<Target>

<Filename Value= «Steganos3000»/>

</Target>

<SearchPaths>

<IncludeFiles Value= "$(ProjOutDir)"/>

<UnitOutputDirectory Value= «lib/$(TargetCPU)-$(TargetOS)»/>

</SearchPaths>

<CodeGeneration>

<SmartLinkUnit Value= «True»/>

<Optimizations>

<OptimizationLevel Value= «2»/>

</Optimizations>

</CodeGeneration>

<Linking>

<Debugging>

<GenerateDebugInfo Value= «False»/>

<UseLineInfoUnit Value= «False»/>

<StripSymbols Value= «True»/>

</Debugging>

<LinkSmart Value= «True»/>

<Options>

<Win32>

<GraphicApplication Value= «True»/>

</Win32>

</Options>

</Linking>

<Other>

<CustomOptions Value=» - Xg»/>

<ExecuteAfter>

<CompileReasons Compile= «False» Build= «False» Run= «False»/>

</ExecuteAfter>

</Other>

</CompilerOptions>

<Debugging>

<Exceptions Count= «3»>

<Item1>

<Name Value= «EAbort»/>

</Item1>

<Item2>

<Name Value= «ECodetoolError»/>

</Item2>

<Item3>

<Name Value= «EFOpenError»/>

</Item3>

</Exceptions>

</Debugging>

</CONFIG>

Project1.lps

<? xml version= «1.0» encoding= «UTF-8»?>

<CONFIG>

<ProjectSession>

<Version Value= «9»/>

<BuildModes Active= «Default»/>

<Units Count= «7»>

<Unit0>

<Filename Value= «project1.lpr»/>

<IsPartOfProject Value= «True»/>

<EditorIndex Value=» - 1»/>

<WindowIndex Value=» - 1»/>

<TopLine Value=» - 1»/>

<CursorPos X=» - 1» Y=» - 1»/>

<UsageCount Value= «56»/>

</Unit0>

<Unit1>

<Filename Value= «unit1.pas»/>

<IsPartOfProject Value= «True»/>

<ComponentName Value= «Form1»/>

<HasResources Value= «True»/>

<ResourceBaseClass Value= «Form»/>

<UnitName Value= «Unit1»/>

<IsVisibleTab Value= «True»/>

<TopLine Value= «44»/>

<CursorPos X= «37» Y= «37»/>

<UsageCount Value= «56»/>

<Loaded Value= «True»/>

<LoadedDesigner Value= «True»/>

</Unit1>

<Unit2>

<Filename Value= «unit2.pas»/>

<IsPartOfProject Value= «True»/>

<UnitName Value= «Unit2»/>

<EditorIndex Value= «2»/>

<TopLine Value= «36»/>

<CursorPos X= «16» Y= «25»/>

<UsageCount Value= «53»/>

<Loaded Value= «True»/>

</Unit2>

<Unit3>

<Filename Value= «unit3.pas»/>

<IsPartOfProject Value= «True»/>

<UnitName Value= «Unit3»/>

<EditorIndex Value= «1»/>

<TopLine Value= «8»/>

<CursorPos X= «30» Y= «28»/>

<UsageCount Value= «31»/>

<Loaded Value= «True»/>

</Unit3>

<Unit4>

<Filename Value=»/Developer/lazarus/components/lazutils/ttfile.pas»/>

<UnitName Value= «TTFile»/>

<EditorIndex Value=» - 1»/>

<TopLine Value= «364»/>

<CursorPos X= «5» Y= «374»/>

<UsageCount Value= «10»/>

</Unit4>

<Unit5>

<Filename Value=»/Developer/lazarus/components/lazutils/paswstring.pas»/>

<UnitName Value= «PasWString»/>

<EditorIndex Value=» - 1»/>

<TopLine Value= «109»/>

<CursorPos X= «10» Y= «119»/>

<UsageCount Value= «10»/>

</Unit5>

<Unit6>

<Filename Value=»../../Desktop/3.pas»/>

<EditorIndex Value=» - 1»/>

<UsageCount Value= «10»/>

</Unit6>

</Units>

<JumpHistory Count= «30» HistoryIndex= «29»>

<Position1>

<Filename Value= «unit1.pas»/>

<Caret Line= «188» Column= «78» TopLine= «179»/>

</Position1>

<Position2>

<Filename Value= «unit1.pas»/>

<Caret Line= «509» Column= «15» TopLine= «490»/>

</Position2>

<Position3>

<Filename Value= «unit2.pas»/>

<Caret Line= «108» Column= «19» TopLine= «92»/>

</Position3>

<Position4>

<Filename Value= «unit1.pas»/>

<Caret Line= «189» Column= «22» TopLine= «177»/>

</Position4>

<Position5>

<Filename Value= «unit1.pas»/>

<Caret Line= «61» Column= «62» TopLine= «57»/>

</Position5>

<Position6>

<Filename Value= «unit3.pas»/>

<Caret Line= «98» Column= «31» TopLine= «80»/>

</Position6>

<Position7>

<Filename Value= «unit2.pas»/>

<Caret Line= «51» Column= «21» TopLine= «45»/>

</Position7>

<Position8>

<Filename Value= «unit1.pas»/>

<Caret Line= «176» Column= «62» TopLine= «263»/>

</Position8>

<Position9>

<Filename Value= «unit1.pas»/>

<Caret Line= «175» Column= «62» TopLine= «175»/>

</Position9>

<Position10>

<Filename Value= «unit1.pas»/>

<Caret Line= «173» Column= «26» TopLine= «164»/>

</Position10>

<Position11>

<Filename Value= «unit1.pas»/>

<Caret Line= «217» Column= «70» TopLine= «209»/>

</Position11>

<Position12>

<Filename Value= «unit1.pas»/>

<Caret Line= «296» TopLine= «280»/>

</Position12>

<Position13>

<Filename Value= «unit1.pas»/>

<Caret Line= «264» Column= «64» TopLine= «277»/>

</Position13>

<Position14>

<Filename Value= «unit1.pas»/>

<Caret Line= «271» Column= «11» TopLine= «261»/>

</Position14>

<Position15>

<Filename Value= «unit1.pas»/>

<Caret Line= «306» Column= «20» TopLine= «311»/>

</Position15>

<Position16>

<Filename Value= «unit1.pas»/>

<Caret Line= «202» Column= «7» TopLine= «192»/>

</Position16>

<Position17>

<Filename Value= «unit1.pas»/>

<Caret Line= «221» Column= «17» TopLine= «214»/>

</Position17>

<Position18>

<Filename Value= «unit1.pas»/>

<Caret Line= «99» Column= «6» TopLine= «89»/>

</Position18>

<Position19>

<Filename Value= «unit1.pas»/>

<Caret Line= «98» Column= «3» TopLine= «88»/>

</Position19>

<Position20>

<Filename Value= «unit1.pas»/>

<Caret Line= «95» Column= «3» TopLine= «87»/>

</Position20>

<Position21>

<Filename Value= «unit1.pas»/>

<Caret Line= «94» Column= «7» TopLine= «84»/>

</Position21>

<Position22>

<Filename Value= «unit1.pas»/>

<Caret Line= «220» Column= «16» TopLine= «209»/>

</Position22>

<Position23>

<Filename Value= «unit1.pas»/>

<Caret Line= «95» Column= «12» TopLine= «83»/>

</Position23>

<Position24>

<Filename Value= «unit1.pas»/>

<Caret Line= «90» Column= «4» TopLine= «81»/>

</Position24>

<Position25>

<Filename Value= «unit1.pas»/>

<Caret Line= «96» Column= «11» TopLine= «86»/>

</Position25>

<Position26>

<Filename Value= «unit1.pas»/>

<Caret Line= «93» Column= «3» TopLine= «83»/>

</Position26>

<Position27>

<Filename Value= «unit1.pas»/>

<Caret Line= «105» Column= «27» TopLine= «96»/>

</Position27>

<Position28>

<Filename Value= «unit1.pas»/>

<Caret Line= «41» Column= «65» TopLine= «32»/>

</Position28>

<Position29>

<Filename Value= «unit1.pas»/>

<Caret Line= «77» TopLine= «68»/>

</Position29>

<Position30>

<Filename Value= «unit1.pas»/>

<Caret Line= «36» Column= «32» TopLine= «97»/>

</Position30>

</JumpHistory>

</ProjectSession>

</CONFIG>

Unit1.pas

unit Unit1; {Основной программный модуль.}

{$mode objfpc} {$H+}

interface

uses

Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,

Buttons, StdCtrls, LCLIntf, ExtDlgs, Unit3, Process;

type

TForm1 =

class(TForm)

FileSizeInBytes: TLabel;

HidingFileOpen: TOpenDialog;

ModifiedContainerSave: TSaveDialog;

SelectFile: TButton;

ContainerOpen: TOpenPictureDialog;

PassLabel: TLabel;

FreeBytes: TLabel;

Password: TEdit;

Extract: TImage;

HidePlz: TImage;

Quit: TImage;

MainMenu: TImage;

Pic: TImage;

Animation: TTimer;

CoolEffect: TTimer;

Back: TImage;

procedure BackClick;

procedure BackMouseEnter;

procedure BackMouseLeave;

procedure CoolEffectTimer;

procedure ExtractClick;

procedure ExtractMouseEnter;

procedure ExtractMouseLeave;

procedure FormCreate;

procedure HidePlzClick;

procedure HidePlzMouseEnter;

procedure HidePlzMouseLeave;

procedure PicClick;

procedure AnimationTimer;

procedure PicMouseEnter;

procedure PicMouseLeave;

procedure QuitClick;

procedure QuitMouseEnter;

procedure QuitMouseLeave;

procedure SelectFileClick;

function check:boolean;

procedure Clear;

function ContainerChecker (fln:string; mode:integer):boolean;

public

Container: TBitmap;

end;

var

Form1: TForm1;

hidingfilesize:longint;

t:integer;

path, hash, DCFB, dcfsib:string;

kostil, kostil2, picloaded, fileloaded, completed, containerfull:boolean;

hProcess: TProcess;

implementation

{$R *.lfm}

{TForm1}

function TForm1. ContainerChecker (fln:string; mode:integer):boolean; // функция проверяющая пользовательский контейнер на наличие содержимого

var

MS, MS1: TMemoryStream;

Buf, res: shortstring;

i: integer;

kd1:byte;

begin

 // инициализируем переменные

buf:='';

res:='';

kd1:=0;

case mode of

 // проверка сигнатуры bitmap (42 4D)

1: begin

MS1:= TMemoryStream. Create;

MS1. LoadFromFile(fln);

MS1. Seek (0, soEnd);

for i:=0 to 1 do

begin

MS1. Position:=i;

MS1. ReadBuffer (kd1,1); // 66

res:=res+inttostr(kd1);

end;

MS1. Clear;

MS1. Free;

If res='6677' then Result:=true else Result:=false;

end;

2: begin // проверка на наличие содержимого в контейнере

MS:= TMemoryStream. Create;

Stegano. ReadBufferFromContainer (Container, 33, 7, 2, TStream(MS));

MS. Position:= 0;

MS. Read (Buf, 7);

MS. Clear;

MS. Free;

if buf='savvas' then

Result:=true

else

Result:=false;

end;

end;

end;

procedure TForm1. BackMouseEnter;

begin

 // При наведении на курсор меняем цвет текста

{$IFDEF Unix}

Back. Picture. LoadFromFile (path+'images/buttons/back-active.png');

{$ELSE}

Back. Picture. LoadFromFile (path+'images\buttons\back-active.png');

{$ENDIF}

end;

procedure TForm1. Clear;

begin

 // очищаем поле пароля

Password. Text:='';

 // убираем информацию о загруженном файле

fileloaded:=false;

filesizeinbytes.visible:=false;

 // очищаем загруженный контейнер, если в него была сокрыта информация

if completed=true then

begin

MainMenu. Visible:=false; // прячем главное меню

Quit. Top:=200; // 384 normal

 // kostil2:=false;

Form1. Height:=Form1. Height div 2; // 485 normal

 // делаем кнопки отвечающие за операции над контейнером невидимыми

Extract. Visible:=false;

HidePlz. Visible:=false;

picloaded:=false;

{$IFDEF Unix}

Pic. Picture. LoadFromFile (path+'images/upload/nonactive.png'); // возвращаем исходную картинку

{$ELSE}

Pic. Picture. LoadFromFile (path+'\images\upload\nonactive.png'); // возвращаем исходную картинку

{$ENDIF}

FreeBytes.visible:=false;

completed:=false;

end;

end;

procedure TForm1. BackClick;

begin

 // Возвращаемся в главное меню, выполняем скрытие графических элементов

Back. Visible:=false;

Password. Visible:=false;

PassLabel. Visible:=false;

Quit. Visible:=true;

if kostil2=true then

begin

HidePlz. Visible:=true;

Extract. Visible:=true;

end;

SelectFile. Visible:=false;

CoolEffect. Enabled:=true;

clear;

end;

procedure TForm1. ExtractMouseEnter;

begin

 // При наведении на курсор меняем цвет текста

{$IFDEF Unix}

Extract. Picture. LoadFromFile (path+'images/buttons/extractbtn-active.png');

{$ELSE}

Extract. Picture. LoadFromFile (path+'images\buttons\extractbtn-active.png');

{$ENDIF}

end;

procedure TForm1. ExtractClick;

var

FS: TFileStream;

MS: TMemoryStream;

Buf, sign: shortstring;

BufI: integer;

FName: string;

begin

if kostil2=false then

begin

HidePlz. Visible:=false;

t:=0;

kostil:=true;

Quit. Visible:=false;

CoolEffect. Enabled:=true;

end

else

begin

{Тут будем вызывать ф-ию извлечения

Необходимо сверить хэш пароля введенного пользователем с хэшем

записанным в контейнере.}

 // Инициализируем переменные sign и buf

sign:='';

buf:='';

bufi:=0;

MS:= TMemoryStream. Create;

Stegano. ReadBufferFromContainer (Container, 0, 33, 2, TStream(MS));

MS. Position:= 0;

MS. Read (Buf, 33);

MS. Clear;

Stegano. ReadBufferFromContainer (Container, 33, 7, 2, TStream(MS));

MS. Position:=0;

MS. Read (sign, 7);

MS. Clear;

hash:= Creepy. HashIt (Password. Text);

If Buf <> hash then

 // Делаем надпись «Введите пароль:» красной.

begin

PassLabel. Font. Color:=clRed;

 // Выходим из процедуры.

Exit;

end;

PassLabel. Font. Color:=$00A1FF90; // Делаем надпись зеленой

Stegano. ReadBufferFromContainer (Container, 40, 4, 2, TStream(MS));

MS. Position:= 0;

MS. Read (BufI, 4);

MS. Clear;

Stegano. ReadBufferFromContainer (Container, 44, BufI, 2, TStream(MS));

MS. Position:= 0;

MS. Read (BufI, 4);

MS. Read (BufI, 4);

MS. Read (Buf, BufI);

{$IFDEF Windows}

FName:= ContainerOpen. InitialDir + '\' + Buf;

{$ELSE}

FName:= ContainerOpen. InitialDir + '/' + Buf;

{$ENDIF}

FS:= TFileStream. Create (FName, fmCreate);

MS. Read (BufI, 4);

FS. CopyFrom (MS, BufI);

FS. Free;

MS. Free;

 // Выполняем расшифровку файла и сохраняем его с исходным названием

showmessage ('Файл - '+ExtractFileName (Creepy. Decrypt (path, password. Text, fname))+' успешно извлечен!');

 // Удаляем извлеченный, зашифрованный файл

deletefile(fname);

end;

end;

procedure TForm1. HidePlzClick;

var FS: TFileStream;

MS, MS1: TMemoryStream;

Buf, sign: shortstring;

BufI: integer;

HD:string;

begin

if kostil2=false then

begin

Extract. Visible:=false;

t:=0;

kostil:=false;

Quit. Visible:=false;

CoolEffect. Enabled:=true;

end

else

begin

if fileloaded=true then begin // Проверяем, что записываемый файл загружен

if check=true then begin // Проверяем, что загруженный файл удовлетворяет объему контейнера

if password.text<>'' then // Проверяем, что поле для ввода пароля не пустое

begin

 // Выполняем шифрование файла введенным пользователем паролем

HD:=Creepy. Encrypt (path, Password. Text, HidingFileOpen. FileName);

 // Выполняем хеширование пароля

hash:=Creepy. HashIt (Password. Text);

 // Записываем зашифрованный файл вместе с хешем в контейнер

MS:= TMemoryStream. Create;

Buf:=hash;

MS. Write (Buf, 33);

MS. Position:= 0;

Stegano. WriteBufferToContainer (MS, 0, 33, 2, Container);

MS. Clear;

{Записываем нашу подпись для дальнейшей идентификации

наличия записанных данных в контейнере}

sign:='savvas';

MS. Write (sign, 7);

MS. Position:=0;

Stegano. WriteBufferToContainer (MS, 33, 7, 2, Container);

MS. Clear;

BufI:= 1;

Ms. Write (BufI, SizeOf(integer));

FS:= TFileStream. Create (HD, fmOpenRead);

BufI:= Length (ExtractFileName(HD))+1;

Buf:= ExtractFileName(HD);

MS. Write (BufI, SizeOf(Integer));

MS. Write (Buf, BufI);

BufI:= FS. Size;

MS. Write (BufI, SizeOf(Integer));

MS. CopyFrom (FS, FS. Size);

FS. Free;

MS1:= TMemoryStream. Create;

BufI:= MS. Size;

MS1. Write (BufI, 4);

MS1. Position:= 0;

MS. Position:= 0;

Stegano. WriteBufferToContainer (MS1, 40, 4, 2, Container);

Stegano. WriteBufferToContainer (MS, 44, MS. Size, 2, Container);

If ModifiedContainerSave. Execute then

begin

Container. SaveToFile (ModifiedContainerSave. FileName);

end;

MS. Free;

MS1. Free;

deletefile(HD); // Удаляем зашифрованный файл

completed:=true;

PassLabel. Font. Color:=clNone;

end

else //

{Меняем цвет шрифта у надписи «Введите пароль:» на красный}

PassLabel. Font. Color:=clRed;

end;

end;

end;

end;

procedure TForm1. CoolEffectTimer;

begin

inc(t);

if kostil2=true then

 // Для кнопки «Назад» - возвращаем главное меню

begin

if kostil=true then

begin

 // Поднимаем кнопку «Извлечь» в исходное положение

if t<101 then

Extract. Top:=332-t

else

begin

 // Отключаем таймер и обнуляем счетчик пикселей

CoolEffect. Enabled:=false;

t:=0;

kostil2:=false;

end

end

else

begin

 // Поднимаем кнопку «Спрятать» в ее исходное положение

if t<45 then

HidePlz. Top:=332-t

else

begin

 // Отключаем таймер и обнуляем счетчик пикселей

CoolEffect. Enabled:=false;

t:=0;

kostil2:=false;

end

end;

end

else

begin

if kostil=true then

begin

if t<101 then

Extract. Top:=232+t

else

begin

CoolEffect. Enabled:=False; // Выключаем таймер

t:=0; // Обнуляем счетчик пикселей

 // Рисуем поле с вводом пароля и Label с надписью

 // «Введите пароль:»

PassLabel. Visible:=true;

Password. Top:=264;

Password. Left:=184;

Password. Visible:=true;

 // Заменяем кнопку «Выйти» на кнопку «Назад»

Back. Visible:=true;

kostil2:=true;

end

end

else

begin

if t<45 then

HidePlz. Top:=288+t

else

begin

CoolEffect. Enabled:=False; // Выключаем таймер

t:=0; // Обнуляем счетчик пикселей

 // Рисуем поле с вводом пароля и Label с надписью

 // «Введите пароль:»

PassLabel. Visible:=true;

Password. Top:=254;

Password. Left:=184;

Password. Visible:=true;

 // Рисуем кнопку для открытия файла

SelectFile. Visible:=true;

 // Заменяем кнопку «Выйти» на кнопку «Назад»

Quit. Visible:=false;

Back. Visible:=true;

kostil2:=true;

end;

end;

end;

end;

procedure TForm1. BackMouseLeave;

begin

{После того как курсор был убран,

возвращаем исходный цвет текста в кнопке «Назад»}

{$IFDEF Unix}

Back. Picture. LoadFromFile (path+'images/buttons/back.png');

{$ELSE}

Back. Picture. LoadFromFile (path+'images\buttons\back.png');

{$ENDIF}

end;

procedure TForm1. ExtractMouseLeave;

begin

{После того как курсор был убран,

возвращаем исходный цвет текста в кнопке «Извлечь}

{$IFDEF Unix}

Extract. Picture. LoadFromFile (path+'images/buttons/extractbtn.png');

{$ELSE}

Extract. Picture. LoadFromFile (path+'images\buttons\extractbtn.png');

{$ENDIF}

end;

procedure TForm1. FormCreate;

begin

DCFB:=FreeBytes. Caption; // сохраяем исходный caption

dcfsib:=FileSizeInBytes. Caption; // сохраяем исходный caption

MainMenu. Visible:=false; // прячем главное меню

Quit. Top:=200;

Form1. Height:=Form1. Height div 2;

 // Скрываем кнопки «Извлечь» и «Спрятать» невидимыми

Extract. Visible:=false;

HidePlz. Visible:=false;

 // Устанавливаем расположение папки с ресурсами

{$IFDEF Unix}

{В OS X Application. Location возвращает путь до самого исполняемого файла.

Поэтому меняем на путь до папки Resources}

path:=StringReplace (Application. Location, 'MacOS/', 'Resources/', [rfReplaceAll, rfIgnoreCase]);

{$ELSE}

path:=Application. Location;

{$ENDIF}

end;

procedure TForm1. HidePlzMouseEnter;

begin

{После того как курсор был наведен на кнопку «Спрятать»,

изменяем цвет текста в кнопке на фиолетовый}

{$IFDEF Unix}

HidePlz. Picture.PNG. LoadFromFile (path+'images/buttons/hidebtn-active.png');

{$ELSE}

HidePlz. Picture. LoadFromFile (path+'images\buttons\hidebtn-active.png');

{$ENDIF}

 // HidePlz. OnMouseEnter:=nil; деактивация евента

end;

procedure TForm1. HidePlzMouseLeave;

begin

{После того как курсор был убран,

возвращаем исходный цвет текста в кнопке «Спрятать»}

{$IFDEF Unix}

HidePlz. Picture. LoadFromFile (path+'images/buttons/hidebtn.png');

{$ELSE}

HidePlz. Picture. LoadFromFile (path+'images\buttons\hidebtn.png');

{$ENDIF}

end;

procedure TForm1. PicClick;

begin

 // Процедура загрузки файла-контейнера

 // Вызываем окно с выбором файла

if ContainerOpen. Execute then

begin

if ContainerChecker (ContainerOpen. Filename, 1)=false

then

begin

showmessage ('Изображение: '+ExtractFileName (ContainerOpen. Filename)+' не формата BitMap!');

exit;

end;

Container:= TBitmap. Create;

Container. LoadFromFile (ContainerOpen. Filename);

 // Проверяем, что изображение использует цветовую модель - RGB.

if Container. PixelFormat=pf1bit then

begin

showmessage ('Алгоритм не поддерживает запись в BitMap изображение типа Grayscale');

exit;

end;

 // Загружаем картинку в форму

pic. Picture.bitmap.loadfromfile (ContainerOpen. Filename);

picloaded:=true; // Устанавливаем флаг того, что файл-контейнер был успешно загружен

 // Увеличиваем высоту формы и добавляем главное меню

Form1. Height:=485;

MainMenu. Visible:=true; // Прячем текстуру главного меню

Quit. Top:=384; // Сдвигаем кнопку «Выход»

Animation. Enabled:=false; // Отключаем таймер с анимацией

 // Активируем кнопки, отвечающие за операции над контейнером

Extract. Visible:=true;

HidePlz. Visible:=true;

 // Выводим сообщение с количеством свободных байт в контейнере

if ContainerChecker ('', 2)=true then

begin

Extract. Enabled:=true;

FreeBytes. Caption:='В контейнере уже записана информация. Вы можете ее извлечь или перезаписать.';

containerfull:=true; {пользователь может записать данные поверх}

end

else

begin

Extract. Enabled:=false;

containerfull:=false;

FreeBytes. Caption:=DCFB+' '+IntToStr((Container. Width * Container. Height * 2) div 8)+' Байт';

end;

FreeBytes. Visible:=true;

end;

end;

procedure TForm1. AnimationTimer;

begin

inc(t);

{$IFDEF Unix}

case t of

1: Pic. Picture. LoadFromFile (path+'images/upload/pic0.png');

2: Pic. Picture. LoadFromFile (path+'images/upload/pic1.png');

3: Pic. Picture. LoadFromFile (path+'images/upload/pic2.png');

...

Подобные документы

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

    курсовая работа [589,7 K], добавлен 17.02.2013

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

    курсовая работа [1,5 M], добавлен 17.01.2011

  • Программа по созданию стрелочных часов. Минимальные требования к составу и параметрам технических средств программы. Выбор и обоснование системы программирования Microsoft Visual Studio. Общее описание алгоритма. Руководство пользователя и программиста.

    контрольная работа [1017,1 K], добавлен 11.12.2012

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

    курсовая работа [1,7 M], добавлен 08.06.2009

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

    курсовая работа [94,7 K], добавлен 30.01.2016

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

    курсовая работа [1,3 M], добавлен 28.07.2013

  • Общая информация о графическом формате. Описание формата Microsoft Windows Bitmap. Структура файла DDВ исходного формата ВМР. Преобразования графических файлов. Просмотр и редактирование растровых изображений. Создание многодокументного приложения.

    дипломная работа [1,5 M], добавлен 06.06.2010

  • Составление алгоритма и разработка в среде программирования Delphi 7 программы, вычисляющей макроэкономические индексы цен. Реализация программы в виде 4 форм и 1 диалогового окна. Описание алгоритма решения задачи. Текст программы, руководство оператора.

    курсовая работа [1,4 M], добавлен 04.06.2013

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

    курсовая работа [1,2 M], добавлен 07.07.2012

  • Абстрактный анализ и синтез модели предметной области. Разработка структуры, внешних и внутренних спецификаций программы. Описание программы Kurs и подпрограммы Openf, особенности и результаты их тестирования. Руководство программиста и пользователя.

    курсовая работа [503,2 K], добавлен 14.07.2012

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

    курсовая работа [435,9 K], добавлен 02.07.2010

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

    курсовая работа [1,4 M], добавлен 16.03.2012

  • Применение программного обеспечения для разработки игры "Быки и коровы". Описание алгоритма и интерфейса пользователя программы. Назначение и область применения и описание возможностей программы. Рассмотрение списка сообщений об ошибках программы.

    курсовая работа [799,2 K], добавлен 26.04.2021

  • Этапы процедуры принятия решений. Разработка математического алгоритма. Блок-схема алгоритма работы программы. Разработка программы на языке программирования С++ в среде разработки MFC. Текст программы определения технического состояния станка с ЧПУ.

    курсовая работа [823,0 K], добавлен 18.12.2011

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

    курсовая работа [812,6 K], добавлен 27.03.2012

  • Описание входной и выходной информации. Требования к комплексу технических средств и к интерфейсу конечного пользователя. Разработка форм представления входных и выходных данных. Проектирование программных модулей. Руководство пользователя и программиста.

    курсовая работа [421,6 K], добавлен 27.06.2015

  • Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.

    курсовая работа [357,1 K], добавлен 28.02.2011

  • Разработка программы для нахождения минимального и максимального элемента массива, вычисления среднего арифметического строк и столбцов транспортирования матриц. Характеристика основных программных средств. Описание программы, руководство пользователя.

    курсовая работа [2,4 M], добавлен 26.04.2015

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

    курсовая работа [35,7 K], добавлен 29.06.2010

  • Создание программы визуализации методов сортировки массива, особенности и направления ее практического применения. Выбор и обоснование среды программирования. Разработка руководства пользователя. Листинг программы и оценка эффективности ее использования.

    дипломная работа [1,0 M], добавлен 15.06.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.