Шифры замены

advertisement
Шифры замены
Программирование алгоритмов

Шифр замены – преобразования
заключаются в замене каждого символа
(слова) открытого сообщения на другие
символы – шифрообозначения, порядок
следования шифрообозначений совпадает
с порядком следования соответствующих
им символов в открытом тексте.
Шифр Цезаря
(замена со сдвигом)

Каждый символ открытого текста заменяется символом,
находящимся тремя символами правее в алфавите
Таблица для сдвига, равного 3.
А
Г
Р
У
Б
Д
С
Ф
В
Е
Т
Х
Г
Ж
У
Ц
Д
З
Ф
Ч
Е
И
Х
Ш
Ж
Й
Ц
Щ
З
К
Ч
Ъ
И
Л
Ш
Ы
Й
М
Щ
Ь
К
Н
Ъ
Э
Л
О
Ы
Ю
М
П
Ь
Я
Н
Р
Э
А
О
С
Ю
Б
П
Т
Я
В
Шифр Цезаря
(замена со сдвигом)


Букву заменяют на ее естественный номер в
алфавите
Этот шифр может быть описан уравнением
C=(M+K) mod N,
где М - номер буквы исходного текста в
алфавите, С - номер буквы зашифрованного
текста в алфавите, K – ключ (число, на которое
делаем смещение), N – количество букв в
алфавите, mod – операция вычисления остатка
от деления.
Программный код для алгоритма Цезаря
program cezar;
var n,i,r:integer; s:string;
begin
writeln('vvedite stroku');
readln(s);
writeln('vvedite regim: 1-shifrovanie, 2-rasshifrovanie');
readln(r);
if r=1 then begin
i:=1;
while i<=length(s) do
{убираем пробелы из открытого текста}
if s[i]=‘ ' then delete(s,i,1) else i:=i+1;
for i:=1 to length(s) do begin
n:=ord(s[i])+3; if n>ord('z') then n:=ord('a')+n-ord('z')-1;
s[i]:=chr(n); end;
end
else
for i:=1 to length(s) do begin
n:=ord(s[i])-3; if n<ord('a') then n:=ord('z')-(ord('a')-n-1);
s[i]:=chr(n); end;
writeln(s);
end.
Шифр Виженера


предполагает выбор ключа, который
рассматривают как блоковую
последовательность букв, а сообщение
разбивают на блоки длиной,
соответствующей длине ключа.
Затем выполняют операцию сложения по
модулю номеров каждой буквы исходного
текста с номером соответствующей буквы
ключа в блоке и по полученному номеру
записывают букву в зашифрованный текст.
Шифр Виженера


Для примера используем слово ФАЙЛ, состоящее
из 4 букв, как ключ. Алфавитным номерам букв
соответствует блок чисел 21, 1, 10, 12.
Чтобы зашифровать сообщение при помощи
этого ключа, исходный текст разбивается на
блоки длинной в 4 буквы каждый. Затем к
каждому числовому представлению первой буквы
блока надо прибавить 21, к числовому
представлению второй буквы – 1, третьей – 10,
четвертой – 12. Получающиеся суммы по модулю
представляют числовые значения шифртекста.
Шифр сложной замены



-это модификация шифра Цезаря с числовым
ключом.
Под буквами сообщения записывают цифры
числового ключа. Если ключ короче сообщения,
то его запись циклически повторяют.
Шифртекст получают, отсчитывая букву по
алфавиту на соответствующую цифру ключа.
Полибианский квадрат


Квадрат или прямоугольник заполняется
буквами случайным образом.
При шифровании находят букву текста и
заменяют ее буквой, стоящей в строке
ниже ( или первой буквой в столбце).
У
Л
Ф
Ъ
Х
К
А
Т
Э
Ц
Ь
М
Н
Г
И
Б
Ж
О
В
П
Ч
Р
З
Ы
Е
Д
Ю
Ш
С
Щ
Й
Я
Пусть дан квадрат - ключ для шифра
«Полибианский квадрат».
Зашифровать слово «криптография» полученным
ключом.
Найдем в прямоугольнике первую букву слова.
Выберем букву, которая стоит ниже этой буквы, и
запишем ее в качестве первого символа
криптограммы. Выполним аналогичные действия для
всех оставшихся букв слова.
 Получим «азбжхвизтъбс»
Программный код для алгоритма Виженера
program vigener;
var n,i,r:integer; s,s1,s2:string;
begin
writeln('vvedite stroku'); readln(s);
writeln('vvedite kluch'); кeadln(s1);
writeln('vvedite regim: 1-shifrovanie, 2-rasshifrovanie');
readln(r); s2:='';
for i:=1 to length(s) div length(s1)+1 do {размножаем ключ до длины текста}
s2:=s2+s1;
if r=1 then begin i:=1;
while i<=length(s) do
if s[i]=' ' then delete(s,i,1) else i:=i+1;
for i:=1 to length(s) do begin
n:=ord(s[i])+(ord(s2[i])-ord('a'))+1;
if n>ord('z') then n:=ord('a')+(n-ord('z'))mod 26-1;
s[i]:=chr(n); end; end
else
for i:=1 to length(s) do begin
n:=ord(s[i])-(ord(s2[i])-ord('a'))-1;
if n<ord('a') then n:=ord('z')-(ord('a')-n)mod 26+1;
s[i]:=chr(n); end;
writeln(s);
end.
Программный код для алгоритма Полибианский
квадрат
program polib_kvadrat;
var n,i,r,j,k:integer; s,s1:string; a:array[1..5,1..5] of char;
begin
writeln ('vvedite rasmer kvadrata');}readln(n);
writeln ('vvedite bukvi alfavita v kvadrad rasmera',' ',n);
for k:=1 to n do begin
for j:=1 to n do read(a[k,j]); readln; end;
writeln('vvedite stroku'); readln(s);
writeln('vvedite regim: 1-shifrovanie, 2-rasshifrovanie');
readln(r); s1:=''; {формируемая новая строка}
if r=1 then begin
i:=1;
while i<=length(s) do if s[i]=' ' then delete(s,i,1) else i:=i+1;
for i:=1 to length(s) do
for k:=1 to n do
for j:=1 to n do if s[i]=a[k,j] then
if k<n then s1:=s1+a[k+1,j] else s1:=s1+a[1,j];
end
else
for i:=1 to length(s) do
for k:=1 to n do
for j:=1 to n do if s[i]=a[k,j] then
if k>1 then s1:=s1+a[k-1,j] else s1:=s1+a[n,j];
writeln (s1);
end.
Download