ЛАБОРАТОРНАЯ РАБОТА ПО ДИСЦИПЛИНЕ
"ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ"
Система шифрования Вижинера
бала опубликована в 1856 г. и является одной из старейших и наиболее известных
многоалфавитных систем. Свое название получила по имени французского дипломата
16 века Блеза Вижинера,
который развивал и совершенствовал криптографические системы. Ниже приведена
таблица Вижинера для русского алфавита.

Рис 5. Таблица Вижинера.
Она используется для зашифрования и
расшифрования. Таблица имеет два входа:
1.
верхнюю
строку символов, используемую для считывания исходной буквы открытого текста
2.
левый
крайний столбец – для букв ключа
При шифровании исходного сообщения его выписывают в строку, а под
ним записывают ключевое слово. Если ключ оказался короче сообщения, то его
циклически повторяют. В процессе шифрования находят в верхней строке таблицы
очередную букву исходного текста и в левом столбце очередное значение ключа.
Очередная буква шифротекста находится на пересечении
столбца, определяемого шифруемой буквой, и строки, определяемой числовым
значением ключа.
Пример:
Возьмем ключевое слово КЛЮЧ
Исходный текст – ШИФРОВАНИЕ
Выпишем исходное сообщение в строку и запишем
под ним ключевое слово с повторением. В третью строку будем выписывать буквы шифротекста, определяемые из таблицы Вижинера.
Сообщение
Ш И Ф Р
О В А Н И Е
Ключ К Л Ю Ч К Л Ю Ч К Л
Шифротекст В У Т
З Ш Н Ю Д Т Р
Расшифрование осуществляется следующим
образом:
В верхней строке находят очередную букву
ключа. В столбце где находится эта буква ищут
очередную букву шифротекста, и, если ее нашли, то
расшифрованному тексту присваивается первая буква в этой строке.
Напишем теперь программу. Разместите на форме
следующие компоненты и измените их свойства в соответствии с рисунком 7.

Рис 6. Форма после размещения компонентов.
Напишем обработчик OnCreate формы
procedure
TForm1.FormCreate(Sender: TObject);
var i,j,L:integer;
begin
kir:='АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
for i:=1 to sg.ColCount-1 do sg.Cells[i,0]:=kir[i]; //
for j:=0 to sg.RowCount do sg.Cells[0,j+1]:=inttostr(j);
sg.Cells[0,0]:='Ключ';
L:=1;
// заполнение таблицы буквами
FOR I:=1 TO SG.ColCount-1 DO BEGIN
FOR J:=1 TO
SG.RowCount-1 DO BEGIN
SG.CELLS[I,J]:=KIR[L];
IF L=32 THEN L:=0;
L:=L+1;
END;
L:=I+1;
END;
end;
Переменную Kir опишите
глобально.
Напишем обработчик кнопки ШИФРОВАТЬ
procedure
TForm1.Button1Click(Sender: TObject);
var kl,txt,RES,j:string;
dl_kl,dl_txt,i,i1,j1,ns,nst:integer;
begin
RES:='';// окончательный текст
kl:=edit1.Text; // ключ
txt:=edit2.Text; // исходный текст
dl_kl:=length(kl); // длина ключевого
слова
dl_txt:=length(txt); // длина исходного
текста
i:=1;
WHILE dl_kl<>dl_txt do begin
kl:=kl+copy(KL,i,1);
dl_kl:=length(kl);
i:=i+1;
end;
for i:=1 to dl_txt do BEGIN // собственно шифрование
for i1:=1 to sg.ColCount do
if txt[i]=sg.Cells[i1,0] then begin
ns:=i1;
end;
for j1:=1 to sg.RowCount do
if COPY(KL,I,1)=sg.Cells[1,j1] then begin
nst:=j1;
end;
RES:=RES+SG.Cells[NS,NST];
END;
LABEL3.Caption:=RES;
end;
далее напишите код кнопки РАСШИФРОВАТЬ
procedure
TForm1.Button2Click(Sender: TObject);
var kl,txt,RES,j:string;
dl_kl,dl_txt,i,i1,j1,ns,nst:integer;
begin
RES:='';
kl:=edit1.Text;
txt:=label3.Caption;
dl_kl:=length(kl);
dl_txt:=length(txt); i:=1;
WHILE dl_kl<>dl_txt do begin
kl:=kl+copy(KL,i,1);
dl_kl:=length(kl);
i:=i+1;
end;
for i:=1 to dl_kl do begin // собственно расшифрование
for i1:=1 to sg.ColCount do
if kl[i]=sg.Cells[i1,0] then begin
ns:=i1;
end;
for j1:=1 to sg.RowCount do
if copy(txt,i,1)=sg.Cells[ns,j1] then begin
NST:=J1;
end;
res:=res+sg.Cells[1,NST];
end;
label4.Caption:=RES;
end;
Второй вариант
шифра
Используется специальный ключ. Буквы, из
которых будет строиться сообщение, нумеруется в естественном порядке. В
качестве ключа выбирается произвольная комбинация букв из этого алфавита. Под
буквами сообщения записывается ключ, если необходимо, то он повторяется, и
затем складываются цифровые эквиваленты букв сообщения и ключа по модулю
количества букв в алфавите. Дешифрование производится в обратном порядке.
Пример.
Возьмем латинский алфавит A B C D E F…L… R
S V … X Y Z
0 1 2 3
4 5 11 17 18 19 23 24 25
Зашифруем CAREFUL – осторожный.
В качестве ключа возьмем P I E S – 15 8 4 18
|
C |
A |
R |
E |
F |
U |
L |
||
|
2 |
0 |
17 |
4 |
5 |
20 |
11 |
||
|
P |
I |
E |
S |
P |
I |
E |
||
|
15 |
8 |
4 |
18 |
15 |
8 |
4 |
||
|
- зашифрованное сообщение |
8 |
21 |
22 |
20 |
2 |
15 |
Расшифруем полученное сообщение.
![]()
|
17 |
8 |
21 |
22 |
20 |
2 |
15 |
|
P |
I |
E |
S |
P |
I |
E |
|
15 |
8 |
4 |
18 |
15 |
8 |
4 |
|
2 |
0 |
17 |
4 |
5 |
20 |
11 |
|
C |
A |
R |
E |
F |
U |
L |
Создайте такую форму

код
кнопки Открыть
if opendialog1.Execute then
memo1.Lines.LoadFromFile(opendialog1.FileName);
код
кнопки Шифровать
procedure TForm1.Button2Click(Sender: TObject);
var dl_txt,dl_kl,dl_kir:integer;
txt,kl,shifr:string;
i,j,i1,res,k,k1,j1:integer;x:char;
begin
j:=0;// номер 1 буквы
for x:='а' to 'я' do begin
kir[j]:=x; // забиваем массив буквами и нумеруем их
inc(j);
// увеличиваем номер на 1
end;
res:=0; // результат шифрования не известен пока
txt:=memo1.Text; // переменной txt
присваиваем открытый текст в memo - поле
memo1.Text:=''; // очищаем поле
kl:=edit1.Text; // переменной kl присвиваем ключевое слово
dl_txt:=length(txt);// считаем
длину открытого текста
dl_kl:=length(kl); // считаем
длину ключевого слова
shifr:='';
i:=1;//
номер первой буквы открытого текста
i1:=1; // номер первой буквы ключевого слова
while (i<=dl_txt) do //пока номер буквы не равен длине открытого
текста то выполнять
begin
if
i1>dl_kl
then i1:=1; // если очередной номер буквы > длины кл.слова то номеру:=1,
//
т.е. берем опять первую букву
res:=0; // обнуляем
результат
k:=0;
// обнуляем параметры
k1:=0;
for j1:=0 to
high(kir) do begin // перебор номеров букв алфавита
if
txt[i]=kir[j1] then k:=j1; // если i-ая буква откр.текста=букве алфавита то запоминаем номер этой буквы в
алфавите
if
kl[i1]=kir[j1]
then k1:=j1 // если i1-ая буква кл.слова=букве
алфавита то запоминаем номер этой буквы в алфавите
end;
res:=(k+k1) mod high(kir);
// складываем номера этих букв по модулю с количеством букв в алфавите
shifr:=shifr+kir[res];// рез-ту := букву находящуюся под номером res в алфавите
i:=i+1;//
берем следующую букву откр.текста
i1:=i1+1;//берем
следующую букву кл.слова
end;
memo1.Text:=shifr; // окончательный вывод шифрованного текста
end;
код
кнопки Расшифровать
procedure TForm1.Button3Click(Sender: TObject);
var dl_txt,dl_kl,dl_kir:integer;
txt,kl,shifr:string;
i,j,i1,res,k,k1,j1:integer;x:char;
begin
j:=0;// номер 1 буквы
for x:='а' to 'я' do begin
kir[j]:=x; // забиваем массив буквами и нумеруем их
inc(j);
// увеличиваем номер на 1
end;
res:=0; // результат расшифрования не известен пока
txt:=memo1.Text; // переменной txt
присваиваем шифрованный текст в memo - поле
memo1.Text:=''; // очищаем поле
kl:=edit1.Text; // переменной kl присвиваем ключевое слово
dl_txt:=length(txt);// считаем
длину шифрованного текста
dl_kl:=length(kl); // считаем
длину ключевого слова
shifr:='';
i:=1;//
номер первой буквы шифрованного текста
i1:=1; // номер первой буквы ключевого слова
while (i<=dl_txt) do //пока номер буквы не равен длине
шифрованного текста то выполнять
begin
if
i1>dl_kl
then i1:=1; // если очередной номер буквы > длины кл.слова то номеру:=1,
//
т.е. берем опять первую букву
res:=0; // обнуляем
результат
k:=0;
// обнуляем параметры
k1:=0;
for j1:=0 to
high(kir) do begin // перебор номеров букв алфавита
if
txt[i]=kir[j1] then k:=j1; // если i-ая буква шифр.текста=букве
алфавита то запоминаем номер этой буквы в алфавите
if
kl[i1]=kir[j1]
then k1:=j1 // если i1-ая буква кл.слова=букве
алфавита то запоминаем номер этой буквы в алфавите
end;
if
k<k1 then res:=high(kir)-(k1-k) // если номер буквы шифр.текста<номера
буквы кл.слова то res:=кол-во
букв в алфавите-(номер буквы кл.слова - номер буквы шифр.соощения)
else
// иначе
res:=(k-k1) mod high(kir);
// складываем номера этих букв по модулю с количеством букв в алфавите
form1.Caption:=form1.Caption+' '+inttostr(res);
shifr:=shifr+kir[res];// рез-ту :=
букву находящуюся под номером res в алфавите
i:=i+1;//
берем следующую букву откр.текста
i1:=i1+1;//берем
следующую букву кл.слова
end;
memo1.Text:=shifr; // окончательный вывод шифрованного текста
end;
Самостоятельное задание.
Сделайте так чтобы использовались все символы, а также буквы латинского
алфавита