Шифрование данных

Оглавление

ВВЕДЕНИЕ 2

1. ОСНОВНЫЕ ПОНЯТИЯ ЗАЩИТЫ ИНФОРМАЦИИ 4

1.1. Принципы ООП 5

2. АНАЛИЗ ТЕХНИЧЕСКОГО ЗАДАНИЯ И ПОСТАНОВКА ЗАДАЧИ ПРОЕКТИРОВАНИЯ. 12

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

2.2. Разработка экранных форм и алгоритма программы 13

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

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

Список использованной литературы. 17

Приложение 1. 18

 

    ВВЕДЕНИЕ

    Шифрование — способ преобразования открытой информации в закрытую и обратно. Применяется для хранения важной информации в ненадёжных источниках или передачи её по незащищённым каналам связи. Согласно ГОСТ 28147-89, шифрование подразделяется на процесс зашифровывания и расшифровывания.

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

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

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

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

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

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

    Криптоанализ - занимается вскрытием шифра без  знания ключа (проверка устойчивости шифра).

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

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

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

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

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

  1. ОСНОВНЫЕ  ПОНЯТИЯ ЗАЩИТЫ ИНФОРМАЦИИ

    Основными понятиями объектно-ориентированного программирования (ООП) являются объект и класс. Понятие «объект» может  быть определено следующим образом.

    Объект - это нечто, обладающее состоянием, поведением и идентичностью.

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

    Идентичность - это такое свойство объекта, которое  отличает его от всех других объектов.

    Состояние объекта характеризуется перечнем (обычно статическим) всех свойств данного  объекта и текущими (обычно динамическими) значениями каждого из этих свойств.

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

    Термины «экземпляр класса» и «объект» взаимозаменяемы. Классы вступают между собой в  некоторое отношение, называемое иерархией  наследования. Наследование - это такое  отношение между классами, когда  один класс повторяет структуру  и поведение другого класса (одиночное  наследование) или других классов (множественное  наследование).

    Объектно-ориентированное  программирование - это методология  программирования, основанная на представлении  программы в виде совокупности объектов, каждый из которых является объектом определенного класса, а классы образуют иерархию наследования.

    В данном определении можно выделить три части:

    1. ООП использует в качестве  базовых элементов объекты, а  не алгоритмы,

    2. каждый объект является экземпляром  какого-либо определенного класса

    3. классы организованы иерархически.

    Программа будет объектно-ориентированной  только при соблюдении всех трех указанных  условий.

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

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

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

    - объекты относятся к соответствующим  типам (классам);

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

    Согласно  этому определению такие языки  как С++, Borland Delphi и Object Pascal являются объектно-ориентированными.

    1. Принципы  ООП

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

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

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

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

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

    type

    TMyObject = class (TObject)

    MyField: integer;

    Function MyMethod: integer;

    End;

    Переменные  типа класс называют экземплярами класса или объектами. Из чего состоит объект? Поля объекта аналогичны полям записи. Это - данные, уникальные для каждого  созданного в программе экземпляра класса. Описанный здесь класс TMyObject имеет одно поле - MyField. В отличие  от полей, методы у двух объектов одного класса общие. Методы - это процедуры  или функции, описанные класса и  предназначенные для операций над  его полями. В состав класса входит указатель на таблицу, где содержится вся информация, нужная для вызова методов. От обычных процедур и методы отличаются тем, что им при вызове передается указатель на тот объект, который их вызвал. Поэтому обрабатываться будут поля именно того объекта, который вызвал метод. Внутри метода указатель на вызвавший его объект доступен под зарезервированным именем Self. Для описания реализации методов класса используется следующая запись:

    Function TMyObject.MyMethod;

    begin

    . . .

    end;

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

    TSimpleObject = class

    Fx, Fy : integer;

    Procedure SetXY(x,y : integer);

    Procedure GetXY(var x,y : integer);

    End;

    Procedure TSimpleObject.SetXY(x,y : integer); {- также неявно передается указатель Self )

    Begin

    Fx := x; {указатель Self перед Fx опущен, но подразумевается}

    Self.Fy := y; {указатель Self перед Fy есть, но  мог бы быть опущен}

    End;

    Procedure TSimpleObject.GetXY(var x,y : integer);

    Begin

    . . .

    End;

    Var

    01, 02, 03: TSimpleObject; {создаем три объекта  – то есть набора полей}

    xl,yl: integer;

    Begin

    . . .

    01.SetXY(10,20) ; {устанавливаем значения полей  первого объекта}

    02.SetXY(ll,22) ; { устанавливаем значения полей  второго объекта }

    03.SetXY (-10, 0) ; { устанавливаем значения полей  третьего объекта }

    02.GetXY(xl,yl); {xl,yl примут значения 11,22, т.к. работаем  с объектом 02}

    End;

    Как видно из примера, указатель Self явно используется крайне редко, хотя и постоянно  подразумевается.

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

    Разрешено опережающее объявление классов, как  в следующем пример

    Type

    TFirstObject = class;

    TSecondObject = class (TOsject);

    First: TFirstOsject;

    . . .

    end;

    TFirstObject = class (TObject)

    . . .

    end;

    Чтобы использовать новый тип в программе, нужно, как минимум, объявить переменную этого типа, которая как уже  было сказано называется экземпляром  класса или объектом:

    Var

    AMyObject: TMyObject;

    Вызов методов класса и доступ к его  полям осуществляется аналогично доступу  к полям записи. Например:

    AMyObject.Field:=10;

    Writeln(AMyObject.MyMethod);

    Между терминами класс и объект существует четка граница: класс - это описание, объект - то, что создано в соответствии с этим описанием.

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

    TObStack= class(TObject)

    procedure InStack(Elem:TElem);

    function OutStack(var Elem:TElem):boolean;

    . . .

    End;

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

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

    procedure InStack(var Stack:TStack,var TopStack:integer, Elem: TElem);

    function OutStack(var Stack:TStack,var TopStack:integer, var Elem: TElem) : boolean;

    При использовании динамики:

    procedure InStack(var TopStack:TTopStack, Elem:TElem);

    function OutStack(var TopStack:TTopStack, var Elem: TElem) :boolean;

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

    Описание  объекта не является полным, отсутствуют  элементы, отвечающие за создание и  уничтожение объекта. .

    Описание  объекта также не является полным.

    Использование:

    Var

    DSStack:TDObStack;

    SStack:TSObStack;

    . . .

    A:TElem;

    Begin

    . . .

    DStack.InStack(a);

    SStack.InStack(a);

    . . .

    if not (DStack.OutStack(a)) writeln(‘Динамический стек пуст’);

    if not (SStack.OutStack(a)) writeln(‘Статический стек пуст’);

    . . .

    End;

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

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

 

    

  1. АНАЛИЗ  ТЕХНИЧЕСКОГО ЗАДАНИЯ  И ПОСТАНОВКА ЗАДАЧИ ПРОЕКТИРОВАНИЯ.
    1. Постановка  задачи.

    Целью данной курсовой работы является создание программы шифрования и дешифрования текстового файла в среде Delphi.

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

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

    «Borland Delphi» может использовать объекты, содержащее множество однотипных элементов, которые называются массивами. Массив – это формальное обледенение нескольких однотипных объектов (чисел, символов, строк и т.п.), рассматриваемое как единое целое. Для хранения содержимого типизированного файла и обработки удобно использовать массивы с элементами типа запись. Удобство массивов заключается в том, что можно обращаться к отдельному элементу массива по номеру. Дополнительное удобство привносят динамические массивы, отличительной особенностью которых является возможность динамического изменения размерности массива, то есть динамическое выделение или освобождение памяти под требуемое в данный момент количество элементов массива.

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

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

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

  • загрузки и сохранения файла;
  • просмотра исходного и шифрованного сообщения;
  • удобный и понятный интерфейс;
  • несколько видов шифрования информации.
    1. Разработка  экранных форм и алгоритма  программы

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

    

    Рис.1 Внешний вид окна программы.

    Таблица 1.1. – Объекты экранной формы, отображенной на рис.1.

    Имя     Назначение
    RichEdit1     Поле  ввода исходного сообщения
    RichEdit2     Поле  вывода сообщения после кодировки
    RadioButton1- RadioButton8     Пункт выбора способа шифрования\дешифрования
    Button1     Кнопка  запуска процесса
    TabSheet1     Вкладка выбора действий
    TabSheet2     Вкладка выбора действий
    TabSheet3     Вкладка выбора действий
    1. Описание  программы.

    После формирования интерфейса и  написания  кода программы (приложенного к данной курсовой работе в Приложении 1). На выходе мы получаем исполняемый файл DeCoder.exe размером 602112 байт.

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

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

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

    В меню «Дополнительно» содержится информация о разработчике программы.

 

    

    Заключение.

 

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

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

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

 

    Список использованной литературы.

  1. А.Федоров. Delphi 2.0 для всех. М.: ТОО фирма "КомпьютерПресс", 1997. 464 с. введение в Delphi "с нуля". Может служить начальным пособием, но кое-какие куски книги доступны и нужны только системным программистам. К рекомендациям и примерам данной книги стоит относиться с большой осторожностью: автор часто придумывает в качестве примеров проблемы, которые не нужно решать.
  2. П.Г.Дарахвелидзе, Е.П.Марков.Delphi4. Среда визуального программирования.-СПб.:БХВ – Санкт-Петербург, 1999. – 816 с.      профессиональное справочное руководство. Не заменяет, а дополняет предыдущую книгу. Незаменима при разработке ActiveX и приложений на основе COM.
  3. Молдовян А. А., Молдовян Н. А., Советов Б. Я. Криптография. СПб.: «Лань», 2000.
  4. Рябко Б.Я., Фионов А.Н. Основы современной криптографии для специалистов в информационных технологиях. М.: Научный мир, 2004. ISBN 5-89176-233-1.