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

Рис 2. Форма после размещения компонентов.
В первую строку ввода мы будем вводить
исходную фразу. По нажатии кнопки Раскидать наш текст распределится в таблице в соответствии с рис 1. После чего мы нажмем кнопку Шифровать
и во второй строке уже появится зашифрованный текст, показанный выше. Ну а по
нажатию кнопки Расшифровать в первой строке ввода появится исходный текст.
Итак, напишем обработчик кнопки Раскидать.
procedure
TForm1.Button1Click(Sender: TObject);
var txt,buf:string;
dlina,stroka,stolb:integer;
i,l:integer;
begin
stolb:=0;
stroka:=0;
l:=0;// счетчик
txt:=edit1.Text;
// переменной txt присваиваем текст в поле
dlina:=length(txt); // считаем длину текста
// раскидываем текст в таблицу
for i:=1 to dlina do
begin
buf:=txt[i]; //
переменной buf присваиваем первую букву
if
l=stringgrid1.RowCount then begin //
если l=количеству строк
stolb:=stolb+1;
// переходим в следующий столбец
stroka:=0; // переходим на первую строку
l:=0; // счетчик обнуляем
end;
stringgrid1.Cells[stolb,stroka]:=buf; // сетке с координ
- ми stolb,stroka присваиваем
// первую букву
stroka:=stroka+1; // переходим на следующую
строку
l:=l+1; //
увеличиваем счетчик на 1
end;
edit1.Text:=''; // очищаем поле ввода
end;
Запустите программу и введите нашу фразу, но
только без пробелов. Нажмите кнопку Раскидать. Вы видите, что текст
распределился по таблице.
Напишем теперь обработчик кнопки Шифровать.
procedure
TForm1.Button2Click(Sender: TObject);
var txt:string;
i,j:integer;
stolb,stroka,l:integer;
begin
txt:=''; //шифрованный текст
stolb:=0;
stroka:=0;
l:=0;
for i:=0 to stringgrid1.ColCount*stringgrid1.RowCount do begin
if l=stringgrid1.ColCount then begin
stolb:=0;
stroka:=stroka+1;
l:=0;
end;
txt:=txt+stringgrid1.Cells[stolb,stroka];
stolb:=stolb+1;
l:=l+1; // увеличиваем счетчик
end;
edit2.Text:=txt;// вывод шифротекста
// очищаем таблицу
stroka:=0;
stolb:=0;
for i:=0 to stringgrid1.ColCount do begin
for j:=0 to
stringgrid1.RowCount do begin
stringgrid1.Cells[i,j]:=' ';
end;
end;
end;
Запустите программу и проверьте результат.
Ну а теперь напишем обработчик кнопки Расшифровать.
procedure
TForm1.Button3Click(Sender: TObject);
var txt,buf:string;
stroka,stolb,l:integer;
i,j,dlina:integer;
begin
txt:=edit2.Text;
dlina:=length(txt); //считаем
длину шифротекста
stroka:=0;
stolb:=0;
l:=0;
for i:=1 to dlina do begin
buf:=txt[i];
if l=sg.ColCount
then begin
stroka:=stroka+1;
stolb:=0;
l:=0;
end;
sg.Cells[stolb,stroka]:=buf;
stolb:=stolb+1;
l:=l+1;
end;
edit2.Text:='';
stolb:=0;
stroka:=0;
l:=0;
txt:='';
for i:=0 to sg.ColCount*sg.RowCount do begin
if l=sg.RowCount then begin
stolb:=stolb+1;
stroka:=0;
l:=0;
end;
txt:=txt+sg.Cells[stolb,stroka];
stroka:=stroka+1;
l:=l+1;
end;
edit1.Text:=txt;
label1.Caption:='Расшифрованный текст';
// очищаем таблицу это можно и не писать
stroka:=0;
stolb:=0;
for i:=0 to sg.ColCount do begin
for j:=0 to sg.RowCount do begin
sg.Cells[i,j]:=''
end;
end;
end;
Таким образом мы с вами рассмотрели самый
простой способ шифрования посредством метода перестановки.
Самостоятельное задание:
Здесь есть недостаток. При вводе малого
количества букв остаются незаполненные ячейки и, при расшифровке получается
неразбериха. Поэтому сделайте так, пусть у вас будет 4 строки, а столбцы
появляются по мере заполнения ячеек, если все ячейки окажутся заполненными, а
буквы открытого текста еще есть, то добавляется следующий столбец и т.д. после заполнения , если в последнем столбце есть пустые ячейки,
заполнить какими-нибудь знаками.