Шифры замены Программирование алгоритмов Шифр замены – преобразования заключаются в замене каждого символа (слова) открытого сообщения на другие символы – шифрообозначения, порядок следования шифрообозначений совпадает с порядком следования соответствующих им символов в открытом тексте. Шифр Цезаря (замена со сдвигом) Каждый символ открытого текста заменяется символом, находящимся тремя символами правее в алфавите Таблица для сдвига, равного 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.