Листинг 12.19.
Функция получения ключа
function TfmEncryptingAutoKey.GetKey: String;
var
i: Integer;
begin
Result := \'\
for i := 1 to Length(edKey.Text) do
if not (edKey.Text[i] in RusLetters) then
Exit;
Result := edKey.Text;
end;
Рассмотрим работу функций EncryptString и DecryptString. На входе они получают строку, которую требуется преобразовать, и первичный ключ. Внешне они очень похожи, но все же отличаются, и эти отличия существенны. Функция шифрования выполняет следующие действия. В цикле осуществляется проход по строке и проверяется, является ли очередной символ буквой русского алфавита. В случае положительного ответа этот символ преобразуется при помощи очередного символа ключа и добавляется в его конец. Преобразование осуществляется по правилу, которое мы указывали при рассмотрении шифра Виженера:
Листинг 12.20.
Функция шифрования строки с помощью ключа и криптограммы
function TfmEncryptingAutoKey.EncryptString(strEncryptMsg: String;
var strKey: String): String;
var
i: Integer;
begin
for i := 1 to Length(strEncryptMsg) do
if strEncryptMsg[i] in RusLetters then
begin
strEncryptMsg[i] := Chr(((Ord(strEncryptMsg[i]) –
Ord(\'А\')) + (Ord(strKey[1]) – Ord(\'А\'))) mod 64 + Ord(\'А\'));
Delete(strKey, 1, 1);
strKey := strKey + strEncryptMsg[i];
end;
Result := strEncryptMsg;
end;
Функция дешифрования строки с помощью ключа и криптограммы делает следующее. Как и в предыдущей функции, в цикле осуществляется проход по строке и проверяется, является ли очередной символ буквой русского алфавита. При положительном ответе данный символ сначала добавляется в конец ключа, а потом только осуществляется его преобразование. Обратное преобразование символа проходит по следующему правилу:
Листинг 12.21.
Функция дешифрования строки с помощью ключа и криптограммы
function TfmEncryptingAutoKey.DecryptString(strDecryptMsg: String;
var strKey: String): String;
var
i: Integer;
begin
for i := 1 to Length(strDecryptMsg) do
if strDecryptMsg[i] in RusLetters then
begin
strKey := strKey + strDecryptMsg[i];
strDecryptMsg[i] := Chr((((Ord(strDecryptMsg[i]) –
Ord(\'А\')) – (Ord(strKey[1]) – Ord(\'А\'))) + 64) mod 64 +
Ord(\'А\'));
Delete(strKey, 1, 1);
end;
Result := strDecryptMsg;
end;
Обработчики событий OnClick вызывают функцию EncryptDecrypt с необходимыми параметрами. У этой функции всего три параметра. Первый указывает на источник текста сообщения, требующего преобразования, второй указывает на приемник преобразованного текста сообщения. Последний параметр определяет тип преобразования текста сообщения. Если он равен True, то текст сообщения шифруется и помещается в приемник. В противном случае текст сообщения дешифруется и также помещается в приемник. Это происходит следующим образом. Сначала получается ключ, при помощи которого будет осуществляться преобразование текста сообщения. Если ключ некорректен, то выдаем соответствующее предупреждение и больше ничего не делаем. Если ключ корректен, то в зависимости от последнего параметра вызываем соответствующую функцию преобразования для каждой строки источника текста сообщения и добавляем результат в приемник (листинг 12.22).