Песни о Паскале - [47]
Прежде всего договоримся об именах файлов. Назначив зашифрованному файлу постоянное имя, например «CRYPT.TXT», мы избавим себя от ввода его имени с клавиатуры. Вводить мы будем либо имя исходного файла – при шифровании, либо имя конечного файла – при расшифровке. Обозначим эти неизвестные нам имена файлов как X1 и X2, и тогда схема обработки файлов будет такой.
С учетом этих договоренностей составим блок-схему программы (рис. 58).
Основную работу поручим процедуре шифрования-расшифровки, блок-схема которой показана на рис. 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 гг. Это философская, любовная, пейзажная лирика, проникнутая трепетным отношением к природе, восхищением красотой человеческой души.
В далекой сказочной стране живут оборотни и люди, маги и демоны, орки и драконы. И сказки в ней случаются разные - добрые, веселые и даже страшные. А там где есть сказки, там обязательно есть счастье, а там где счастье, там должны быть феи.
Знала ли юная Марианна, что кошмарные сны - это часть воспоминаний далекого прошлого. Прошлого, которое предстоит разгадать нашей героине. Ведь неизвестно как, девушка попала совсем другой мир, где сплошь и рядом те, кто не желает ей добра. И, как в сказках, к ней приходит на помощь.... Нет, не прекрасный принц на белом коне, а парень с маской на лице и выразительными изумрудными глазами. Что же ждет нашу героиню в этом мире? Сможет она узнать свое прошлое и принять его или же попытается от него убежать, ведь по пятам идет охотник....
Шестнадцатилетняя девочка Энни, через книгу, попадает в город Сновидений, в котором происходит невероятная магия Луны. Там она узнает, что относится к необыкновенному роду людей – хранителям, которые защищают и помогают людям. Чтобы вернуться домой ей нужно найти лунный цветок расцветающий раз в сто лет, и который может исполнить любое, но одно желание.