Листинг 12.11. Функция получения части текста заданной длины, начиная с указанной позиции, в виде одной строки
function TfmTransposition.GetLine(Lines: TStrings;
nRow, nInd: Integer): String;
var
i, j, k: Integer;
s: String;
begin
Result := \'\
s := \'\
k := nInd;
for i := nRow to Lines.Count – 1 do
begin
for j := k to Length(Lines[i]) do
begin
s := s + Lines[i][j];
if Length(s) = Rear[0] then
begin
Result := s;
Exit;
end;
end;
k := 1;
end;
end;
Подготовительный этап мы рассмотрели, теперь остается рассмотреть основной код программы. Обработчики кнопок Onclick вызывают один и тот же метод и указывают необходимые параметры, чтобы зашифровать либо дешифровать текст сообщения. Процедура EncryptDecrypt в качестве параметров принимает источник текста сообщения, с которым нужно проделать необходимые действия, приемник преобразованного текста сообщения и тип преобразования. Последний параметр принимает одно из двух значений: 0 или 1. Значение О указывает на то, что будет производиться шифрование сообщения. Значение 1 указывает на то, что будет производиться дешифрование сообщения. Процедура EncryptDecrypt выполняет следующие действия. Сначала она пытается подготовить необходимую перестановку и, только если все прошло успешно, переходит к попытке преобразования текста сообщения, но предварительно делает еще одну проверку. Эта проверка заключается в следующем: нужно удостовериться в соответствии общей длины текста накладываемому на нее ограничению, то есть длина обязана быть кратна периоду транспозиции. Если все хорошо, то далее следует код преобразования текста сообщения с использованием подготовленной транспозиции. Для начала приведем исходный код, который находится в листинге 12.12.
Листинг 12.12. Шифрование/дешифрование текста сообщения
procedure TfmTransposition.btnEncryptMessageClick (Sender:
TObject);
begin
EncryptDecrypt(mmDecryptMessage.Lines,
mmEncryptMessage.Lines, 0);
end;
procedure TfmTransposition.btnDecpyptMessageClick(Sender:
TObject);
begin
EncryptDecrypt(mmEncryptMessage.Lines,
mmDecryptMessage.Lines, 1);
end;
procedure TfmTransposition.EncryptDecrypt(SrcLines,
DstLines: TStrings;
nKey: Integer);
var
i, j, Cnt: Integer;
s, EncryptMsg: String;
begin
if RecalcRearrangement(nKey) then
begin
//вычисляем общую длину текста
Cnt := 0;
for i := 0 to SrcLines.Count – 1 do
Inc(Cnt, Length(SrcLines[i]));
//проверяем кратность общей длины длине перестановки
if Cnt mod Rear[0] <> 0 then
begin
MessageDlg(\'Ошибка: текст сообщения не кратен длине
перестановки\', mtError, [mbOk], 0);
Exit;
end;
//преобразуем сообщение
Cnt := Rear[0];
DstLines.BeginUpdate;
DstLines.Clear;
for i := 0 to SrcLines.Count – 1 do
begin
EncryptMsg := \'\
for j := 1 to Length(SrcLines[i]) do
begin
if Cnt = Rear[0] then
begin
s := GetLine(SrcLines, i, j);
Cnt := 0;
end;
Inc(Cnt);
EncryptMsg := EncryptMsg + s[Rear[Cnt]];
end;
DstLines.Add(EncryptMsg);
end;
DstLines.EndUpdate;
end
else
MessageDlg(\'Ошибка: перестановка задана неверно\', mtError,
[mbOk], 0);
end;