Способ построения таблицы Вижинера
Алгоритм построения таблицы Вижинера приведен ниже.
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:
Выводы
В ходе выполнения работы я приобрел умения и навыки шифровать и расшифровывать данные с помощью шифра Вижинера, а также строить таблицу Вижинера для заданного алфавита. Мной была написана программа, которая реализует алгоритмы: построения таблицы Вижинера, зашифрования и расшифрования данных.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.