Метод Цезаря с постоянным сдвигом.

Создание программки шифрования –расшифрования.

В процессе работы над проектом были написаны три программки на языке Паскаль, любая из которых производила шифрование и расшифрование задаваемого текста одним из более старых методов:

1. Способом Цезаря, т.е. обычный моноалфавитной подменой ;

2. Способом Цезаря с неизменным сдвигом, т.е. полиалфавитной подменой с повторяющимся перебором алфавитов;

3. Способом Вижинера Метод Цезаря с постоянным сдвигом., т.е. полиалфавитной подменой с перебором алфавитов по главному слову.

Выбор языка Паскаль обоснован его простотой и изучаемостью в Гимназии.

Общие части программ.

Во всех программках для простоты использовались схожие либо похожие кусочки кода для организации интерфейса в режиме командной строчки, задания начальных данных для работы и вывода результата Метод Цезаря с постоянным сдвигом..

Начальная строчка текста P обрабатывается побуквенно. Номер обрабатываемой буковкы во фразе хранится в переменной i, количество букв во фразе – m. Его просто можно найти с помощью функции нахождения длинны строчки m:=Length(p); а перебор всех букв во фразе организовать оператом цикла For i:=1 to m do (блок Метод Цезаря с постоянным сдвигом. команд);

Где под «блоком команд» понимаются деяния программки по шифрованию либо расшифрованию данной фразы побуквенно.

Так как в шифрах Цезаря и Вижинера шифрование – это положительный сдвиг (по часовой стрелке), а расшифрование – отрицательный (против часовой стрелки) поворотного диска шифровального диска (смотри набросок шифровального диска Конфедерации на страничке 10), то при задании Метод Цезаря с постоянным сдвигом. программке режима шифрования употребляется переменная Z. Это – множитель величины сдвига алфавита, определяющий его направление. Он задаётся равным «1» при шифровании и «‑1» при расшифровании.

Почти всегда при шифровании выкидываются пробелы, чтоб не давать противнику априорной инфы о длине зашифрованного слова. В неких случаях пробелы и знаки препинания заменяются на особенные композиции знаков Метод Цезаря с постоянным сдвигом.. К примеру, германские шифровальщики времён 2-ой Мировой войны подменяли пробелы на XX, запятые на YY, а точки на ZZ. В моих программках пробелы выкидываются и фраза шифруется без пробелов. Правда и все остальные знаки, хорошие от российских букв тоже, но на моём уровне познаний программирования и этого довольно. Сами Метод Цезаря с постоянным сдвигом. буковкы российского алфавита (обычно считаем, что их 32, так как Ё меняем на Е) преобразуются программкой перед обработкой к «верхнему» регистру, другими словами пишутся строчными. Это разъясняется ещё и тем, что для компьютера код буковкы, который он хранит в памяти, различный для строчных и строчных букв. Другими словами «А» не Метод Цезаря с постоянным сдвигом. равно «а» и это затрудняет процесс шифрования древними м етодами на компьютере. Означает, считаем длину алфавита равной 32 строчные буковкы, о чём и объявляем сначала программки Const N=32.

Дальше задаём две строчки с схожим набором букв алфавита, но в одной они мелкие (строчка LC – low case), в другой – огромные (строчка UC Метод Цезаря с постоянным сдвигом. – upper case). Во всех трёх программках есть кусочек кода, который подменяет в начальной фразе Р мелкие буковкы на огромные:

For i:=1 to m do

if (Pos(p[i], lc) > 0) then

p[i]:=uc[Pos(p[i], lc)];

Writeln(p);

Магическая функция Pos(p[i], lc) отыскивает место очередной Метод Цезаря с постоянным сдвигом. i-той буковкы из фразы Р в строке малых букв LC. Если её там не найдено, то функция POS выдаёт ноль. Означает этот знак – НЕ российская буковка. Если функция POS отыскала буковку в строке LC, она выдаёт её номер в этой строке. А мы берём с этим номером буковку из Метод Цезаря с постоянным сдвигом. другой строчки – из UC. Там на том же месте стоит такая же, но большая буковка, которая и запишется заместо малеханькой в нашу обрабатываемую фразу. И по окончании этого цикла все буковкы в строке Р заменятся на огромные!

При программировании метода шифрования и расшифрования тоже употребляется определение места буковкы Метод Цезаря с постоянным сдвигом. в алфавите. Но тут я использую другой способ. Я прочла на Википедии, что компьютерные коды всех знаков представляют собой обыденные натуральные числа от 0 до 255 и сводятся в так именуемые «таблицы кодировки», где 1-ые 128 знаков кодируются идиентично для всех государств (это латиница, знаки препинания и числа), а последние от 129 до 255 кодируются по Метод Цезаря с постоянным сдвигом.-разному для различных языков. Это знаки государственных алфавитов. В русской таблице шифровки Windows-1251, с которой работает использованная мной в проекте среда программирования Pascal-ABC, все огромные российские буковкы идут по порядку с номера 192. Но есть и другие таблицы шифровки российских букв и в их российские буковкы начинаются с других номеров Метод Цезаря с постоянным сдвигом.. К примеру в шифровке CP-866 российский алфавит начинается со 128 номера.

Потому я ввела в свои программки «точку отсчёта» ‑ номер российской буковкы «А» в применяемой шифровке. Он хранится в переменной B и определяется магической функцией ORD('A'):

b:=ord('А');

Обратная ей функция CHR(х) напротив употребляется для печати Метод Цезаря с постоянным сдвигом. на экран буковкы с порядковым номером Х в таблице шифровки.

В итоге я:

Во всех трёх программках я ввела проверку

if (ord(p[i]) >= b) And (ord(p Метод Цезаря с постоянным сдвигом.[i]) < b+N) then

которая определяет по номеру в таблице шифровки, попадает ли обрабатываемая буковка нашей фразу в спектр российских букв от номера B до номера B+N (от «А» до «Я»).

В итоге в зашифрованной фразе, как досадно бы это не звучало, выкидываются все числа, пробелы, знаки препинания и латинские Метод Цезаря с постоянным сдвигом. буковкы.

Но вернуть пробелы можно из контекста, а заместо символов препинания можно использовать сокращения ЗПТ либо ТЧК, как в телеграфных сообщениях.

Результатом работы всех трёх программ будет вывод на экран зашифрованной фразы:

Write( chr(b+ «номер шифросимвола» ) );

Особенностью каждой программки как раз и будет расчёт этого «номера шифросимвола Метод Цезаря с постоянным сдвигом.». Другими словами определение номера в российском алфавите шифруемой буковкы и прибавление, с цчётом «закольцованности» алфавита, к неиу величины сдвига шифрования.

Программка «Цезарь».

Для шифра Цезаря этот сдвиг всегда постоянен и равен исходно данному сдвигу S.

Так как сдвиг повторяющийся, другими словами алфавит «свёрнут» в кольцо, где за «Я Метод Цезаря с постоянным сдвигом.» идёт снова «А», то сдвиг равен остатку от деления на размер алфавита N=32. Такие операции в арифметике именуют «операциями по модулю N» и на Паскале записываются как:

( ord(p[i])-b) + s ) mod N

Тут ord(p[i])-b находит по таблице шифровки номер в алфавите i-го знака из фразы P Метод Цезаря с постоянным сдвигом..

Пусть, к примеру, p[i] ‑ это буковка «Г». Для таблицы шифровки СP-866 b=128,

Тогда ord(«Г»)=131. Вычислим их разницу ord(«Г»)-b=131-128=3. Это номер буковкы «Г» в алфавите. Заодно замечу, что у нас для корректности вычислений нумерация букв в алфавите идёт с нуля до 31!

Пусть сдвиг S=4. Тогда Метод Цезаря с постоянным сдвигом. зашифрованная буковка рассчитывается

( ord(p[i])-b) + s ) mod N =(131-128 +4) mod 32= 7 mod 32 =7

Сейчас оборотный процесс: необходимо напечатать на дисплее эту буковку:

Write( chr(b+ «номер шифросимвола» ) ); где «номер шифросимвола» равен 7.

chr(128+ 7)= chr(135)='З' – На дисплее появится буковка «З».

Если же мы шифруем с этим же сдвигом буковку «Ю Метод Цезаря с постоянным сдвигом.», то

ORD('Ю')=158

( ord(p[i])-b) + s ) mod N = ( 158 - 128 + 4) mod 32 = 34 mod 32 = 2

chr(b+ «номер шифросимвола» )= chr(128+ 2)= chr(130)='B'

Другими словами видно, сложение по модулю 32 позволяет удачно работать «на границе» алфавита, имитировать его «закольцованность».

При расшифровке нужно делать сдвиг в другую строну. Потому в формуле возникает параметр направдения сдвига Z, который равен или Метод Цезаря с постоянным сдвигом. 1, или ‑1. Номер знака тогда рассчитывается по формуле ( ord(p[i])-b) + z*s ) mod N.

Но при расшифровнии, когда сдвиг отрицателен функция mod N не сработает верно, как выясняется на практике. При отрицательном сдвиге может получиться отрицательное число, символ которого mod N не меняет. И в конечном итоге Метод Цезаря с постоянным сдвигом. на дисплее появится знак, стоящий в таблице шифровке ДО начала букв российского алфавита. Это можно поправить, всегда добавляя N к получившемуся номеру буковкы.

Операции по модулю N будут давать однообразный итог, если сдвиг снутри кольца кратен размеру кольца, как часы демонстрируют одно и то же время каждые 12 часов попорядку Метод Цезаря с постоянным сдвигом..

X mod N = (X + K*N) mod N , где К – натуральное чсисло.

Вправду, если мы получили сдвиг 7 , то 7 mod 32 = (7+32) mod 32 = 39 mod 32 = 7

В случае же отрицательного сдвига, к примеру -3, получим (-3+32) mod 32 = 29 mod 32=29

Другими словами опять мы попадаем на буковку снутри «кольца» алфавита и не выходим за его пределы. В конечном итоге Метод Цезаря с постоянным сдвигом. на экран будет выводится знак, который обусловится по формуле:

chr(b+((ord(p[i])-b)+z*s+N) mod N)

Способ Цезаря с неизменным сдвигом.

В данном случае мы каждую буковку фразы шифруем своим адфавитом. Но эти алфавиты перебираются нами по порядку. Другими словами мы сдвигаем номер Метод Цезаря с постоянным сдвигом. буковкы в алфавите на сумму неизменного исходного сдвига и номера буковкы во фразе (s+i). Всё остальное – как в прошлом случае. Получаем формулу определения подмены:

chr(b+((ord(p[i])-b)+z*(s+(i-1) mod N)+N) mod N)

Номер буковкы во фразе тоже берем с нуля и тоже с учётом Метод Цезаря с постоянным сдвигом. закольцованности всех вычислений, потому (i-1) mod N

Способ Вижинера.

Тут мы вводим ещё главную фразу К, которую так же, как и саму шифруемую фразу Р, мы преобразуем в огромные буковкы, после этого запоминаем в переменную К2.

Сейчас сдвиг состоит только из номера в алфавите очередной буковкы в главный фразе Метод Цезаря с постоянным сдвигом.. Его мы также вычисляем по формуле ord(k2[j])-b где j – порядковый номер буковкы в главный фразе. Тщательно способ Вижинера описан на страничке 8.

В конечном итоге буковка определяется по формуле:

chr(b+((ord(p[i])-b)+z*(ord(k2[j])-b)+N) mod N)

Все три программки работают, шифруют Метод Цезаря с постоянным сдвигом. и расшифровывают и использовались мной в работе над последней частью проекта.


Тексты программ.

Program Cezar_codec;

Label eop;

Const N=32;

lc: string = 'йцукенгшщзхъфывапролджэячсмитьбюёЁ';

uc: string = 'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЕЕ';

Var i, s, b, m: byte;

p, w: string;

z: shortint;

begin

s:=0; {сдвиг алфавита}

m:=0; {длина фразы}

z:=1; {направление сдвига}

b:=ord Метод Цезаря с постоянным сдвигом.('А'); {начальная позиция российского алфавита в общей таблице символов}

Write('Выбор деяния (1-шифруем, 2-расшифровываем):');

Readln(i);

case i of

1: begin w:='Ш'; z:=1; end;

2: begin w:='Расш'; z:=-1; end

else goto eop

end;

Writeln(w+'ифрование моноалфавитной подменой');

For i:=1 to 2*N do Write('=');

writeln;

Write('Введите число - ключ шифра (сдвиг алфавита Метод Цезаря с постоянным сдвигом.):');

Readln(s);

s:=s mod N; {защита от дурака}

Write('Введите свою фразу для '+w+'ифрования:');

Readln(p);

m:=Length(p);

if (m=0) then Writeln('Нечего '+w+'ифровать - строчка пустая!')

else

begin

{Преобразуем все буковкы в прописные}

For i:=1 to m do

if (Pos(p[i],lc) > 0) then

p[i]:=uc[Pos Метод Цезаря с постоянным сдвигом.(p[i],lc)];

Writeln(p);

Write(w+'ифрованый текст: ');

For i:=1 to m do

if (ord(p[i]) >= b) And (ord(p[i]) < b+N) then

Write( chr(b+((ord(p[i])-b)+z*s+N) mod N) );

writeln;

end;

eop:

Writeln('Конец работы!');

end.

Program Cezar_codec;

Label eop;

Const N=32;

lc Метод Цезаря с постоянным сдвигом.: string = 'йцукенгшщзхъфывапролджэячсмитьбюёЁ';

uc: string = 'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЕЕ';

Var i, s, b, m: byte;

p, w: string;

z: shortint;

begin

s:=0; {сдвиг алфавита}

m:=0; {длина фразы}

z:=1; {направление сдвига}

b:=ord('А'); {начальная позиция российского алфавита в общей таблице символов}

Write('Выбор деяния (1-шифруем, 2-расшифровываем):');

Readln(i);

case i of

1: begin w Метод Цезаря с постоянным сдвигом.:='Ш'; z:=1; end;

2: begin w:='Расш'; z:=-1; end

else goto eop

end;

Writeln(w+'ифрование полиалфавитной подменой с неизменным сдвигом');

For i:=1 to 2*N do Write('=');

writeln;

Write('Введите число - ключ шифра (исходный сдвиг алфавита):');

Readln(s);

s:=s mod N; {защита от дурака}

Write('Введите свою фразу для '+w+'ифрования:');

Readln(p Метод Цезаря с постоянным сдвигом.);

m:=Length(p);

if (m=0) then Writeln('Нечего '+w+'ифровать - строчка пустая!')

else

begin

{Преобразуем все буковкы в прописные}

For i:=1 to m do

if (Pos(p[i],lc) > 0) then

p[i]:=uc[Pos(p[i],lc)];

Writeln(p);

Write(w+'ифрованый текст: ');

For i:=1 to m do

if (ord(p Метод Цезаря с постоянным сдвигом.[i]) >= b) And (ord(p[i]) < b+N) then

Write( chr(b+((ord(p[i])-b)+z*(s+(i-1) mod N)+N) mod N) );

writeln;

end;

eop:

Writeln('Конец работы!');

end.


Program Cezar_codec;

Label eop;

Const N=32;

lc: string = 'йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЕЁ';

uc: string = 'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЕЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЕЕ';

Var i, j, b, m, dk Метод Цезаря с постоянным сдвигом.: byte;

p, w, k, k2: string;

z: shortint;

begin

dk:=0; {длина ключа}

m:=0; {длина фразы}

z:=1; {направление сдвига}

b:=ord('А'); {начальная позиция российского алфавита в общей таблице символов}

Write('Выбор деяния (1-шифруем, 2-расшифровываем):');

Readln(i);

case i of

1: begin w:='Ш'; z:=1; end;

2: begin w:='Расш'; z:=-1; end

else goto eop

end;

Writeln(w+'ифрование Метод Цезаря с постоянным сдвигом. полиалфавитной подменой Вижинера');

For i:=1 to 2*N do Write('=');

writeln;

Write('Введите слово - ключ шифра (сдвиг алфавита):');

Readln(k);

dk:=Length(k);

k2:='';

For i:=1 to dk do

if (Pos(k[i],lc) > 0) then

k2:=k2+uc[Pos(k[i],lc)];

Writeln(k2);

dk:=Length(k2);

Write('Введите свою фразу для Метод Цезаря с постоянным сдвигом. '+w+'ифрования:');

Readln(p);

m:=Length(p);

if (m=0) then Writeln('Нечего '+w+'ифровать - строчка пустая!')

else

begin

{Преобразуем все буковкы в прописные}

For i:=1 to m do

if (Pos(p[i],lc) > 0) then

p[i]:=uc[Pos(p[i],lc)];

Writeln(p);

Write(w+'ифрованый текст: ');

j:=1;

For i Метод Цезаря с постоянным сдвигом.:=1 to m do

if (ord(p[i]) >= b) And (ord(p[i]) < b+N) then

begin

Write( chr(b+((ord(p[i])-b)+z*(ord(k2[j])-b)+N) mod N) );

j:=(j mod dk) + 1;

end;

writeln;

end;

eop:

Writeln('Конец работы!');

end.


metallicheskie-rekuperatori-naznachenie-ustrojstvo-princip-dejstviya-dostoinstva-i-nedostatki.html
metallicheskoe-oborudovanie.html
metallizirovannie-ognesmesi-pirogeli.html