Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
62
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 24

Криптография

var с: char;

begin

for c:=’A’ to ’F’ do Writeln(c,' ', Ord(c))

end.

Здесь счетчиком цикла FOR служит переменная символьного типа. Паскаль допускает это, поскольку «знает», что каждому символу соответствует некоторое число — его код.

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

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

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

function Encrypt(arg: char): char;

begin

Encrypt:= Chr(Ord(arg) + CKey);

end;

Здесь CKey — ключ шифра, хранящийся где-то в глобальной константе или переменной (Caesar — «цезарь»). Превратив символ arg в число, мы прибавляем к нему ключ, а полученную сумму вновь превращаем в символ.

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

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

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

{ смещаем «хвост» – в начало видимых символов }

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

158

Глава 24

Криптография

function Encrypt(arg: char): char; var x: integer;

begin

x:= Ord(arg)+ CKey;

if x>255 then x:= x–256+32; Encrypt:= Chr(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:= Chr(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:= Chr(x);

end;

159

Глава 24

Криптография

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

function Decrypt(arg: char): char; var x: integer;

begin

x:= Ord(arg)– CKey;

if x<32 then x:= x+256–32; Decrypt:= Chr(x);

end;

{––––– Зашифровка строки –––––}

procedure EncryptStr(var arg: string); var k: integer;

begin

for k:=1 to Length(arg) do arg[k]:= Encrypt(arg[k]);

end;

{––––– Расшифровка строки –––––}

procedure DecryptStr(var arg: string); var k: integer;

begin

for k:=1 to Length(arg) do arg[k]:= Decrypt(arg[k]);

end;

{––––– Главная программа –––––}

var S: string; Oper: integer;

begin

repeat

Write('Введите строку: '); Readln(S); Writeln('Укажите операцию: 1– шифровать,’+

’ 2– расшифровать,’+ ’ Прочие – выход');

Readln(Oper); case Oper of

1:EncryptStr(S);

2:DecryptStr(S); else Break;

end;

Writeln(S); { печатаем результат } until false;

end.

160

Глава 24

Криптография

Программа нуждается лишь в кратких пояснениях. Глобальная константа CKey содержит ключ шифра. Если со временем захотите сменить его, достаточно будет изменить константу и заново откомпилировать программу. Далее следуют описания двух функций: Encrypt и Decrypt — для зашифровки и расшифровки символа. Процедуры EncryptStr и DecryptStr шифруют и расшифровывают строки, передаваемые им по ссылке VAR. И, наконец, в главной программе организован цикл для ввода шифруемой строки и кода выполняемой операции

(Oper).

Откиньтесь в кресле и полюбуйтесь простотой блоков, составляющих эту программу! А во что бы мы превратили её, свалив в кучу эти простые алгоритмы? В заключение приведу протокол шифрования: я ввел слово «pascal» и зашифровал его, получив слово «rcuecn». Затем ввел строку «rcuecn» и расшифровал её, получив назад данное мною слово.

Введите строку: pascal

Операции: 1 – шифровать, 2 – расшифровать, прочие – выход Введите операцию: 1

rcuecn

Введите строку: rcuecn

Операции: 1 – шифровать, 2 – расшифровать, прочие – выход Введите операцию: 2

pascal

Операции: 1 – шифровать, 2 – расшифровать, прочие – выход Введите операцию: 3

Вряд ли я удержу вас от испытания столь полезного изделия. Во избежание ошибок шифруйте строки небольшой длины. Рекомендую также хотя бы разок пройти программу по шагам.

Итоги

В памяти компьютера символы представлены своими кодами — числами.

Общее количество символов составляет 256, из них первые 32 — это управляющие, а остальные — видимые символы.

Для преобразования числового кода в символ применяют функцию Chr. Для обратного превращения — символа в число — пользуются функцией Ord..

Паскаль «знает» о том, что символы кодируются числами, поэтому в счетчике цикла FOR допустимы символьные переменные, а в метках оператора CASE — символьные константы.

161

Соседние файлы в папке delphi