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