ЛАБОРАТОРНАЯ РАБОТА ПО ДИСЦИПЛИНЕ
"ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ"
Лабораторная №2. Шифрующие таблицы Трисемуса.
В 1508 г.
Аббат из Германии Иоганн Трисемус написал печатную
работу по криптологии под названием «Полиграфия». В этой книге он впервые
систематически описал применение шифрующих таблиц, заполненных алфавитом в
случайном порядке. Для получения такого шифра замены обычно использовались
таблица для записи букв алфавита и ключевое слово. В таблицу сначала
вписывалось по строкам ключевое слово, причем повторяющиеся буквы
отбрасывались. Затем эта таблица дополнялась не вошедшими в нее буквами алфавита по порядку.
Поясним метод шифрования на примере. Для русского алфавита шифрующая таблица
может иметь размер 4*8. Выберем в качестве ключа слово БАНДЕРОЛЬ. Шифрующая
таблица с таким ключом показана на рис 3.

Рис 3. Шифрующая таблица с
ключевым словом БАНДЕРОЛЬ.
Далее при
шифровании находят в этой таблице очередную букву открытого текста и записывают
в шифротекст букву, расположенную ниже ее в том же
столбце. Если буква текста оказывается в нижней строке, то для шифротекста берут самую верхнюю букву из того же столбца.
Например, при шифровании фразы ВЫЛЕТАЕМПЯТОГО получаем шифротекст
ПДКЗЫВЗЧШЛЫЙСЙ
Такие
таблицы называются монограммными, так как шифрование выполняется по одной
букве. Также можно шифровать по две буквы. Такие шифры называются биграммными.
А теперь
разработаем программу которая будет шифровать при
помощи этого метода.
Создайте
новый проект. Разместите на форме компонент StringGrid1 и измените его имя на sg. Установите его свойства в соответствии со следующими пунктами:
ColCount=8
RowCount=4
DefaultColWidth=50
DefaultRowHeigth=50
Теперь
разместите на форме компоненты в соответствии с рисунком 4.
Суть в
следующем. После ввода ключевого слова, по нажатии кнопки ОК, оно автоматически
перенесется в таблицу. Остальные пустые поля заполнятся недостающими буквами
русского алфавита. Напишем обработчик кнопки ОК.

Рис 4. Форма после
размещения компонентов.
procedure
TForm1.SpeedButton1Click(Sender: TObject);
label metka; // 1
var i,j,I1:integer;stolb,stroka,L,L1:integer; //2
begin
stolb:=0; //3
stroka:=0; //4
l:=0; //5
kl_sl:=edit1.Text; //7
dl:=length(kl_sl); //8
for i1:=1
to dl do begin //9
if l=sg.ColCount
then begin //10
stroka:=stroka+1; //11
stolb:=0; //12
l:=0; //13
end;
sg.Cells[stolb,stroka]:=kl_sl[i1]; //14
stolb:=stolb+1; //15
l:=l+1; //16
end;
i:=1;j:=1; //17
for i:=1
to 32 do begin //18
for j:=1
to dl do //19
if kir[i]=kl_sl[j] then goto metka; //20
if l=sg.ColCount then begin //21
stolb:=0; //22
stroka:=stroka+1; //23
l:=0; //24
end;
sg.Cells[stolb,stroka]:=kir[i]; //25
stolb:=stolb+1; //26
l:=L+1; //27
metka:; //28
end;
end;
Теперь давайте разберем
каждую строчку этого кода.
1. метка - Label Metka – нужна для того, чтобы перейти из одного места программы в другую, минуя
какие-нибудь операторы.
2. это переменные необходимые для работы
3. самый верхний левый квадрат нашей таблицы имеет
координаты [0,0], параметр Stolb – задает номер столбца. В нашем случае это 0.
4. параметр Stroka – как вы уже догадались содержит в себе
номер строки. Также 0.
5. переменная L – это счетчик количества столбцов. Когда мы доходим до последнего столбца,
то нам нужно перескочить на следующую строку. Так вот если этот параметр
будет=количеству столбцов, то автоматически переменная Stolb примет значение 0, а Stroka увеличится на 1.
7. переменная Kl_sl – описана глобально. Ей
присваивается, то, что мы впишем в
поле ввода ключевого слова.
8. переменная dl – считает количество символов ключевого слова.
9.
здесь мы начинаем цикл. Т.е. мы будем перебирать все буквы ключевого
слова и закидывать в таблицу.
10.
здесь как я уже говорил выше проверяется условие равна ли
переменная L количеству столбцов. Если равна,то.
11.
мы автоматически перескакиваем на следующую строку. Т.е
не мы ,а курсор.
12. и начинаем опять с нулевого столбца.
13. переменная L опять принимает значение 0.
14. здесь мы полю таблицы с координатами Stolb,Stroka - присваиваем первую букву. Т.к. они у нас
первоначально равны 0, то буква закидывается в верхний левый квадрат.
15. после этого мы переходим в следующий
столбец. О чем нам говорит переменная Stolb:=Stolb+1
16. также увеличивается переменная L .
и так продолжается пока мы не переберем
все буквы ключевого слова.
17.
здесь переменная I –будет перебирать буквы алфавита.j
– буквы ключевого слова.
18.
здесь мы начинаем перебирать буквы алфавита. Взяли первую букву – А.
19. здесь перебираем буквы ключевого
слова. Например Кл. слово .БАНДЕРОЛЬ. Взяли букву Б.
20. здесь у нас стоит условие. Если
данная буква алфавита равна букве ключевого слова, то мы ее оставляем и
переходим по метке к пункту 28. т.е это у нас конец
цикла. Заходим опять в цикл. Уже берем вторую букву и сравниваем ее с ключевым
словом. Мы ищем есть ли эта буква в Кл. слове если ее нету
то мы закидываем ее в таблицу. Если есть, то пропускаем.
Теперь опишите глобально
следующие переменные. (см ниже)
var
Form1: TForm1;
kl_sl,kir:string; // ключевое слово и алфавит
a:array[1..32]of char;
dl:integer;
implementation
на событие OnCreate для формы напишите следующее.
procedure
TForm1.FormCreate(Sender: TObject);
begin
kir:='АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
end;
Это означает, что после
появления формы, переменной Kir присвоится алфавит.
Теперь выделите edit1 найдите свойство CharCase и поменяйте его значение на ecUpperCase. Это значит если вы будете вводить символы, то они
буду писаться большими буквами.
Теперь можете запустить
программу. Впишите слово БАНДЕРОЛЬ и нажмите ОК. Вы видите
что те буквы которые отстутствуют в ключевом слове
автоматически заполнили пустые поля таблицы.
Напишем теперь обработчик
кнопки Шифровать.
procedure
TForm1.SpeedButton2Click(Sender: TObject);
label metka2;
var txt,a:string;
dl,i,j,l,stolb,stroka:integer;
begin
a:='';
stroka:=0;
stolb:=0;
l:=0;
txt:=edit2.Text;
dl:=length(txt);
for i:=1
to dl do begin
STOLB:=0;
STROKA:=0;
L:=0;
for j:=0 to sg.ColCount*sg.RowCount do BEGIN
//1
if txt[i]=sg.Cells[stolb,stroka]
then begin //2
if stroka+1=sg.RowCount THEN STROKA:=-1; //3
a:=a+sg.Cells[stolb,stroka+1]; //4
GOTO METKA2;
end;
if l=sg.ColCount-1
then begin
stolb:=-1;
stroka:=stroka+1;
l:=-1;
end;
stolb:=stolb+1;
l:=l+1;
END;
METKA2:;
end;
label3.Caption:=a;
for i:=0
to sg.ColCount do begin // 5
for j:=0 to sg.RowCount do begin
sg.Cells[i,j]:=''; end;
end;
EDIT1.Text:='';
EDIT2.Text:='';
end;
Давайте поясним этот
код. Первые строки надеюсь вам понятны.
Начиная со строки 1 до 4 происходит следующее. Берем первую букву нашего слова,
которое мы хотим зашифровать. Начинаем с
верхнего левого угла таблицы и перемещаясь вправо мы ищем эту букву в таблице и
если мы ее нашли, то шифортексту присваивается буква
которая находится в этом же столбце , но строкой ниже.
И так продолжается до тех пор, пока мы не зашифруем все буквы. В строке под
номером 3 мы проверяем, если буква находится в самой последней строке, то шифротексту присваивается буква
лежащая в этом же столбце, но уже в первой строке.
Начиная со строки 5 мы
очищаем таблицу.
Так и происходит процесс
зашифрования.
Процесс дешифрования
происходит в обратном порядке. Вводится ключевое слово. Затем вводится
зашифрованное слово или фраза. Буквы меняются в обратном порядке. Если буква
нашлась в таблице, то она меняется на букву, лежащую ниже.
Напишем теперь обработчик
кнопки ОК группы расшифровки.
procedure
TForm1.SpeedButton3Click(Sender: TObject);
label metka;
var i,j,i1:integer;stolb,stroka,l,k,l1:integer;
begin
stolb:=0;
stroka:=0;
l:=0;
k:=0;
kl_sl:=edit3.Text;
dl:=length(kl_sl);
for i1:=1
to dl do begin
if l=sg.ColCount
then begin
stroka:=stroka+1;
stolb:=0;
l:=0;
end;
sg.Cells[stolb,stroka]:=kl_sl[i1];
stolb:=stolb+1;
l:=l+1;
end;
;i:=1;j:=1;
for i:=1
to 32 do begin
for j:=1
to dl do
if kir[i]=kl_sl[j] then goto metka;
if l=sg.ColCount then begin
stolb:=0;
stroka:=stroka+1;
l:=0;
end;
sg.Cells[stolb,stroka]:=kir[i];
stolb:=stolb+1;
l:=L+1;
metka:;
end;
end;
Далее следует обработчик
кнопки Расшифровать
procedure TForm1.Button1Click(Sender: TObject);
label metka2;
var txt,a:string;
dl,i,j,l,stolb,stroka:integer;
begin
a:='';
stroka:=0;
stolb:=0;
l:=0;
txt:=edit4.Text;
dl:=length(txt);
for i:=1
to dl do begin
STOLB:=0;
STROKA:=0;
L:=0;
for j:=0 to sg.ColCount*sg.RowCount do BEGIN
if txt[i]=sg.Cells[stolb,stroka]
then begin
if stroka+1=sg.RowCount-3
THEN STROKA:=4;
a:=a+sg.Cells[stolb,stroka-1];
GOTO METKA2;
end;
if l=sg.ColCount-1
then begin
stolb:=-1;
stroka:=stroka+1;
l:=-1;
end;
stolb:=stolb+1;
l:=l+1;
END; METKA2:;
end;
label7.Caption:=a;
for i:=0
to sg.ColCount do begin
for j:=0 to sg.RowCount do begin
sg.Cells[i,j]:=''; end;
end;
end;
Давайте теперь зашифруем
фразу ВЫЛЕТАЕМПЯТОГО.
Ключевое слово будет
БАНДЕРОЛЬ. Попробуйте зашифровать эту фразу.
В этой программе есть
недостатки:
1. нельзя использовать пробел и другие знаки
препинания
2. не используется латинский алфавит
САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ:
Сделайте так, чтобы использовался русский и
латинский алфавиты, цифры от 0 до 9, и некоторые знаки препинания. Общее
количество символов должно быть 72.