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