Песни о Паскале - [47]

Шрифт
Интервал

Прежде всего договоримся об именах файлов. Назначив зашифрованному файлу постоянное имя, например «CRYPT.TXT», мы избавим себя от ввода его имени с клавиатуры. Вводить мы будем либо имя исходного файла – при шифровании, либо имя конечного файла – при расшифровке. Обозначим эти неизвестные нам имена файлов как X1 и X2, и тогда схема обработки файлов будет такой.



Рис. 57 – Схема именования файлов при шифровании и расшифровке

С учетом этих договоренностей составим блок-схему программы (рис. 58).



Рис.58 – Блок-схема программы шифрования/расшифровки

Основную работу поручим процедуре шифрования-расшифровки, блок-схема которой показана на рис. 59. В неё передаём два параметра: имя обрабатываемого файла и код операции (зашифровать или расшифровать).



Рис.59 – Блок-схема процедуры шифрования-расшифровки

Теперь мы готовы смастерить шпионскую программу. Может быть, сами справитесь? По крайней мере, попытайтесь. Функции и процедуры шифрования символов и строк возьмите из программы «P_24_1». Написав свой вариант, сравните с представленным ниже.


>{ P_26_2 – шифрование и расшифровка файлов }


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


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

>function Encrypt(arg: char): char;

>var x: integer;

>begin

>Encrypt:=arg;

>if Ord(arg)>=32 then begin { управляющие символы не трогаем! }

>x:= Ord(arg)+ CKey;

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

>Encrypt:= Char(x);

>end;

>end;

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

>function Decrypt(arg: char): char;

>var x: integer;

>begin

>Decrypt:=arg;

>if Ord(arg)>=32 then begin { управляющие символы не трогаем! }

>x:= Ord(arg)- CKey;

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

>Decrypt:= Char(x);

>end;

>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;

>      {----- Процедура шифрования-расшифровка файла -----}

>procedure CryptFile(const aFile: string; aOper: boolean);

>const CFixName='Crypt.txt'; { фиксированное имя файла }

>var FileIn: text; { входной файл для чтения }

>      FileOut: text; { выходной файл для записи }

>      S: string;

>begin

>      if aOper then begin       { если шифровать }

>      Assign(FileIn, aFile);

>      Assign(FileOut, CFixName);

>      end else begin       { если расшифровать }

>      Assign(FileIn, CFixName);

>      Assign(FileOut, aFile);

>      end;

>      Reset(FileIn);    { открыть входной файл для чтения }

>      Rewrite(FileOut); { открыть выходной файл для записи }

>      while not Eof(FileIn) do begin

>      { пока не закончился входной файл }

>      Readln(FileIn, S);       { читать очередную строку из файла }

>      if aOper

>      then EncryptStr(S) { зашифровать }

>      else DecryptStr(S); { расшифровать }

>      Writeln(FileOut, S);       { записать в выходной файл }

>      end;

>      { закрыть оба файла }

>      Close(FileIn); Close(FileOut);

>end;

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

>var S: string;

>      Oper: boolean; { TRUE – шифровать, FALSE – расшифровать}

>begin

>      Write('Укажите операцию (1 – шифровать, иначе – расшифровать):');

>      Readln(S);

>      Oper:= S='1'; { Oper=TRUE если S='1' }

>      if Oper

>      then Write('Введите имя шифруемого файла: ')

>      else Write('Введите имя расшифрованного файла: ');

>      Readln(S);

>      CryptFile(S, Oper); { Вызов процедуры шифрования–расшифровки }

>      Write('OK, нажмите Enter'); Readln;

>end.


Пространные пояснения излишни. Признак выполняемой операции формируется в булевой переменной Oper в третьей строке главной программы по цифре, введенной в переменную S. Значение Oper=TRUE влечет зашифровку файла, а FALSE — расшифровку. Затем в переменную S вводится имя обрабатываемого файла. В конце концов, вызывается процедура CryptFile с передачей в неё двух параметров: имени файла и признака выполняемой операции (aFile и aOper). Приставка «a» в начале имен этих параметров (префикс) помогает при чтении программы отличить параметр от других переменных.

Полюбуйтесь, во что превратила эта программа один из файлов на Паскале (приведен небольшой фрагмент).


>}"Rtqi2420rcu"

>xct"Ocp"<"uvtkpi=

>}///"░гьёднзпкз"▒т░шзжхтэ"///

>rtqegfwtg"Rcwug=

>dgikp

>"""""Ytkvgnp*)Пвиокфз"Gpvgt<)+=""Tgcfnp=


Как говорится, родная мама не узнает! Все, что попадает в «мясорубку» нашего шифровальщика, обращается в фарш. Однако последующая расшифровка «перемолотого» файла в точности восстановила его.

Примененный нами метод шифрования не так уж крут, опытный взломщик легко раскроет его. Но фундамент заложен, и когда-нибудь вы придумаете изощренные методы шифрования. Например, ключ шифра можно сделать переменным и зависящим от номера символа в строке или файле. Подумайте над этим. Если же вы намерены заняться криптографией всерьез, изучайте математику! Для программиста это наука номер один.

Итоги

• Для записи в текстовый файл, как и для чтения, требуется файловая переменная типа TEXT.

• Перед записью выполняют два действия: связывание переменной с файлом процедурой Assign и открытие файла для записи процедурой Rewrite.

• Вызов процедуры Rewrite либо создаёт новый файл, либо очищает существующий (вся бывшая в нём информация теряется!).


Рекомендуем почитать
Когда цветет ликорис

Что делать, если проснулась в морге и понятия не имеешь, как могла в нем оказаться? Но страшно даже не это. Что делать, когда память подвела настолько, что неясно даже - кто ты?! В голове остались лишь странные имена, а ночью снятся слишком реальные сны. А потом... черт, да как же я могла такое забыть?! Я же ведьма!!! И у меня любовь с оборотнем, которого еще спасти надо. А заодно и целое королевство, иначе им завладеет беспощадный злодей. Вот только, это совсем другой мир... Хорошо, что ликорис уже зацвел!


Послание в бутылке. Стихи

Данная книга содержит избранные произведения поэтессы за период 2007—2016 гг. Это философская, любовная, пейзажная лирика, проникнутая трепетным отношением к природе, восхищением красотой человеческой души.


Путешествие за счастьем

В далекой сказочной стране живут оборотни и люди, маги и демоны, орки и драконы. И сказки в ней случаются разные - добрые, веселые и даже страшные. А там где есть сказки, там обязательно есть счастье, а там где счастье, там должны быть феи.


Покрывало тьмы

Юмористическое фэнтези. История красавицы и чудовища на новый лад.


Демон и охотник

Знала ли юная Марианна, что кошмарные сны - это часть воспоминаний далекого прошлого. Прошлого, которое предстоит разгадать нашей героине. Ведь неизвестно как, девушка попала совсем другой мир, где сплошь и рядом те, кто не желает ей добра. И, как в сказках, к ней приходит на помощь.... Нет, не прекрасный принц на белом коне, а парень с маской на лице и выразительными изумрудными глазами. Что же ждет нашу героиню в этом мире? Сможет она узнать свое прошлое и принять его или же попытается от него убежать, ведь по пятам идет охотник....


Хранители: Город Сновидений

Шестнадцатилетняя девочка Энни, через книгу, попадает в город Сновидений, в котором происходит невероятная магия Луны. Там она узнает, что относится к необыкновенному роду людей – хранителям, которые защищают и помогают людям. Чтобы вернуться домой ей нужно найти лунный цветок расцветающий раз в сто лет, и который может исполнить любое, но одно желание.