Страница 23 из 37
Дешифрация Глава о криптографии была бы не полной без краткого обзора дешифрации. Искусство дешифрации - это в сущности метод проб и ошибок. Без применения цифрового компьютера благодаря исчерпываю- щему анализу могут быть расколоты относительно простые шифры. Од- нако, более сложные коды либо не могут быть расшифрованы, либо требуют методов и ресурсов, которых не существует. Для простоты в данном разделе сосредоточимся на дешифрации наиболее простых ко- дов. Если вы желаете расшифровать сообщение, которое было зашиф- ровано с помощью метода простой замены со смещенным алфавитом, то вы должны попробовать все 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.
В отличие от шифров замены шифры перестановки и манипуляции битами труднее для дешифрации методами проб и ошибок. Если вы должны расшифровать более сложный код, то желаем удачи.
|