Песни о Паскале | страница 85



Итак, научившись превращать числа в символы и наоборот, мы оказались в шаге от поставленной цели – шифрования символа.

Шифрование символа

Вернемся к функции шифрования Encrypt, теперь мы можем упростить её до предела.


>function Encrypt(arg: char): char;

>begin

>      Crypt:= Char(Ord(arg) + CKey);

>end;


Здесь CKey – ключ шифра, хранящийся где-то в глобальной константе или переменной. Превратив символ arg в число, мы прибавляем к нему ключ, а полученную сумму вновь превращаем в символ.

Все хорошо, прекрасная маркиза, за исключеньем пустяка: сумма в скобках может оказаться больше 255, а символа с таким кодом не существует! Как тогда поступит функция Char? Она вернет символ, укоротив его код на 256. Например, функция Char(260) вернет символ с кодом 260–256=4. Устроит нас это? Никак нет, поскольку первые 32 символа таблицы (коды от 0 до 31) – это управляющие символы. К сожалению, такие символы нарушат структуру текстового файла, и редактор не сможет прочесть его.

Значит, при передаче суммы в функцию Char надо проверить, не превышает ли она 255? Если да, то обрубим ей «хвост» и сдвинем ещё на 32 позиции выше, чтобы попасть в область видимых символов с кодами от 32 и далее.


>if X>255 then X:=X–256+32; { смещаем «хвост» – в начало видимых символов }


Так получаем окончательный вариант функции шифрования символа.


>function Encrypt(arg: char): char;

>var x: integer;

>begin

>      x:= Ord(arg)+ CKey;

>      if x>255 then x:= x–256+32;

>      Crypt:= Char(x);

>end;


Расшифровка символа

Понятно, что для расшифровки символа надо выполнить обратный сдвиг. После вычитания ключа проверим, не попадает ли полученная разность в область управляющих символов? Если попадает, поправим её, сместив в область видимых символов. Вот текст функции расшифровки Decrypt.


>function Decrypt(arg: char): char;

>var x: integer;

>begin

>      x:= Ord(arg)– CKey;

>      if x<32 then x:= x+256–32;

>      Decrypt:= Char(x);

>end;


Теперь все готово для построения программы шифрования и расшифровки строки «P_24_1».


>{ P_24_1 – Шифрование строки}

>const CKey = 2; { Ключ Цезаря }


>{––––– Шифрование одного символа –––––}

>function Encrypt(arg: char): char;

>var x: integer;

>begin

>      x:= Ord(arg)+ CKey;

>      if x>255 then x:= x–256+32;

>      Encrypt:= Char(x);

>end;

>{––––– Расшифровка одного символа –––––}

>function Decrypt(arg: char): char;

>var x: integer;

>begin

>      x:= Ord(arg)– CKey;

>      if x<32 then x:= x+256–32;

>      Decrypt:= Char(x);

>end;


>{––––– Шифрование строки –––––}