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

Способ построения таблицы Вижинера

Алгоритм построения таблицы Вижинера приведен ниже.

for i:=0 to 1 do

  begin

     for j:=0 to 36 do

       begin

         a[i,j]:=s[j+1];

         write(f1,a[i,j]);

       end;

     writeln(f1);

  end;

stroka:=1;

for i:=2 to 37 do

 begin

    for j:=0 to 36 do

       begin

         n:=(j+stroka) mod 37;

         if (n=37) then n:=0;

         a[i,j]:=s[n+1];

         write(f1,a[i,j]);

       end;

    stroka:=stroka+1;

    writeln(f1);

 end;

В первом блоке, состоящем из одного цикла “for”, заполняются две первых строки таблицы. Они одинаковые и будут такими же по размеру и набору символов, как данный нам алфавит. Во втором цикле блоке, состоящем из двух циклов “for”, заполняются последующие строки таблицы, начиная с третей. Перед вторым блоком переменной “stroka” присваивается значение 1. Это говорит о том, что третья строка будет заполняться, начиная со второй буквы алфавита (алфавит нумеруется начиная с 1, а элементы таблица начиная с 0). После прохода второго цикла “for” во втором блоке, переменная “stroka” увеличится на 1. То есть 4-я строка будет заполняться, начиная с 3-ей буква данного нам алфавита. Переменная “n” определяет номер символа в строке таблицы Вижинера. Каждый новый элемент таблицы записывается в файл.

Скриншотыработыпрограммы

Исходныйкодпрограммы

unit Unit1;

interface

uses

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

  Dialogs, StdCtrls, Buttons, ExtCtrls, Menus;

type

  TForm1 = class(TForm)

    Memo1: TMemo;

    Button1: TButton;

    Memo2: TMemo;

    LabeledEdit1: TLabeledEdit;

    Button2: TButton;

    Label1: TLabel;

    Label2: TLabel;

    Memo3: TMemo;

    Button3: TButton;

    Label3: TLabel;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

 private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

  s,key: string;

  a:array[0..37,0..36] of char;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var z,i,j,n,m,stroka:integer;

    f,f1:TextFile;

    o_t,c_t:string;

    k1:string;

begin

s:='0123456789abcdefghijklmnopqrstuvwxyz:';

AssignFile(f1,'alfavit1.txt');

Rewrite(f1);

for i:=0 to 1 do

  begin

     for j:=0 to 36 do

       begin

         a[i,j]:=s[j+1];

         write(f1,a[i,j]);

       end;

     writeln(f1);

  end;

stroka:=1;

for i:=2 to 37 do

 begin

    for j:=0 to 36 do

       begin

         n:=(j+stroka) mod 37;

         if (n=37) then n:=0;

         a[i,j]:=s[n+1];

         write(f1,a[i,j]);

       end;

    stroka:=stroka+1;

    writeln(f1);

 end;

closefile(f1);

o_t:=string(Memo1.text);

key:=string(LabeledEdit1.Text);

k1:=key;

repeat

 key:=key+k1;

until length(o_t)<length(key);

if length(key)>length(o_t) then key:=copy(key,1,length(o_t));

c_t:='';

for z:=1 to length(o_t) do

begin

 for j:=0 to 36 do

     if (a[0,j]=o_t[z]) then break;

 for i:=1 to 37 do

     if (a[i,0]=key[z]) then break;

     c_t:=c_t+a[i,j];

end;

Memo2.Text:='';

Memo2.Text:=Memo2.Text+c_t;

end;

procedure TForm1.Button2Click(Sender: TObject);

var f:TextFile;

    i,j:integer;

    s:string;

begin

AssignFile (f,'o_text.txt');

reset (f);

Memo1.Text:='';

while not eof(f) do

begin

readln(f,s);

Memo1.Text:=Memo1.text+s;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

var b,c_t,k1,o_t: string;

    z,i,j:integer;

 begin

c_t:=string(Memo2.Text);

for z:=1 to length(c_t) do

begin

// b:=c_t[z];

  for i:=1 to 37 do

     if (a[i,0]=key[z]) then break;

 for j:=0 to 36 do

     if (a[i,j]=c_t[z]) then break;

     o_t:=o_t+a[0,j];

end;

Memo3.Text:=Memo3.Text+o_t;

end;

procedure TForm1.N2Click(Sender: TObject);

 begin

  AboutBox.ShowModal;

 end;

end.

Результаты работы программы

Ключ: university

Текст который необходимо зашифровать:

happy:birthday:to:you:happy:birthday:dear:inna:happy:birthday:to:you:

Зашифрованныйтекст:

ax6jbq2:jqa:ssdjfhqlnmz42fph3fkfz7oorv67km:h00rz2mikh5whkz57rmaidofbs

Расшифрованныйтекст:

happy:birthday:to:you:happy:birthday:dear:inna:happy:birthday:to:you:

Выводы

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