Дипломная работа по предмету "Информатика, программирование"


Защита данных от несанкционированного доступа

1. Введение.


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


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


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


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


высокие темпы роста парка ПЭВМ, находящихся в эксплуатации;


широкое применение ПЭВМ в самых различных сферах человеческой деятельности;


высокая степень концентрации информации в ПЭВМ;


совершенствование способов доступа пользователей к ресурсам ПЭВМ;


усложнение вычислительного процесса в ПЭВМ.


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


1. Постановка задачи


1. 1. Организационно-экономическая сущность задачи


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


проверка целостности информации;


исключение несанкционированного доступа к защищаемым программам и данным;


исключение несанкционированного использования хранящихся в ПЭВМ программ (т. е. защита программ от копирования).


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


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


хищение носителей информации (дискет; лазерных, магнитных и магнитооптических дисков и т. д.);


чтение информации с экрана посторонним лицом (во время отображения информации на экране законным пользователем или при отсутствии законного пользователя на рабочем месте);


чтение информации из оставленных без присмотра распечаток программ.


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


подключение к устройствам ПЭВМ специально разработанных аппаратных средств,


обеспечивающих доступ к информации;


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


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


несанкционированный доступ программы к информации;


расшифровка программой зашифрованной информации;


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


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


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


аутентификация защищаемых ресурсов, т. е. установление их подлинности на основе сравнения с эталонными идентификаторами;


разграничение доступа пользователей по операциям над ресурсами (программы, данные), защищаемыми с помощью программных средств;


администрирование:


определение прав доступа к защищаемым ресурсам,


установка системы защиты на ПЭВМ ,


снятие системы защиты с ПЭВМ,


контроль целостности и работоспособности систем защиты.


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


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


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


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


Психологическая привлекательность. Система защиты должна быть простой в эксплуатации [6].


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


аутентификация пользователя по паролю и по ключевой дискете;


шифрование выбранных файлов;


установка на программы защиты от несанкционированного запуска;


реакция на несанкционированный доступ.


1. 2. Входная информация


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


1. 3. Постоянная информация


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


1. 4. Выходная информация


Выходные данные — зашифрованные файлы и защищенные программы.


2. Вычислительная система


2. 1. Операционная система


Программа “Защита данных от НСД” разрабатывалась под управлением операционной системы MS-DOS 6.22. Предполагается, что программа будет работать без сбоев с MS-DOS и PC-DOS версий не ниже 5.0.


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


К основным достоинствам MS DOS относятся:


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


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


возможность работы со всеми последовательными устройствами как с файлами;


развитый командный язык;


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


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


базовая система ввода/вывода (BIOS);


блок начальной загрузки (Boot Record);


модуль расширения базовой системы ввода/вывода(___BIO.COM);


модуль обработки прерываний (___DOS.COM);


командный процессор (COMMAND.COM);


утилиты DOS.


Достоинством DOS является то, что любая программа может играть роль сервисной, поскольку для ее запуска достаточно указать лишь имя файла, в котором она содержится. Следовательно, с точки зрения пользователя такие программы не отличаются от встроенных команд DOS. Программа может воспринимать параметры, задаваемые в командной строке. Храниться она может в любом каталоге на любом диске. Указанное свойство делает ДОС открытой для расширения. Неизменное ядро системы составляют лишь BIOS и три основных моду- ля: BIO.COM, DOS.COM и COMMAND.COM Общий объем оперативной памяти, занимаемой этими модулями, составляет до 60 Кбайт.


2. 2. Технические средства реализации задачи


Программа работает на компьютерах клона IBM, начиная с процессора Intel 80-286. Требуемый объем оперативной памяти — минимум 1,5 Mb. Минимальные требования к видеоаппаратуре — карта VGA и 256 Kb видеопамяти.


2. 3. Программные средства реализации задачи


Программа “Защита данных от несанкционированного доступа” разработана в среде Borland Pascal 7.0 (Borland International ©
, 1992). Пакет Borland Pascal 7.0 учитывает новейшие достижения в программировании и практике создания программ и включает в себя три режима работы:


обычный режим операционной системы MS-DOS


защищенный режим MS-DOS


режим Windows.


Пакет Borland Pascal включает в себя как язык программирования — одно из расширений языка Паскаль для ПЭВМ клонов IBM, так и среду, предназначенную для написания, отладки и запуска программ.


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


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


Версия 7.0 также, как и предыдущая, позволяет применять объектно-ориентированное программирование, обладает встроенным ассемблером, имеет инструментальное средство создания интерактивных программ — Turbo Vision, но появился ряд характерных особенностей:


выделение цветом различных элементов программы;


ряд дополнительных расширений языка, таких, как использование открытых массивов, параметров-констант, типизированного адресного оператора @ и т. д.;


расширенные возможности объектно-ориентированного программирования;


усовершенствованные программы Turbo Vision [2].


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


Прекрасным средством упрощения работы по организации ввода-вывода, его унификации с учетом требований к интерфейсу программ является разработанный фирмой Borland International пакет Turbo Vision 2.0, представляющий объектно-ориентированную библиотеку средств формирования пользовательского интерфейса. Кстати, интерфейс самого Borland Pascal 7.0 (и Turbo Pascal 7.0 тоже) построен на стандартных объектах Turbo Vision 2.0.


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


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


Также при создании программы использовался ассемблер — машинно-ориентированный язык. На ассемблере написаны основные подпрограммы, где требуется высокое быстродействие и минимальный размер программного кода.


3. Алгоритм задачи


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


Инсталляционный модуль.


Оболочка программы (написана с использованием Turbo Vision 2.0).


Криптографическая защита (Borland Pascal 7.0).


Защита программ паролем (TASM 3.0).


Защита программ с помощью ключевой дискеты (TASM 3.0).


Блокировка винчестера (TASM 3.0).


3. 1 Инсталляционный модуль


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


3. 2. Оболочка программы


При создании интерактивного пользовательского интерфейса (оболочки программы) использовались стандартные объекты пакета Turbo Vision.
Горизонтальное двухуровневое меню, строка состояния, рабочее поле, диалоговые окна, информационные сообщения и сообщения об ошибках, поддержка “мыши” — вот некоторые атрибуты оболочки.


3. 2. Криптографическая защита


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


Зашифрованием данных называется процесс преобразования открытых данных в зашифрованные с помощью шифра, а расшифрованием данных — процесс преобразования закрытых данных в открытые с помощью шифра.


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


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


Криптографическая защита — это защита данных с помощью криптографического преобразования, под которым понимается преобразование данных шифрованием.


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


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


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


Криптостойкостью называется характеристика шифра, определяющая его стойкость к дешифрованию. Обычно эта характеристика определяется периодом времени, необходимым для дешифрования [6].


Принцип зашифрования заключается в генерации гаммы шифра с помощью датчика псевдослучайных чисел (ПСЧ) и наложением полученной гаммы на открытые данные с помощью логической операции “исключающее ИЛИ” (т. е. обратимым образом).


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


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


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


Этот датчик ПСЧ генерирует псевдослучайные числа с определенным периодом повторения, зависящим от выбранных значений A и C. Значение М обычно устанавливается равным 2b
, где b — длина слова ЭВМ в битах. Датчик имеет максимальный период М до того, как генерируемая последовательность чисел начнет повторяться. Линейный конгруэнтный датчик ПСЧ имеет максимальную длину М тогда и только тогда, когда A mod 4 = 1 и С — нечетное. В своей программе я положил А = 5, С = 27, Т(0) — пароль, вводимый пользователем.


С полученной последовательностью Т(i) поступают следующим образом:


F(i) = T(i) xor D(i) (2)


Где в (2) D(i) — последовательность открытых данных, F(i) — последовательность


зашифрованных данных [4].


Также при разработке алгоритма шифрования использовался алгоритм американского федерального стандарта на шифрование данных — Data Encryption Standard (DES).


При зашифровании входные данные шифруются по формуле (2), далее обрабатываются блоками по 64 слова (word). Эта обработка заключается в следующем: :4 слова переставляются в соответствии с таблицей, изображенной на рис. 2:










































































[ 8 48 16 56 24 64 32
39 7 47 15 55 23 63 31
38 6 46 14 54 22 62 30
37 5 45 13 53 21 61 29
36 4 44 12 52 20 60 28
35 3 43 11 51 19 59 27
34 2 42 10 50 18 58 26
33 1 41 9 49 17 57 25

Рис. 2. Перестановка после зашифрования.


Как видно из данной таблицы, слово 40 входной последовательности становится 1-ым, слово 8 — 2-ым и т. д.


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










































































58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7

Рис. 3. Перестановка перед расшифрованием


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


При написании программы использовались следующие стандартные библиотеки Borland Pascal 7.0 и Turbo Vision 2.0:


Модуль Objects. Модуль Objects содержит основные определения объектов Turbo Vision, включая базовый объект иерархии Turbo Vision TObject, а также все невидимые элементы Turbo Vision: потоки, коллекции и ресурсы.


Модуль App. Модуль App (предоставлен в исходных кодах) обеспечивает элементы оболочки Turbo Vision. 4 очень мощных объектных типа определены в App, включая объекты TApplication и TProgram, которые служат в качестве программ Turbo Vision и объект панели экрана, который управляет большинством элементов в оконных программах.


Модуль Views. Модуль Views содержит основные компоненты видимых элементов и полезные компоненты более сложных групп, таких как рамки окон и полосы скроллинга. Более сложные видимые элементы находятся в модулях Dialogs и TextView.


Модуль Dialogs. Модуль Dialogs определяет большинство элементов наиболее часто используемых при создании диалоговых окон. Этот модуль включает сами диалоговые окна (которые являются специализированными окнами) и различные элементы управления, такие как кнопки, метки, зависимые и независимые кнопки, строки ввода и списки истории.


Модуль Menus. Модуль Menus обеспечивает все объекты и процедуры для системы меню Turbo Vision, включая выпадающие меню и активные элементы строки статуса.


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


Модуль Memory. Модуль Memory содержит процедуры монитора памяти Turbo Vision, которые обеспечивают функции управления кучей.


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


Модуль DOS. Модуль DOS позволяет использовать возможности операционной системы MS-DOS, не предусмотренные в стандарте языка Паскаль, и содержит типы, константы, переменные и для реализации этих дополнительных возможностей.


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


При запуске программы в первую очередь проверяется целостность системы; т. е. наличие всех файлов системы, соответствуют ли их имена и размеры таблице. Далее происходит инициализация: проверяются параметры BIOS. Если какой либо файл системы был изменен или параметры BIOS не соответствуют установленным в программе, система работать не будет. Для входа в систему необходимо ввести пароль. Эти проверки осуществляются в конструкторе Init объекта TMyApp. Этот же объект инициализирует меню (TMyApp.InitMenu), строку состояния (TMyApp.InitStatusLine), рабочее поле (TMyApp.InitDeskTop), устанавливает специальную цветовую палитру (TMyApp.GetPalette). Обработка событий (нажатие клавиш клавиатуры, работа с “мышью”) осуществляется в методе HandleEvent объекта TMyApp. При выборе какого-либо пункта меню управление передается соответствующему объекту или вызывается нужная подпрограмма.


В программе используются следующие процедуры, функции и объекты:


Shifr (процедура). Зашифрование файлов любого типа. Сначала получаем пароль от пользователя, затем создаем файл зашифрованных данных (*.M&A). Исходный файл считывается блоками по 64 word, кодируется с помощью генератора ПСЧ, затем переставляется в соответствии с таблицей, изображенной на рис. 2. Полученную последовательность записываем в файл с расширением *.M&A и т. д.


DeShifr (процедура). Расшифрование файлов, зашифрованных процедурой Shifr.


Plus (процедура). Установка защиты паролем или по ключевой дискете на программы.


Block (процедура). Защита винчестера от записи.


Passwords (процедура). Изменение пароля входа в программу. Сначала запрашивает старый пароль, затем два раза новый.


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


CheckExec (процедура). Обрабатывает ошибки DOS.


5. Описание применения программы


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


шифрование файлов;


защита паролем исполняемых файлов;


защита исполняемых файлов с помощью ключевой дискеты;


отслеживание и реакция на ошибки;


изменение паролей;


привязка к BIOS.


Установка системы происходит с ключевой дискеты программой INSTALL.EXE, которая проверяет не была ли установлена система ранее; если нет, то создает на винчестере каталог C:\SUB ROSA и копирует в него файлы системы (Sub Rosa.exe, Block, KeyDisk, Plus, Passw, Setup.res, System.res).


При запуске программы Sub Rosa.exe сначала проверяется наличие всех файлов системы. Если хотя бы один файл изменен или удален, то система работать не будет. Для работы с программой необходимо ввести пароль.


В верхней части экрана находится полоска меню, состоящая из следующих пунктов:


“Файлы”:


— “Выбрать” (выбор файла для работы);


— “Сменить каталог” (смена текущего каталога);


— “Выход в DOS” (временный выход в DOS);


— “Завершение” (завершение работы с программой);


“Защита”:


— “Установить пароль” (защита EXE- и COM-файлов паролем);


— “Блокировать винчестер” (запрет записи любых данных на винчестер);


“Ключевая дискета”:


— “Добавить проверку по ключу” (защита EXE- и COM-файлов с помощью ключевой дискеты);


“Криптография”:


— “Зашифровать файл данных” (зашифрование выбранного файла);


— “Расшифровать файл данных” (расшифрование выбранного файла);


“Настройки”:


— “Криптография” (изменение настроек криптографии);


— “Пароли” (изменение пароля входа в систему);


“О Программе” (информация о программе).


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


6. Заключение


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


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


LATCH — комплекс программ защиты ПЭВМ от НСД. Этот комплекс обеспечивает безопасность данных , хранящихся на винчестере. При несанкционированном доступе происходит “зависание” ПЭВМ или не обнаруживается НЖМД.


Тезис о невозможности обнаружения НЖМД вызывает серьезные сомнения: например, для контроллеров SCSI не требуется определение типа НЖМД в памяти CMOS, так как параметры винчестера могут быть считаны с помощью команды контроллера.


Приложение 1


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


Program Sub_Rosa;


Uses


App, Dialogs, Drivers, Menus, MsgBox, Objects,


Validate, Views, Memory, StdDlg, Editors, {Модули Turbo Vision, далее - TV}


CRT, DOS, {Стандартные модули}


SetConf; {Модуль функции привязки к BIOS}


Var


MyRes : TResourceFile; {Переменная файла ресурсов, TV}


FName, MainDir, DName: string; {Переменные работы с файлами и каталогами}


MainPass, Pass : string; {Переменныепаролей}


Pos : string[3];


FilePass : file of char; {Переменнаяфайлапаролей}


OptFile, OptInd : word; {Переменныеопций}


Int09_Save : pointer; {Переменная адреса 09h прерывания}


Const {Константы кодов команд, TV}


cmAboutBox = 700; {Окно "О Программе"}


cmCode = 1001; {Кодировать файл}


cmDeCode = 1002; {Декодировать файл}


cmSetPass = 1005; {Установить пароль на вход в систему}


cmLockDisk = 1006; {Запретить доступ к винчестеру}


cmOptions = 1007; {Опции криптографии}


cmKeyDisk = 1008; {Ключевая дискета}


cmPasswords = 1009; {Пароль на исполняемый файл}


cmChangePass= 1010; {Сменить пароль на вход в систему}


SetPass = 'passw.com';


KeyDisk = 'keydisk.com';


RMenuBar: TStreamRec = ( {Запись для работы с потоком, TV}


ObjType: 2000;


VmtLink: Ofs(TypeOf(TMenuBar)^);


Load: @TMenuBar.Load;


Store: @TMenuBar.Store);


Type


{Установка опций криптографии}


POptions = ^TOptions;


TOptions = object(TDialog)


constructor Init;


end;


{Объект для работы с текстом}


PMyStaticText = ^TMyStaticText;


TMyStaticText = object(TStaticText)


function GetPalette: PPalette; virtual; {Переопределениепалитры}


end;


{Объекты для работы с файлами и каталогами}


PMyFDialog = ^TMyFDialog;


TMyFDialog = object(TFileDialog)


function GetPalette: PPalette; virtual;


end;


PMyFileDialog = ^TMyFileDialog;


TMyFileDialog = object(TMyFDialog)


constructor Init(AWildCard: tWildStr; const ATitle,


InputName: string; AOptions: Word; HistoryId: Byte);


end;


PDirDialog = ^TDirDialog;


TDirDialog = object(TChDirDialog)


function GetPalette: PPalette; virtual;


end;


PMyChDirDialog = ^TMyChDirDialog;


TMyChDirDialog = object(TDirDialog)


constructor Init(AOptions: Word; HistoryId: Word);


procedure SetUpDialog;


function Valid(Command: Word): Boolean; virtual;


end;


{Установка основного фона программы}


PMyBackground = ^TMyBackground;


TMyBackground = object(TBackground)


Text: TTitleStr;


constructor Init(var Bounds: TRect; AText: TTitleStr);


procedure Draw; virtual;


end;


PMyDesktop = ^TMyDesktop;


TMyDesktop = object(TDesktop)


procedure InitBackground; virtual;


end;


{Объект "О Программе"}


PAboutBox = ^TAboutBox;


TAboutBox = object(TDialog)


constructor Init;


end;


{Основной объект}


PMyApp = ^TMyApp;


TMyApp = object(TApplication)


constructor Init; {инициализация}


destructor Done; virtual; {завершениеработы}


procedure HandleEvent(var Event: TEvent); virtual; {обработкасобытий}


procedure InitMenuBar; virtual; {инициализацияменю}


procedure InitDeskTop; virtual; {инициализациярабочегополя}


procedure InitStatusLine; virtual; {инициализациястрокисостояния}


procedure FileOpen(WildCard: PathStr); {окнодляработысфайлами}


function GetPalette: PPalette; virtual; {изменениестандартнойпалитры}


end;


{ Русифицированная функция формирования сообщения }


function MyMessageBoxRect(var R: TRect;


const Msg: string; Params: pointer;


AOptions: word): word;


const


ButtonName: array[0..3] of string[6] = ('Ага', 'Нека', 'Ага', 'Нека');


Commands: array[0..3] of Word = (cmYes, cmNo, cmOK, cmCancel);


Titles: array[0..3] of string[11] =


('Предупреждение', 'Ошибка', 'Информация', 'Подтверждение');


var


I, X : integer;


Dialog : PDialog;


Control: PView;


S : string;


begin


Dialog:= New(PDialog, Init(R, Titles[AOptions and $3]));


with Dialog^ do


begin


Options:= Options or ofCentered;


R.Assign(3, 2, Size.X - 2, Size.Y - 3);


FormatStr(S, Msg, Params^);


Insert(New(PStaticText, Init(R, S)));


X:= -2;


R.Assign(0, 0, 10, 2);


for I:= 0 to 3 do


if AOptions and ($0100 shl I) <> 0 then


Inc(X, R.B.X - R.A.X + 2);


X:= (Size.X - X) shr 1;


for I:= 0 to 3 do


if AOptions and ($0100 shl I) <> 0 then


begin


Control:= New(PButton, Init(


R, ButtonName[I], Commands[i], bfNormal));


Insert(Control);


Control^.MoveTo(X, Size.Y - 3);


Inc(X, Control^.Size.X + 2);


end;


SelectNext(False);


end;


if AOptions and mfInsertInApp = 0 then


MyMessageBoxRect:= DeskTop^.ExecView(Dialog)


else


MyMessageBoxRect:= Application^.ExecView(Dialog);


Dispose(Dialog, Done);


end;


{ Русифицированная функция формирования сообщения


стандартногоразмера }


function MyMessageBox(const Msg: String;


Params: Pointer; AOptions: Word): Word;


var


R: TRect;


begin


R.Assign(0, 0, 40, 9);


MyMessageBox:= MyMessageBoxRect(R, Msg, Params, AOptions);


end;


function GetCurDir: DirStr;


var


CurDir: DirStr;


begin


GetDir(0, CurDir);


if Length(CurDir) > 3 then


begin


Inc(CurDir[0]);


CurDir[Length(CurDir)]:= '\';


end;


GetCurDir:= CurDir;


end;


{Процедура инициализации окна работы с файлами}


procedure TMyApp.FileOpen(WildCard: PathStr);


var


FileName: FNameStr;


begin


FileName:= '*.*';


if ExecuteDialog(New(PMyFileDialog, Init(


WildCard, 'Открытьфайл', 'Имя', fdOpenButton,


100)), @FileName) <> cmCancel then FName:=FileName;


{открыть файл, потом...}


end;


{****************************************************************************}


{*----------============= К Р И П Т О Г Р А Ф И Я ================----------*}


{****************************************************************************}


{Шифрованиефайлов}


procedure Shifr(InputFileName: string);


const


A = 5; {Константы для}


C = 27; {генератора}


M = 65536; {псевдослучайных чисел, далее - ПСЧ}


var


TempFile : file of byte;


InpF, OutF : file of word; {файлы на входе и выходе}


Password, Password1 : string; {переменные для работы с паролями}


OutputFileName, Exten : string; {переменныеименфайлов}


I, J, K, tmp : byte; {переменные кодирования}


Temp, SCode, TByte, Code: word;


Position : LongInt; {переменные данных о процессе}


NowPos : real;


TPassword : array [1..255] of word;


MasByte, Mas, MasEnd, PS: array [1..64] of word; {массивыперестановок}


T : array [0..64] of word;


DirInfo, DirInfo1 : SearchRec; {данныеофайле}


begin


if length(FName) > 3 then {Файлвыбран?}


begin


{Получить пароль}


Password := '';


Password1 := '';


InputBox('П А Р О Л Ь', ' Введите пароль:', Password, 255);


InputBox('П А Р О Л Ь', 'Введите пароль еще раз:', Password1, 255);


if (Password = Password1) and (length(Password)<>0) then


begin


{Преобразовать файл}


FindFirst(InputFileName, AnyFile, DirInfo);


if DOSError = 0 then


begin


if DirInfo.Size mod 2 = 1 then


begin


assign(TempFile, InputFileName);


reset(TempFile);


while not EOF(TempFile) do read(TempFile, tmp);


tmp := 255;


write(TempFile, tmp);


close(TempFile);


end;


{Преобразовать имя файла}


Position := 0;


assign(InpF, InputFileName);


reset(InpF);


for i := length(InputFileName) downto 1 do


if InputFileName[i] = '.' then


begin


OutputFileName := copy(InputFileName, 1, i) + 'M&A';


break;


end;


assign(OutF, OutputFileName);


rewrite(OutF);


for i:= 0 to length(InputFileName) do


if InputFileName[length(InputFileName) - i] = '.' then


case i of


0: Exten := chr(0) + chr(0) + chr(0);


1: Exten := copy(FName, length(FName)-2, i) + chr(0) + chr(0);


2: Exten := copy(FName, length(FName)-2, i) + chr(0)


else Exten := copy(FName, length(FName)-2, 3)


end;


for i := 1 to 3 do


begin


Temp := ord(Exten[i]);


Write(OutF, Temp);


end;


{Начать шифрование}


k := 1;


repeat


begin


{Считать из исходного файла блок размером 64*word}


for i:=1 to 64 do


If EOF(InpF) then MasByte[i] := 0 else Read(InpF, MasByte[i]);


Mas := MasByte;


T[0] := ord(Password[k]);


if k < length(Password) then inc(k) else k := 1;


for i:= 1 to 64 do


begin


{Получить текущую позицию процесса}


NowPos := 100*Position/DirInfo.Size;


inc(Position, 2);


if NowPos > 100 then NowPos := 100;


Str(Round(NowPos):3, Pos);


if OptInd = 0 then


begin


GoToXY(77, 1);


Write(Pos + '%');


end;


{Шифровать с помощью ПСЧ}


Code:=Mas[i];


T[i] := (A * T[i-1] + C) mod M;


Code:=T[i] xor Code;


Mas[i] := Code;


end;


for i:=1 to 8 do { Конечнаяперестановка }


for j:=1 to 8 do


case i of


1: MasEnd[8*(j-1)+i] := Mas[41-j];


2: MasEnd[8*(j-1)+i] := Mas[09-j];


3: MasEnd[8*(j-1)+i] := Mas[49-j];


4: MasEnd[8*(j-1)+i] := Mas[17-j];


5: MasEnd[8*(j-1)+i] := Mas[57-j];


6: MasEnd[8*(j-1)+i] := Mas[25-j];


7: MasEnd[8*(j-1)+i] := Mas[65-j];


8: MasEnd[8*(j-1)+i] := Mas[33-j]


end;


for i:= 1 to 64 do Write(OutF, MasEnd[i]);


end;


until eof(InpF);


MyMessageBox('Файл '+ InputFileName + ' зашифровансименем ' +


OutputFileName, nil, mfInformation+mfOkButton);


Close(InpF);


if OptFile = 1 then Erase(InpF);


Close(OutF);


end


else MyMessageBox('Файл '+ InputFileName + ' несуществует!',


nil, mfInformation+mfOkButton);


end


else MyMessageBox(' Ошибкавводапароля!!!', nil,


mfError+mfOkButton);


end


else MyMessageBox(' Файлневыбран!!!', nil, mfError+mfOkButton);


end;


procedure DeShifr(InputFileName: String);


const


A = 5;


C = 27;


M = 65536;


var


InpF, OutF : file of word;


Password, OutputFileName : string;


Password1 : string;


Exten : string[3];


SCode, Temp, Ext, TByte, Code: word;


I, J, K : byte;


Position : LongInt;


NowPos : real;


TPassword : array [1..255] of word;


MasByte, Mas, MasEnd, PS : array [1..64] of word;


T : array [0..64] of word;


DirInfo : SearchRec;


begin


if (length(InputFileName) > 3) and


(copy(InputFileName, length(InputFileName)-2, 3) = 'M&A') then


begin


Password := '';


Password1 := '';


InputBox('ПАРОЛЬ', ' Введитепароль:', Password, 255);


InputBox('П А Р О Л Ь', 'Введите пароль еще раз:', Password1, 255);


if (Password = Password1) and (length(Password)<>0) then


begin


FindFirst(InputFileName, AnyFile, DirInfo);


if DOSError = 0 then


begin


Assign(InpF, InputFileName);


Reset(InpF);


Position := 0;


Exten := '';


for i:= 1 to 3 do


begin


Read(InpF, Temp);


Exten := Exten + chr(Temp);


end;


for i := length(InputFileName) downto 1 do


if InputFileName[i] = '.' then


begin


OutputFileName := copy(InputFileName, 1, i) + Exten;


break;


end;


Assign(OutF, OutputFileName);


Rewrite(OutF);


for i := 1 to length(Password) do TPassword[i]:=ord(Password[i]);


k := 1;


repeat


begin


for i:=1 to 64 do Read(InpF, MasByte[i]);


for i:=1 to 8 do { начальная перестановка }


for j:=1 to 8 do


case i of


1: Mas[8*(i-1)+j]:=MasByte[66-8*j];


2: Mas[8*(i-1)+j]:=MasByte[68-8*j];


3: Mas[8*(i-1)+j]:=MasByte[70-8*j];


4: Mas[8*(i-1)+j]:=MasByte[72-8*j];


5: Mas[8*(i-1)+j]:=MasByte[65-8*j];


6: Mas[8*(i-1)+j]:=MasByte[67-8*j];


7: Mas[8*(i-1)+j]:=MasByte[69-8*j];


8: Mas[8*(i-1)+j]:=MasByte[71-8*j]


end;


T[0] := ord(Password[k]);


if k < length(Password) then inc(k) else k := 1;


for i:= 1 to 64 do


begin


NowPos := 100*Position/DirInfo.Size;


inc(Position, 2);


If NowPos > 100 then NowPos := 100;


Str(Round(NowPos):3, Pos);


if OptInd = 0 then


begin


GoToXY(77, 1);


Write(Pos + '%');


end;


T[i] := (A * T[i-1] + C) mod M;


Code:=Mas[i];


Code:=T[i] xor Code;


Mas[i] := Code;


end;


MasEnd := Mas;


for i := 1 to 64 do Write(OutF, MasEnd[i]);


end;


until eof(InpF);


GotoXY(77, 1);


write('100%');


MyMessageBox('Файл '+ InputFileName + ' расшифрованв ' +


OutputFileName, nil, mfInformation+mfOkButton);


Close(InpF);


if OptFile = 1 then Erase(InpF);


Close(OutF);


end


else MyMessageBox('Файл '+ InputFileName + ' несуществует!',


nil, mfInformation+mfOkButton);


end


else MyMessageBox(' Ошибкавводапароля!!!', nil,


mfError+mfOkButton);


end


else MyMessageBox(' Файлневыбран!!!', nil,


mfError+mfOkButton);


end;


{Опциикриптографии}


constructor TOptions.Init;


var


R : TRect;


Q, Q1: PView;


Butt : TRadioButtons;


begin


R.Assign(0, 0, 60, 11);


inherited Init(R, 'Криптография');


Options := Options or ofCentered;


R.Assign(10, 8, 20, 10);


Insert(New(PButton, Init(R, '~А~га', cmOK, bfDefault)));


R.Assign(40, 8, 50, 10);


Insert(New(PButton, Init(R, '~Н~ека', cmCancel, bfNormal)));


R.Assign(2, 2, 25, 3);


Insert(New(PLabel, Init(R, 'Исходныйфайл:', Q)));


R.Assign(5, 4, 21, 6);


Q:=New(PRadioButtons, Init(R,


NewSItem('~Н~еудалять',


NewSItem('~У~далять', nil))));


Insert(Q);


R.Assign(27, 2, 45, 3);


Insert(New(PLabel, Init(R, 'Индикатор:', Q1)));


R.Assign(30, 4, 50, 6);


Q1:=New(PRadioButtons, Init(R,


NewSItem('~В~ысвечивать',


NewSItem('~Н~евысвечивать', nil))));


Insert(Q1);


end;


{Изменение пароля на вход в систему}


procedure Passwords;


var


Ps, Ps1: string;


I : byte;


tmp : char;


begin


Ps := '';


Ps1 := '';


InputBox('П А Р О Л Ь', 'Введите пароль:', Ps, 255);


for i:= 1 to length(Ps) do Ps[i] :=chr(ord(Ps[i]) xor 27);


if Ps <> Pass then


begin


MyMessageBox(' Неверныйпароль!!!', nil, mfError+mfOkButton);


ClrScr;


writeln('Несанкционированный доступ!');


Halt;


end;


InputBox('И З М Е Н Е Н И Е П А Р О Л Я',


'Введите новый пароль:', Ps, 255);


InputBox('И З М Е Н Е Н И Е П А Р О Л Я',


' Повторите ввод:', Ps1, 255);


if (Ps = Ps1) and (Ps <> '') then


begin


Assign(FilePass, 'system.res');


Rewrite(FilePass);


for i := 1 to length(PS) do


begin


tmp := chr(ord(Ps[i]) xor 27);


Write(FilePass, tmp);


end;


Close(FilePass);


end


else MyMessageBox(' Ошибкавводапароля!!!', nil, mfError+mfOkButton);


end;


{Обработка ошибок}


procedure CheckExec;


var


St: string;


begin


Str(DOSError, St);


case DOSError of


2: MyMessageBox(' Ошибка DOS № ' +


St + ' "Файл не найден"',


nil, mfError + mfOkButton);


3: MyMessageBox(' Ошибка DOS № ' +


St + ' "Путь не найден"',


nil, mfError + mfOkButton);


5: MyMessageBox(' Ошибка DOS № ' +


St + '"Неверный код доступа к файлу"',


nil, mfError + mfOkButton);


6: MyMessageBox(' Ошибка DOS № ' +


St + '"Неверный код системного обработчика файла"',


nil, mfError + mfOkButton);


8: MyMessageBox(' Ошибка DOS № ' +


St + ' "Недостаточно памяти"',


nil, mfError + mfOkButton);


10: MyMessageBox(' Ошибка DOS № ' +


St + ' "Неверная среда"',


nil, mfError + mfOkButton);


11: MyMessageBox(' Ошибка DOS № ' +


St + ' "Неправильный формат"',


nil, mfError + mfOkButton);


18: MyMessageBox(' Ошибка DOS № ' +


St + '"Нет свободных обработчиков для файлов"',


nil, mfError + mfOkButton);


end;


end;


procedure MakeComFile(k: byte);


const


S : array [1..4] of string = ('c:\sub_rosa\plus.', 'c:\sub_rosa\passw.',


'c:\sub_rosa\block.', 'c:\sub_rosa\keydisk.');


Size : array [1..4] of word = (1068, 204, 617, 2118);


Inden: array [1..4, 1..3] of byte = ((ord('ы'), 26 , ord('Р')),


(ord('ы'), 39 , ord('Р')),


(ord('щ'), ord('Й'), ord('_')),


(ord('щ'), ord('А'), ord('_')));


var


I, Tmp : byte;


F : array [1..4, 1..2] of file ;


M : array [1..2200] of byte ;


NumRead, NumWritten: Word;


begin


assign(F[k, 1], S[k]); reset(F[k, 1], 1);


assign(F[k, 2], S[k]+'com'); rewrite(F[k, 2], 1);


for i := 1 to 3 do


begin


BlockRead(F[k, 1], tmp, 1, NumRead);


BlockWrite(F[k, 2], Inden[k, i], 1, NumWritten);


end;


BlockRead(F[k, 1], M, Size[k]-3, NumRead);


BlockWrite(F[k, 2], M, Size[k]-3, NumWritten);


close(F[k, 1]); close(F[k, 2]);


end;


procedure DelComFile(k: byte);


const


{ S: array [1..4] of string =


('plus.com', 'passw.com', 'block.com', 'keydisk.com');}


S : array [1..4] of string = ('c:\sub_rosa\plus.com',


'c:\sub_rosa\passw.com',


'c:\sub_rosa\block.com',


'c:\sub_rosa\keydisk.com');


var


F: array [1..4] of file;


begin


Assign(F[k], S[k]);


Erase(F[k]);


end;


{****************************************************************************}


{*----------=========== Д О П И С А Т Ь К Ф А Й Л У ==========----------*}


{****************************************************************************}


procedure Plus(WhatDo: string);


var


FileStr, Err: string;


CmdLine : string;


I : byte;


FileName : FNameStr;


Regs : Registers;


begin


{Проверка условий}


if Length(FName) > 3 then


begin


if (copy(FName, length(FName)-2, 3) = 'EXE') or


(copy(FName, length(FName)-2, 3) = 'COM')


then


begin


{Преобразование имени файла}


for i:= length(fname) downto 1 do


if fname[i] = '\' then


begin


CmdLine := copy(FName, i+1, length(FName) - i);


break;


end;


for i := 1 to length(CmdLine) do


if CmdLine[i] in ['A'..'Z'] then


CmdLine[i] := chr(ord(CmdLine[i]) + 32);


for i := 1 to length(MainDir) do


if MainDir[i] in ['A'..'Z'] then


MainDir[i] := chr(ord(MainDir[i]) + 32);


MakeComFile(1);


If WhatDo = SetPass then MakeComFile(2);


If WhatDo = KeyDisk then MakeComFile(4);


{Выполнить дописывание}


SwapVectors;


Exec( MainDir + 'plus.com ', CmdLine + ' ' + MainDir + WhatDo);


SwapVectors;


DelComFile(1);


If WhatDo = SetPass then DelComFile(2);


If WhatDo = KeyDisk then DelComFile(4);


{Обработчикошибок}


if DosError <> 0 then


CheckExec


else


begin


regs.ah := $4D;


with regs do


msdos(regs);


case Regs.AH of


0 : MyMessageBox(' Файл ' + FName + ' защищен.',


nil, mfInformation + mfOkButton);


1 : MyMessageBox(' Ctrl-C или Ctrl-Break.',


nil, mfError + mfOkButton);


2 : MyMessageBox(' Критическая ошибка устройства.',


nil, mfError + mfOkButton);


3 : MyMessageBox(' TSR - программа.',


nil, mfError + mfOkButton);


end;


end;


end


else MyMessageBox(' Ошибкавыборафайла !!! ',


nil, mfError + mfOkButton);


end


else MyMessageBox(' Файлневыбран!!! ',


nil, mfError + mfOkButton);


end;


{****************************************************************************}


{*----------===== Б Л О К И Р О В К А В И Н Ч Е С Т Е Р А ======----------*}


{****************************************************************************}


procedure LockDisk;


label


end_;


var


Regs: registers;


Err : string;


Inst: byte;


begin


{Проверка наличи программы в памяти}


asm


push ax


push dx


mov Inst, 0


mov ax,1059h


mov dx,2517h


int 13h


cmp ax,2517h


jne End_


cmp dx,1059h


jne End_


mov Inst, 1


End_: pop dx


pop ax


end;


if Inst = 0 then


begin


MakeComFile(3);


{Установить защиту}


SwapVectors;


SetIntVec($09, Int09_Save);


Exec(MainDir + 'block.com', '');


GetIntVec($09, Int09_Save);


SwapVectors;


{Обраюотчикошибок}


if DosError <> 0 then


CheckExec


else


begin


regs.ah := $4D;


with regs do


msdos(regs);


case Regs.AH of


0 : MyMessageBox(' Ненормальное завершение.',


nil, mfError + mfOkButton);


1 : MyMessageBox(' Ctrl-C или Ctrl-Break.',


nil, mfError + mfOkButton);


2 : MyMessageBox(' Критическая ошибка устройства.',


nil, mfError + mfOkButton);


3 : MyMessageBox(' Винчестер блокирован.',


nil, mfInformation + mfOkButton); { TSR }


end;


end;


end


else MyMessageBox(' Защитаужеустановлена.',


nil, mfError + mfOkButton);


end;


{Изменить стандартную палитру}


function TDirDialog.GetPalette: PPalette;


const


{Синяя палитра}


CMyCluster = #64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80#81#82+


#83#84#85#86#87#88#89#90#91#92#93#94#95;


P: string [32] = CMyCluster;


begin


GetPalette := @P;


end;


{Окно работы с каталогами}


constructor TMyChDirDialog.Init(AOptions: Word; HistoryId: Word);


var


R : TRect;


ScrollBar: PScrollBar;


CurDir : DirStr;


begin


{ Создание окна }


R.Assign(16, 2, 64, 20);


TDialog.Init(R, 'Изменить катлог');


Options := Options or ofCentered;


{ Строка ввода имени каталога }


R.Assign(3, 3, 30, 4);


DirInput := New(PInputLine, Init(R, 68));


Insert(DirInput);


R.Assign(2, 2, 17, 3);


Insert(New(PLabel, Init(


R, '~И~мякаталога', DirInput)));


{ Список каталогов }


R.Assign(32, 6, 33, 16);


ScrollBar := New(PScrollBar, Init(R));


Insert(ScrollBar);


R.Assign(3, 6, 32, 16);


DirList := New(PDirListBox, Init(R, ScrollBar));


Insert(DirList);


R.Assign(2, 5, 19, 6);


Insert(New(PLabel, Init(


R, '~Д~ерево каталогов', DirList)));


{ Формирование кнопок }


R.Assign(35, 6, 45, 8);


OkButton := New(PButton, Init(


R, '~А~га', cmOK, bfDefault));


Insert(OkButton);


Inc(R.A.Y,3); Inc(R.B.Y,3);


ChDirButton := New(PButton, Init(


R, '~С~мена', cmChangeDir, bfNormal));


Insert(ChDirButton);


Inc(R.A.Y,3); Inc(R.B.Y,3);


Insert(New(PButton, Init(


R, '~Н~ека', cmCancel, bfNormal)));


if AOptions and cdNoLoadDir = 0 then SetUpDialog;


SelectNext(False);


end;


procedure TMyChDirDialog.SetUpDialog;


var


CurDir: DirStr;


begin


if DirList <> nil then


begin


CurDir := GetCurDir;


DirList^.NewDirectory(CurDir);


if (Length(CurDir) > 3) and (CurDir[Length(CurDir)] = '\') then


CurDir := Copy(CurDir,1,Length(CurDir)-1);


if DirInput <> nil then


begin


DirInput^.Data^ := CurDir;


DirInput^.DrawView;


end;


end;


end;


function TMyChDirDialog.Valid(Command: Word): Boolean;


var


P: PathStr;


begin


Valid := True;


if Command = cmOk then


begin


P := FExpand(DirInput^.Data^);


if (Length(P) > 3) and (P[Length(P)] = '\') then


Dec(P[0]);


{$I-}


ChDir(P);


if IOResult <> 0 then


begin


MyMessageBox(' Неправильный каталог!',


nil, mfError + mfOkButton);


Valid := False;


end;


{$I+}


end;


end;


{Инициализировать рабочее поле}


constructor TMyBackground.Init(var Bounds: TRect; AText: TTitleStr);


begin


inherited Init(Bounds, ' ');


Text := AText;


while Length(Text) < SizeOf(TTitleStr) - 1 do


Text := Text + AText;


end;


procedure TMyBackground.Draw;


var


DrawBuffer: TDrawBuffer;


begin


MoveStr(DrawBuffer, Text, GetColor(1));


WriteLine(0, 0, Size.X, Size.Y, DrawBuffer);


end;


procedure TMyDesktop.InitBackground;


var


R: TRect;


begin


GetExtent(R);


Background := New(PMyBackground, Init(R, '___'));


end;


{Изменить стандартную палитру}


function TMyStaticText.GetPalette: PPalette;


const


{Синяя палитра}


CMyCluster = #64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80#81#82+


#83#84#85#86#87#88#89#90#91#92#93#94#95;


P: string [32] = CMyCluster;


begin


GetPalette := @P;


end;


{Окно "О Программе"}


constructor TAboutBox.Init;


var


R: TRect;


begin


R.Assign(0, 0, 30, 16);


inherited Init(R, 'Опрограмме');


Options := Options or ofCentered;


R.Assign(10, 13, 20, 15);


Insert(New(PButton, Init(R, '~А~га', cmOK, bfDefault)));


R.Assign(11, 2, 19, 3);


Insert(New(pMyStaticText, Init(R, 'Sub Rosa')));


R.Assign(1, 4, 29, 5);


Insert(New(pStaticText, Init(R, 'СистемазащитыданныхотНСД')));


R.Assign(5, 5, 29, 6);


Insert(New(pStaticText, Init(R, 'выполненаучащимися')));


R.Assign(10, 6, 29, 7);


Insert(New(pStaticText, Init(R, 'гр. 4641')));


R.Assign(6, 7, 29, 8);


Insert(New(pStaticText, Init(R, 'ЕгановымМаксимом')));


R.Assign(14, 8, 22, 9);


Insert(New(pStaticText, Init(R, 'и')));


R.Assign(6, 9, 29, 10);


Insert(New(pStaticText, Init(R, 'ЮзефовичемАртемом')));


R.Assign(6, 11, 29, 12);P>


Insert(New(pStaticText, Init(R, 'МГВРК, Минск, 1996')));


end;


{Работа программы начинается здесь...}


constructor TMyApp.Init;


var


ReturnVal, i : Word;


DirInfo, DirInfo1, DirInfo2 : SearchRec;


DirInfo3, DirInfo4, DirInfo5: SearchRec;


Pas : string;


st : char;


begin


OptInd := 1;


{Инициализировать файл ресурсов}


MyRes.Init(New(PBufStream, Init('Setup.res', stOpen, 1024)));


if MyRes.Stream^.Status <> stOK then


begin


Write('Нарушение целостности!');


halt(1);


end;


RegisterType(RMenuBar);


{Проверить целостность системы}


MainDir := GetCurDir;


FindFirst('plus', AnyFile, DirInfo);


FindFirst('passw', AnyFile, DirInfo1);


FindFirst('block', AnyFile, DirInfo2);


FindFirst('keydisk', AnyFile, DirInfo3);


FindFirst('setup.res', AnyFile, DirInfo4);


if (DOSError = 0) and (DirInfo.Size = 1068) and (DirInfo1.Size = 204) and


(DirInfo2.Size = 617) and (DirInfo3.Size = 2118) and


(DirInfo4.Size = 522) then


begin


{Получитьпароль}


Assign(FilePass, 'system.res');


Reset(FilePass);


Pass := '';


while not EOF(FilePass) do


begin


read(FilePass, st);


Pass := Pass + st;


end;


Close(FilePass);


{Инициализировать систему}


TApplication.Init;


Pas := '';


ReturnVal := ExecuteDialog(New(PAboutBox, Init), nil);


InputBox('П А Р О Л Ь', 'Введите пароль:', Pas, 255);


for i:= 1 to length(Pas) do Pas[i] :=chr(ord(Pas[i]) xor 27);


if Pas <> Pass then


begin


MyMessageBox(' Неверныйпароль!!!', nil, mfError+mfOkButton);


ClrScr;


writeln('Несанкционированный доступ!');


Halt;


end;


end


else


begin


writeln('Нарушение целостности!');


Halt;


end;


end;


{Завершениеработы}


destructor TMyApp.Done;


begin


TApplication.Done;


MyRes.Done;


end;


{Обработкасобытий}


procedure TMyApp.HandleEvent(var Event: TEvent);


procedure ChangeDir;


var


D: PMyChDirDialog;


begin


D:= New(PMyChDirDialog, Init(cdNormal, 101));


ExecuteDialog(D, nil);


end;


var


ReturnVal: Word;


regs : Registers;


R : TRect;


begin


inherited HandleEvent(Event);


case Event.What of


evCommand:


begin


case Event.Command of


cmAboutBox : ReturnVal :=


ExecuteDialog(New(PAboutBox, Init), nil);


cmOpen : FileOpen('*.*');


cmChangeDir : ChangeDir;


cmSetPass : Plus(SetPass);


cmKeyDisk : Plus(KeyDisk);


cmCode : Shifr(FName);


cmDeCode : DeShifr(FName);


cmLockDisk : LockDisk;


cmOptions : ReturnVal :=


ExecuteDialog(New(POptions, Init), @OptFile);


cmPasswords : Passwords


end;


ClearEvent(Event);


end;


end;


end;


{Инициализировать меню}


procedure TMyApp.InitMenuBar;


var


R: TRect;


begin


{Получить меню из файла ресурсов по ключу "Config" - функция получения}


{даты BIOS; модуль SetConf}


MenuBar := PMenuBar(MyRes.Get(Config));


if MenuBar = nil then


begin


Write(' Нелегальная копия!!!');


halt(1);


end;


end;


{Инициализировать рабочее поле}


procedure TMyApp.InitDesktop;


var


R: TRect;


begin


GetExtent(R);


R.Grow(0, -1);


Desktop := New(PMyDesktop, Init(R));


end;


{Инициализировать строку состояния}


procedure tMyApp.InitStatusLine;


var


R: tRect;


begin


GetExtent(R);


R.A.Y:= R.B.Y - 1;


StatusLine:= New(pStatusLine, Init(R,


NewStatusDef(0, $FFFF,


NewStatusKey('~F1~ Опрограмме', kbF1, cmAboutBox,


NewStatusKey('~F3~ Файл', kbF3, cmOpen,


NewStatusKey('~F5~ Пароль', kbF10, cmMenu,


NewStatusKey('~F9~ Настройки', kbF9, cmOptions,


NewStatusKey('~F10~ Меню', kbF10, cmMenu,


NewStatusKey('~Alt-X~ Выход', kbAltX, cmQuit,


nil)))))),


nil)));


end;


{Изменить основную палитру}


function TMyApp.GetPalette: PPalette;


const


P: Array [apColor..apMonochrome] of string[Length(CAppColor)] =


(CAppColor, CAppBlackWhite, CAppMonochrome);


begin


P[apColor, 50] := #$11; {1F}


P[apColor, 51] := #$11; {2F}


P[apColor, 1] := #$21; {71}


GetPalette := @P[AppPalette];


end;


{Изменить палитру окна выбора файлов}


function TMyFDialog.GetPalette: PPalette;


const


{Синяя палитра}


CMyCluster = #64#65#66#67#68#69#70#71#72#73#74#75#76#77#78#79#80#81#82+


#83#84#85#86#87#88#89#90#91#92#93#94#95;


P: string [32] = CMyCluster;


begin


GetPalette := @P;


end;


{Инициализировать окно выбора файлов}


constructor TMyFileDialog.Init(AWildCard: tWildStr;


const ATitle, InputName: string;


AOptions: Word; HistoryId: Byte);


var


ScrollBar: PScrollBar;


R : TRect;


begin


{ Создание окна диалога }


R.Assign(15, 1, 64, 20);


TDialog.Init(R, ATitle);


Options:= Options or ofCentered;


WildCard:= AWildCard;


{ Строкавводаименифайла }


R.Assign(3, 3, 31, 4);


FileName:= New(PFileInputLine, Init(R, 79));


FileName^.Data^:= WildCard;


Insert(FileName);


R.Assign(2, 2, 6, 3);


Insert(New(PLabel, Init(R, InputName, FileName)));


R.Assign(31, 3, 34, 4);


Insert(New(PHistory, Init(R, FileName, HistoryId)));


{ Линейка скроллинга и список файлов }


R.Assign(3, 14, 34, 15);


ScrollBar:= New(PScrollBar, Init(R));


Insert(ScrollBar);


R.Assign(3, 6, 34, 14);


FileList:= New(PFileList, Init(R, ScrollBar));


Insert(FileList);


R.Assign(2, 5, 8, 6);


Insert(New(PLabel, Init(R, 'Файлы', FileList)));


{ Задание кнопок }


R.Assign(35, 3, 46, 5);


if AOptions and fdOpenButton <> 0 then


begin


Insert(New(PButton, Init(


R, 'Открыть', cmFileOpen, bfDefault)));


Inc(R.A.Y,3); Inc(R.B.Y,3);


end;


if AOptions and fdOkButton <> 0 then


begin


Insert(New(PButton, Init(


R, 'Ага', cmFileOpen, bfNormal)));


Inc(R.A.Y,3); Inc(R.B.Y,3);


end;


if AOptions and fdReplaceButton <> 0 then


begin


Insert(New(PButton, Init(


R, 'Замена',cmFileReplace, bfNormal)));


Inc(R.A.Y,3); Inc(R.B.Y,3);


end;


if AOptions and fdClearButton <> 0 then


begin


Insert(New(PButton, Init(


R, 'Удал.',cmFileClear, bfNormal)));


Inc(R.A.Y,3); Inc(R.B.Y,3);


end;


Insert(New(PButton, Init(


R, 'Нека', cmCancel, bfNormal)));


{ Информационная панель с параметрами файла }


R.Assign(1, 16, 48, 18);


Insert(New(PFileInfoPane, Init(R)));


SelectNext(False);


{ Загрузкакаталога }


if AOptions and fdNoLoadDir = 0 then


begin


FileList^.ReadDirectory(WildCard);


Directory:= NewStr(GetCurDir);


end;


end;


Var


MyApp: TMyApp; {Переменная основного объекта}


Begin


WriteLn('Система защиты данных от НСД. Версия 1.0 beta.'+


+' 1996 МГВРК Еганов М. Ю., Юзефович А. Г.');


GetIntVec($09,Int09_Save);


MyApp.Init;


MyApp.Run;


MyApp.Done;


SetIntVec($09, Int09_Save);


End.



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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем дипломную работу самостоятельно:
! Как писать дипломную работу Инструкция и советы по написанию качественной дипломной работы.
! Структура дипломной работы Сколько глав должно быть в работе, что должен содержать каждый из разделов.
! Оформление дипломных работ Требования к оформлению дипломных работ по ГОСТ. Основные методические указания.
! Источники для написания Что можно использовать в качестве источника для дипломной работы, а от чего лучше отказаться.
! Скачивание бесплатных работ Подводные камни и проблемы возникающие при сдаче бесплатно скачанной и не переработанной работы.
! Особенности дипломных проектов Чем отличается дипломный проект от дипломной работы. Описание особенностей.

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

Виды дипломных работ:
выпускная работа бакалавра Требование к выпускной работе бакалавра. Как правило сдается на 4 курсе института.
магистерская диссертация Требования к магистерским диссертациям. Как правило сдается на 5,6 курсе обучения.

Другие популярные дипломные работы:

Дипломная работа Формирование устных вычислительных навыков пятиклассников при изучении темы "Десятичные дроби"
Дипломная работа Технологии работы социального педагога с многодетной семьей
Дипломная работа Человеко-машинный интерфейс, разработка эргономичного интерфейса
Дипломная работа Организация туристско-экскурсионной деятельности на т/к "Русский стиль" Солонешенского района Алтайского края
Дипломная работа Разработка мероприятий по повышению эффективности коммерческой деятельности предприятия
Дипломная работа Совершенствование системы аттестации персонала предприятия на примере офиса продаж ОАО "МТС"
Дипломная работа Разработка системы менеджмента качества на предприятии
Дипломная работа Организация учета и контроля на предприятиях жилищно-коммунального хозяйства
Дипломная работа ЭКСПРЕСС-АНАЛИЗ ФИНАНСОВОГО СОСТОЯНИЯ ООО «АКТ «ФАРТОВ»
Дипломная работа Психическая коммуникация

Сейчас смотрят :

Дипломная работа Учет и аудит материально-производственных запасов
Дипломная работа Техническая эксплуатация электроустановок
Дипломная работа Теоретичні основи обліку та аудиту
Дипломная работа Анализ ассортиментной политики предприятия
Дипломная работа Совершенствование сбытовой деятельности предприятия (на примере ЗАО "Атлант")
Дипломная работа Кредитоспособность заемщика и методы ее определения
Дипломная работа Право собственности
Дипломная работа Социальная работа с малоимущими
Дипломная работа Управление мотивацией персонала
Дипломная работа Антикоррозийная обработка
Дипломная работа Учет расчетов с дебиторами и кредиторами 3
Дипломная работа Личностно-ориентированный подход как важное условие эффективности процесса обучения
Дипломная работа Самооценка деятельности ОАО "Ковылкинский электромеханический завод"
Дипломная работа Вирусные гепатиты
Дипломная работа Анализ теоретического аспекта системы обязательного пенсионного страхования России