Энциклопедия Turbo Pascal. Главы 5-8
Страница 23. Дешифрация


Дешифрация

     Глава о  криптографии  была бы не полной без краткого обзора
дешифрации.  Искусство дешифрации - это в сущности метод  проб  и
ошибок. Без применения цифрового компьютера благодаря исчерпываю-
щему анализу могут быть расколоты относительно простые шифры. Од-
нако,  более  сложные коды либо не могут быть расшифрованы,  либо
требуют методов и ресурсов, которых не существует. Для простоты в
данном  разделе сосредоточимся на дешифрации наиболее простых ко-
дов.
     Если вы желаете расшифровать сообщение,  которое было зашиф-
ровано с помощью метода простой замены со смещенным алфавитом, то
вы должны попробовать все 26 возможных смещения,  чтобы выяснить,
какое из них подходит.  Программа для реализации  этого  показана
ниже:

     { программа дешифрования кода для шифра простой замены.
       сообщения не могут быть длинее 1000 символов }

     program brksub;
     type
       str80 = string[80];

     var
       inf: str80;
       message: array[1..1000] of char;{взять входное сообщение}
       ch: char;

     { данная функция возвращает TRUE,
       если ch является буквой алфавита }

     function isalpha(ch: char): boolean;
     begin
       isalpha := (upcase(ch)>='A') and (upcase(ch)<='X');
     end; {is alpha}

     procedure break(inf: str80);
     var
       infile: file of char;
       ch: char;
       done: boolean;
       sub, t, t2, l: integer;

     begin
       assign(infile, inf);
       reset(infile);
       done := FALSE;
       l := 1;
       repeat
         Read(infile, message[l]);
         message[l] := upcase(message[l]);
         l := l+1;
       until eof(infile);
       l := l-1; { удалить знак конца файла }

       t := 0; sub := -1;
       { попробовать каждое возможное смещение }
       repeat
         for t2 := 1 to l do begin
           ch := message[t2];
           if isalpha(ch) then
           begin
             ch := chr(ord(ch)+t);
             if ch>'Z' then ch := chr(ord(ch)-26);
           end;
           Write(ch);
         end;
         WriteLn;
         WriteLn('декодирован? Y/N): ');
         ReadLn(ch);
         if upcase(ch)='Y' then sub := t;
         t := t+1;
         until (t=26) or (upcase(ch)='Y');
         if sub<> -1 then Write('offset is ', sub);
         close(infile);

     end; {break}

     begin
       Write('введите имя входного файла: ');
       ReadLn(inf);
       break(inf);
     end.

     С незначительными  вариациями  вы  можете  применить  данную
программу для дешифрации шифров,  которые используют произвольный
алфавит.  В данном случае подставляется вводимый вручную алфавит,
как показано в данной программе:

     {программа дешифрации  кода  для шифров подстановки с произ-
      вольным алфавитом

     program beksub2;
     type
       str80 = string[80];

     var
       inf: str80;
       sub: string[26];
       message:array[1..1000] of char;
       ch: char;                       { ввод входного сообщения }

     { данная функция возвращает TRUE, если ch является
       буквой алфавита }
     function isalpha(ch: char): boolean;
     begin
       isalpha := (upcase(ch)>='A') and (upcase(ch)<='Z');
     end; { is alpha }

     procedure break2(inf: str80);
     var
       infile: file of char;
       ch: char;
       done: boolean;
       t, l: integer;

     begin
       assign(infile, inf);
       reset(infile);

       done := FALSE;

       l := 1;
       repeat
         Read(infile, message[l]);
         message[l] := upcase(message[l]);
         l := l+1;
       until eof(infile);
       l := l-1; {очистка признака конца файла }

       repeat
         Write('введите алфавит замены: ');
         ReadLn(sub);
         for t := 1 to l do

         begin
           ch := message[t];
           if isalpha(ch) then
            ch := sub[ord(ch)-ord('A')];
           Write(ch);
         end;
         WriteLn;
         WriteLn('декодирован ? (Y/N): ');
         ReadLn(ch);
         if upcase(ch)='Y' then done:=TRUE;
       until done;
       WriteLn('алфавит подстановки : ', sub);
       close(infile);
     end; {besub2}

     begin
       Write('введите имя входного файла: ');
       ReadLn(inf);
       break2(inf);
     end.

     В отличие от шифров замены шифры перестановки и  манипуляции
битами  труднее  для  дешифрации методами проб и ошибок.  Если вы
должны расшифровать более сложный код, то желаем удачи.

 
« Предыдущая статья   Следующая статья »