Создание компонента для шифрования-дешифрования текста

Автор работы: Пользователь скрыл имя, 09 Апреля 2014 в 14:36, курсовая работа

Краткое описание

Аббат Тритемеус – автор первой печатной книги о тайнописи (1518 г.) – предложил несколько шифров и среди них шифр, который можно считать усовершенствованием шифра Цезаря. Этот шифр устроен так. Все буквы алфавита нумеруются по порядку (от 1 до 31 в русском варианте). Затем выбирают какое-нибудь слово, называемое "ключом", и подписывают под сообщением с повторением.

Содержание

Введение - 3 -
1. Постановка задачи - 5 -
2. Алгоритм создания компонента - 5 -
3. Исходный текст компонента - 7 -
4. Инструкция пользователя - 13 -
5. Исходный текст программы - 14 -
6. Приложение 1 - 17 -
Список литературы - 21 -

Прикрепленные файлы: 1 файл

Пояснительная записка_образец.doc

— 1.89 Мб (Скачать документ)

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Пермский национальный исследовательский политехнический университет»

Березниковский филиал

(БФ ПНИПУ)

 

 

 

 

 

 

 

 

 

 

 

 

КУРСОВАЯ РАБОТА

 

по дисциплине «Технология программирования»

«Создание компонента для шифрования-дешифрования текста»

 

 

 

 

 

 

 

 

 

Выполнил: студент группы ИВТ-09д ______________ Яковлев Д.В.

 

Дата сдачи «____» _________ 20___ г.

 

Проверил: ассистент кафедры АТП _____________Иванова Е.В.

 

Оценка «___________________»

 

Дата проверки «____» _________ 20___ г.

 

 

 

 

 

 

 

 

 

 

Березники, 2011

Содержание

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введение

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

При создании компонента шифрования текста я использовал три метода шифрования: алгоритм «Цезаря», алгоритм «Модифицированного Цезаря» и алгоритм «Скитала».

1.Алгоритм  шифрования «Цезарь»

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

Шифр назван в честь римского императора Гая Юлия Цезаря, использовавшего его для секретной переписки. Естественным развитием шифра Цезаря стал шифр Виженера. С точки зрения современного криптоанализа, шифр Цезаря не имеет приемлемой стойкости.

2.Шифр «Модифицированного Цезаря»

Аббат Тритемеус – автор первой печатной книги о тайнописи (1518 г.) – предложил несколько шифров и среди них шифр, который можно считать усовершенствованием шифра Цезаря. Этот шифр устроен так. Все буквы алфавита нумеруются по порядку (от 1 до 31 в русском варианте). Затем выбирают какое-нибудь слово, называемое "ключом", и подписывают под сообщением с повторением.

Чтобы получить шифрованный текст, складывают номер очеред-ной буквы с номером соответствующей буквы ключа. Если полученная сумма больше 31, то из нее вычитают 31. В результате получают последовательность чисел от 1 до 31. Вновь заменяя числа этой последовательности соответствующими буквами, получают шифрованный текст. Разбиваем этот текст на группы одной длины, получают шифрованное сообщение.

3. Шифр «Скитала»

 В криптографии скитала (или сцитала от греческого σκυτάλη, жезл), известный также как шифр Древней Спарты, представляет собой прибор, используемый для осуществления перестановочного шифрования, состоит из цилиндра и узкой полоски пергамента, обматывавшейся вокруг него по спирали, на которой писалось сообщение. Античные греки и спартанцы в частности, использовали этот шифр для связи во время военных кампаний.

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

Таким образом, длина блока n определялась длиной и диаметром палочки, а само шифрование заключалось в перестановке символов исходного текста в соответствии с длиной окружности палочки. Например, используя палочку, по длине окружности которой помещается 4 символа, а длина палочки позволяет записать 6 символов, исходный текст: «это шифр древней спарты» превратится в шифрограмму: «эфвптрнао ер дйтшр ыиес».

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

  Создать компонент  для шифрования – дешифрования текста тремя алгоритмами (алгоритм «Цезаря», алгоритм «Модифицированного Цезаря», алгоритм «Скитала») и применить его в программе.

 

2. Алгоритм создания компонента

  1. Для создания компонента нужно сначала определить визуальный он будет или нет.
  2. Теперь нужно выбрать предка. Как правило, используются в виде предков TComponent, TControl, TWinControl, TGraphicControl, TCustomXXXXXX, а также все компоненты палитры компонентов. Для своего компонента я взял предка TOpenDialog.
  3. В Borland Delphi в меню Component мы выбираем пункт New Component.
  4. Далее выводится небольшая таблица для нового компонента:

    • Ancestor type – выбираем предка для компонента;
    • Class Name – имя класса для компонента;
    • Palette Page – выбираем вкладку на которой будет наш компонент. В данном случае мы создали новую вкладку с названием My Component.
    • Поля Unit file name и Search path определяются автоматически и в них ничего вводить не нужно.
  1. При нажатии кнопки ОК появляется шаблон нашего будущего компонента.
  1. Переопределяем конструктор у этого компонента:
    • В директиве public вставляем строку

constructor Create(AOwner: TComponent); override;

    • нажатие на этой строке Ctrl + Shift + C создает шаблон для этого метода, внутри которого мы вставляем такие строки:

inherited Create(AOwner); {Вызываем унаследованный  конструктор} 
Options := Options + [ofFileMustExist, ofPathMustExist]; {Выполняем необходимые нам действия}

  1. Теперь нужно сохранить и установить созданный компонент.
  2. В меню Component выбираем пункт Install Component…

  1. В поле Unit file name указываем имя нашего сохранённого модуля и нажимаем ОК.
  2. Тут появиться сообщение «Такой то пакет будет изменён. Продолжить?», на это сообщение мы нажимаем кнопку ОК.

  1. Теперь на в новой вкладе My component появился наш собственный компонент  ShifText.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. Исходный текст компонента

unit ShifText;

interface

uses

  SysUtils, Classes, Dialogs;

 

type

  TShifText = class(TOpenDialog)

  private

    { Private declarations }

  protected

    { Protected declarations }

  public

  function AlgCez(S,Cl:string):string;

  function DeAlgCez(S,Cl:string):string;

  function AlgVijen(S,Cl:string):string;

  function DeAlgVijen(S,Cl:string):string;

  function AlgSkit(S,Cl:string):string;

  function DeAlgSkit(S,Cl:string):string;

  constructor Create(AOwner: TComponent); override;

    { Public declarations }

  published

    { Published declarations }

  end;

 

procedure Register;

 

implementation

 

procedure Register;

begin

  RegisterComponents('My Component', [TShifText]);

end;

 

{ TShifText }

 

constructor TShifText.Create(AOwner: TComponent);

begin

inherited Create(AOwner); {Вызываем унаследованный конструктор}

Options := Options + [ofFileMustExist, ofPathMustExist]; {Выполняем необходимые нам действия}

end;

 

function TShifText.AlgCez(S,Cl:string):string;

var i,k,k1,a,Cluch:Integer;

begin

  Cluch:=StrToInt(Cl);

  for i:=1 to Length(S) do

   begin

    k:=Ord(S[i]);

      k1:=k+Cluch;

      if (k1>=255) then

       begin

        a:=k1-255;

        k1:=a+1;

       end;

   S[i]:=Chr(k1);

   end;

Result:=S;

end;

 

function TShifText.DeAlgCez(S,Cl:string):string;

var i,k,k1,a,Cluch:integer;

begin

Cluch:=StrToInt(Cl);

  for i:=1 to Length(S) do

   begin

    k:=Ord(S[i]);

      k1:=k-Cluch;

      if (k1<=1) then

       begin

        a:=1-k1;

        k1:=255-a;

       end;

   S[i]:=Chr(k1);

   end;

Result:=S;

end;

 

function TShifText.AlgVijen(S,Cl:string):string;

var i,k,k1,a,Cluch,Cl1:Integer;

begin

Cluch:=StrToInt(Cl);

Cl1:=1;

  for i:=1 to Length(S) do

   begin

    k:=Ord(S[i]);

    if Cl1<Cluch then

      begin

       k1:=k+Cl1;

       if k1>=255 then

        begin

         a:=k1-255;

         k1:=a+1;

        end;

     end

      else if Cl1=Cluch then

       begin

        k1:=k+Cl1;

        if k1>=255 then

         begin

          a:=k1-255;

          k1:=a+1;

         end;

       end

    else

     begin

      Cl1:=1;

      begin

      k1:=k+Cl1;

      if k1>=255 then

       begin

        a:=k1-255;

        k1:=a+1;

       end;

      end;

     end;

    S[i]:=Chr(k1);

    Cl1:=Cl1+1;

   end;

Result:=S;

end;

 

function TShifText.DeAlgVijen(S,Cl:string):string;

var i,k,k1,a,Cluch,Cl1:integer;

begin

Cluch:=StrToInt(Cl);

Cl1:=1;

for i:=1 to Length(S) do

  begin

   k:=Ord(S[i]);

   k1:=k-1;

   if Cl1<Cluch then

    begin

     k1:=k-Cl1;

     if k1<=1 then

      begin

       a:=1-k1;

       k1:=255-a;

      end;

    end

     else if Cl1=Cluch then

      begin

       k1:=k-Cl1;

       if k1<=1 then

        begin

         a:=1-k1;

         k1:=255-a;

        end;

      end

     else

      begin

       Cl1:=1;

       k1:=k-Cl1;

       if k1<=1 then

        begin

         a:=1-k1;

         k1:=255-a;

        end;

      end;

    S[i]:=Chr(k1);

    Cl1:=Cl1+1;

    end;

Result:=S;

end;

 

function TShifText.AlgSkit(S,Cl:string):string;

var S1,n:string;i,j,a,Cl2,Cl1,d:integer;mas:array of array of string;

begin

Cl2:=StrToInt(Cl);

if (Length(S) mod Cl2=0) then Cl1:=(Length(S)div Cl2)

else

  Cl1:=(Length(S)div Cl2)+1;

a:=1;

Setlength(mas,Cl2,Cl1+1);

for j:=0 to Cl1 do

  for i:=0 to Cl2-1 do

   if a<=Length(S) then

    begin

     if (Ord(S[a])=13) then S[a]:=Char(149);

     if (Ord(S[a])=10) then inc(a);

     mas[i,j]:=S[a];

     inc (a);

    end

   else

    begin

     mas[i,j]:=' ';

     inc (a);

    end;

S1:='';

n:='';

for i:=0 to Cl2-1 do

  for j:=0 to Cl1-1 do

   begin

    n:=mas[i,j];

    S1:=S1+n;

    inc (a);

   end;

Result:=S1;

end;

 

function TShifText.DeAlgSkit(S,Cl:string):string;

var S1,n:string;i,j,a,Cl2,Cl1,k:integer;mas:array of array of string;

begin

k:=0;

Cl2:=StrToInt(Cl);

if (Length(S) mod Cl2=0) then Cl1:=(Length(S)div Cl2)

else

Cl1:=(Length(S)div Cl2)+1;

a:=1;

Setlength(mas,Cl1+1,Cl2);

for j:=0 to Cl2-1 do

  for i:=0 to Cl1-1 do

   if a<=Length(S) then

    begin

     if (Ord(S[a])=149) then S[a]:=Char(13);

     if (Ord(S[a])=10) then inc(a);

     mas[i,j]:=S[a];

     inc (a);

    end

   else

    begin

     mas[i,j]:=' ';

     inc (a);

    end;

n:='';

S1:='';

for i:=0 to Cl1-1 do

  for j:=0 to Cl2-1 do

   begin

    n:=mas[i,j];

     begin

      S1:=S1+n;

      inc (k);

     end;

   end;

Result:=S1;

end;

end.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. Инструкция пользователя

Данная программа «Шифратор-дешифратор» (внешний вид программы до начала работы,  Приложение 1, Рис. 1) обладает следующими возможностями:

    • Для работы с программой «Шифратор-дешифратор» текст для последующего шифрования можно вводить вручную, а можно открыть файл с текстом (Файл ->Открыть, Приложение 1, Рис. 2).
    • Для шифрования текста выбранным алгоритмом нажимаем соответствующую кнопку на форме (Приложение 1, Рис. 3), если программа обнаружит, что текст не введен или файл не открыть выйдет предупреждение (Приложение 1,     Рис. 4).
    • Для дешифрования текста выбранным алгоритмом нажимаем соответствующую кнопку на форме (Приложение 1, Рис. 5).
    • Для просмотра инструкции пользователя программы, в меню «Файл» выбираем пункт «Справка» (Дополнительно ->Справка, Приложение 1, Рис. 6).
    • Для просмотра дополнительной информации по программе (алгоритмы шифрования используемые в данной программе, дата разработки, данные о разработчике), в меню «Дополнительно» выбираем пункт «О программе…» (Дополнительно ->О программе…,  Приложение 1, Рис. 7).
    • В программе существует возможность просмотра примерного алгоритма шифрования-дешифрования текста, для этого нажимаем на форме на название алгоритма (Приложение 1, Рис. 8).
    • Для очистки всех окон программы есть кнопка «Очистить».
    • Для выхода из программы кнопка «Выход».

 

 

 

 

 

 

 

 

 

 

5. Исходный текст программы

unit Unit1;

interface

uses

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

  Dialogs, StdCtrls, Menus, ShifText, ExtCtrls, jpeg, Spin, XPMan;

 

implementation

uses Unit2, Unit3;

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

var s:string; //шифрования текст  алгоритмом "Цезаря";

begin

if (Memo1.Text<>'')and(SpinEdit1.Text<>'') then   //если поле не пустое  то

  begin

  Memo2.Text:=ShifText1.AlgCez(Memo1.Text,SpinEdit1.Text); //применаем алгоритм шифрации к тексту;

  end else   //иначе выводим  сообщение об ошибке;

  begin

  s:='Сначало введите  текст  или откройте текстовый  файл!!!'#13#10;

  MessageBox(handle,PChar(S),'Ошибка!',MB_OK or MB_ICONWARNING);

  end;

end;

 

procedure TForm1.N2Click(Sender: TObject);

begin

if ShifText1.Execute then

  begin

   Memo1.Lines.LoadFromFile(ShifText1.FileName);

   end;

end;

 

procedure TForm1.Button3Click(Sender: TObject);

var s:string; //дешифрование текста  алгоритмом "Цезаря";

begin

if (Memo2.Text<>'')and(SpinEdit1.Text<>'') then

  begin

  Memo5.Text:=ShifText1.DeAlgCez(Memo2.Text,SpinEdit1.Text);

  end else   //иначе выводим  сообщение об ошибке;

  begin

  s:='Сначало введите  текст или откройте текстовый  файл!!!'#13#10;

  MessageBox(handle,PChar(S),'Ошибка!',MB_OK or MB_ICONWARNING);

  end;

end;

 

procedure TForm1.Button4Click(Sender: TObject);

var s:string; //шифрования текст  алгоритмом "Модифицированного Цезаря";

begin

if (Memo1.Text<>'')and(SpinEdit1.Text<>'') then

  begin

  Memo3.Text:=ShifText1.AlgVijen(Memo1.Text,SpinEdit1.Text); //применаем алгоритм шифрации к тексту;

  end else   //иначе выводим  сообщение об ошибке;

  begin

  s:='Сначало введите  текст или откройте текстовый  файл!!!'#13#10;

  MessageBox(handle,PChar(S),'Ошибка!',MB_OK or MB_ICONWARNING);

  end;

end;

 

procedure TForm1.Button5Click(Sender: TObject);

var s:string; //дешифрование текста  алгоритмом "Модифицированного Цезаря";

begin

if (Memo3.Text<>'')and(SpinEdit1.Text<>'') then

  begin

  Memo6.Text:=ShifText1.DeAlgVijen(Memo3.Text,SpinEdit1.Text); //применаем алгоритм дешифрации к тексту;

  end else   //иначе выводим  сообщение об ошибке;

  begin

  s:='Сначало введите  текст или откройте текстовый  файл!!!'#13#10;

  MessageBox(handle,PChar(S),'Ошибка!',MB_OK or MB_ICONWARNING);

  end;

end;

 

procedure TForm1.Button6Click(Sender: TObject);

var s:string; //шифрование текста  алгоритмом "Скитала";

begin

if (Memo1.Text<>'')and(SpinEdit1.Text<>'') then

  begin

  Memo4.Text:=ShifText1.AlgSkit(Memo1.Text,SpinEdit1.Text); //применаем алгоритм дешифрации  к тексту;

  end else   //иначе выводим  сообщение об ошибке;

  begin

  s:='Сначало введите  текст или откройте текстовый  файл!!!'#13#10;

  MessageBox(handle,PChar(S),'Ошибка!',MB_OK or MB_ICONWARNING);

  end;

end;

 

procedure TForm1.Button7Click(Sender: TObject);

Информация о работе Создание компонента для шифрования-дешифрования текста