ЛАБОРАТОРНАЯ РАБОТА ПО ДИСЦИПЛИНЕ
"ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ"
В 1854 г. англичанин Чарльз Уитстон разработал новый метод шифрования биграммами,
который называют «двойным квадратом». Этот шифр использует сразу две таблицы,
размещенные по одной горизонтали, а шифрование идет биграммами, как в шифре Плейфера. Поясним процедуру шифрования на примере. Пусть
имеются две таблицы со случайно расположенными в них русскими алфавитами (рис
8).

Рис 8. Две таблицы с русскими алфавитами.
Перед шифрованием исходное сообщение
разбивается на биграммы. Каждая биграмма шифруется отдельно. Первую букву
биграммы находят в первой таблице, а вторую во второй. Если обе буквы биграммы
лежат в одной строке, то и буквы берут из этой же строки. Первую букву биграммы
шифротекста берут из левой таблицы в столбце,
соответствующем второй букве биграммы сообщения. Вторая же буква биграммы шифротекста берется из правой таблицы в столбце,
соответствующем первой букве биграммы сообщения. Поэтому биграмма ПО превращается
в ХЦ. Если же буквы не лежат в одной строке, то мысленно строят прямоугольник так.
Чтобы буквы биграммы лежали в его противоположных вершинах. Другие две вершины
этого прямоугольника дают буквы биграммы шифротекста.
Например. Зашифруем сообщение ПРИВЕТ.
Разбиваем его на бтграммы – ПР ИВ ЕТ. Находим букву П
в левой таблице, а букву Р – в правой. Так как они не лежат в одной стоке, то
мысленно строим прямоугольник. Результатом будет – ХФ. Таким способом и шифруем
остальные биграммы.
Составим программу. Разместите на форме два
компонента Stringgrid. Первый назовите SG, а второй SG1.
также разместите на форме остальные компоненты приведенные на рис 9.

Рис 9. Форма после размещения компонентов.
Напишем обработчик кнопки Шифровать.
procedure
TForm1.Button1Click(Sender: TObject);
var i,j,dl,k,x,x1,y,y1:integer;
txt,a,b,RES:string;
begin
txt:=edit1.Text;
dl:=length(txt);
if not dl mod 2=0
then showmessage('Должно быть четное кол-во букв')
else begin
k:=1;res:=' ';
while k<dl do begin
a:=txt[k];
b:=txt[k+1];
for i:=0 to
sg.ColCount-1 do
for j:=0 to
sg.RowCount-1 do begin
if a=sg.Cells[i,j] then begin
x:=i;
x1:=j;
end;
end;
for i:=0 to
sg1.ColCount-1 do
for j:=0 to
sg1.RowCount-1 do begin
if b=sg1.Cells[i,j] then begin
y:=i;
y1:=j;
end;
end;
if x1=y1 then begin
a:=sg1.Cells[x,x1];
b:=sg.Cells[y,y1];
end;
if x1<>y1 then begin
a:=sg1.Cells[y,y1-(y1-x1)];
b:=sg.Cells[x,x1+(y1-x1)];
end;
res:=res+a+b;
K:=K+2;
end;
end;
label2.Caption:=res;
end;
Далее следует обработчик кнопки Расшифровать
procedure
TForm1.Button2Click(Sender: TObject);
var i,j,dl,k,x,x1,y,y1:integer;
txt,a,b,RES:string;
begin
txt:=label2.Caption;
dl:=length(txt);
k:=1;res:=' ';
while k<dl do begin
a:=txt[k];
b:=txt[k+1];
for i:=0 to
sg1.ColCount-1 do
for j:=0 to
sg1.RowCount-1 do begin
if a=sg1.Cells[i,j] then begin
x:=i;
x1:=j;
end;
end;
for i:=0 to
sg.ColCount-1 do
for j:=0 to
sg.RowCount-1 do begin
if b=sg.Cells[i,j] then begin
y:=i;
y1:=j;
end;
end;
if x1=y1 then begin
a:=sg.Cells[x,x1];
b:=sg1.Cells[y,y1];
end;
if x1<>y1 then begin
a:=sg.Cells[y,y1-(y1-x1)];
b:=sg1.Cells[x,x1+(y1-x1)];
end;
res:=res+a+b;
K:=K+2;
end;
label3.Caption:=res;
end;
также напишите обработчик события OnCreate для формы
procedure
TForm1.FormCreate(Sender: TObject);
var i,j,k:integer;
begin
kir:='АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ.,ПРОБЕЛ:';
k:=1;
for i:=0 to sg.ColCount-1
do
for j:=0 to
sg.RowCount-1 do begin
sg.Cells[i,j]:=kir[k];
k:=k+1;
end;
k:=35;
for i:=0 to sg1.colcount-1 do
for j:=0 to
sg1.RowCount-1 do begin sg1.Cells[i,j]:=kir[k];
k:=k-1;
end;
end;
Переменную Kir опишите
глобально.
Самостоятельное задание.
Сделайте так, чтобы использовались все буквы и
большие и маленькие а также все символы.