Понятно, что для расшифровки символа мы выполним обратный сдвиг. После вычитания ключа проверим, не попадает ли полученная разность в область управляющих символов? Если попадает, поправим её, сместив в область видимых символов. Вот текст функции расшифровки Decrypt . function Decrypt(arg: char): char; var x: integer; begin x:= Ord(arg)– CKey; if x <32 then x:= x+256–32; Decrypt:= Chr(x); end; Теперь все готово для построения программы зашифровки и расшифровки строки P_24_1 . < P_24_1 – Шифрование строки>const CKey = 2; < Ключ Цезаря > function Encrypt(arg: char): char; var x: integer; begin x:= Ord(arg)+ CKey; if x>255 then x:= x–256+32; Encrypt:= Chr(x); end;
Глава 24 Криптография <––––– Расшифровка одного символа –––––>function Decrypt(arg: char): char; var x: integer; begin x:= Ord(arg)– CKey; if x procedure EncryptStr(var arg: string); var k: integer; begin for k:=1 to Length(arg) do arg[k]:= Encrypt(arg[k]); end; <––––– Расшифровка строки –––––>procedure DecryptStr(var arg: string); var k: integer; begin for k:=1 to Length(arg) do arg[k]:= Decrypt(arg[k]); end; <––––– Главная программа –––––>var S: string; Oper: integer; begin repeat Write(‘Введите строку: ‘); Readln(S); Writeln(‘Укажите операцию: 1– шифровать,’+ ’ 2– расшифровать,’+ ’ Прочие – выход’); Readln(Oper); case Oper of 1: EncryptStr(S); 2: DecryptStr(S); else Break; end; Writeln(S); < печатаем результат >until false; end.
ЭТИЧНЫЙ ХАКЕР: Шифр Цезаря на Python в 13 строк.
Глава 24 Криптография Программа нуждается лишь в кратких пояснениях. Глобальная константа CKey содержит ключ шифра. Если со временем захотите сменить его, достаточно будет изменить константу и заново откомпилировать программу. Далее следуют описания двух функций: Encrypt и Decrypt — для зашифровки и расшифровки символа.
Процедуры EncryptStr и DecryptStr шифруют и расшифровывают строки, передаваемые им по ссылке VAR . И, наконец, в главной программе организован цикл для ввода шифруемой строки и кода выполняемой операции ( Oper ). Откиньтесь в кресле и полюбуйтесь простотой блоков, составляющих эту программу! А во что бы мы превратили её, свалив в кучу эти простые алгоритмы?
В заключение приведу протокол шифрования: я ввел слово «pascal» и зашифровал его, получив слово «rcuecn». Затем ввел строку «rcuecn» и расшифровал её, получив назад данное мною слово. Введите строку: pascal Операции: 1 – шифровать, 2 – расшифровать, прочие – выход Введите операцию: 1 rcuecn Введите строку: rcuecn Операции: 1 – шифровать, 2 – расшифровать, прочие – выход Введите операцию: 2 pascal Операции: 1 – шифровать, 2 – расшифровать, прочие – выход Введите операцию: 3 Вряд ли я удержу вас от испытания столь полезного изделия. Во избежание ошибок шифруйте строки небольшой длины. Рекомендую также хотя бы разок пройти программу по шагам.
Итоги
∙ В памяти компьютера символы представлены своими кодами — числами. ∙ Общее количество символов составляет 256, из них первые 32 — это управляющие, а остальные — видимые символы. ∙ Для преобразования числового кода в символ применяют функцию Chr . Для обратного превращения — символа в число — пользуются функцией Ord .. ∙ Паскаль «знает» о том, что символы кодируются числами, поэтому в счетчике цикла FOR допустимы символьные переменные, а в метках оператора CASE — символьные константы.
Шифр Цезаря Pascal Д346
Источник: studfile.net
Шифрование со сдвигом методом Цезаря — Pascal ABC
Нужно написать код шифрования со сдвигом. При этом алфавит обозначить в массиве. В алфавите должны быть и буквы и символы. В написанной программе шифр выполняется, но массив тут не имеет значения, а нужно его использовать. Что нужно дописать?
Код к задаче: «Шифрование со сдвигом методом Цезаря»
Листинг программы
var n, i: integer; s: string; f1, f2: text; begin writeln (‘Введите предложение’); readln (s); writeln (‘Чему равен сдвиг?’); readln (n); write(‘Шифр Цезаря -> ‘); for i := 1 to length(s) do begin if s[i] in [‘а’..’я’] then if (ord(s[i]) + n) < ord(‘я’) then s[i] := chr(ord(s[i]) + n) else s[i] := chr(ord(‘а’) + (ord(s[i]) + n — ord(‘а’))mod 32) else if s[i] in [‘А’..’Я’] then if (ord(s[i]) + n) < ord(‘Я’) then s[i] := chr(ord(s[i]) + n) else s[i] := chr(ord(‘А’) + (ord(s[i]) + n — ord(‘А’))mod 32); write(s[i]) end end.
Источник: studassistent.ru
Код цезаря программа паскаль
написать две программы, первая — сдвигает каждый символ текста на введенное количество символов по русскому алфавиту, вторая — дешифрует текст в исходное состояние
вот код 1 программы:
program anslovo22; var alf,anslovo,slovo:string; i,n,k,p:integer; BEGIN writeln(‘введите количество сдвигов’); readln(n); writeln(‘введите текст’); readln(anslovo); alf:=’абвгдежзийклмнопрстуфхцчшщъыьэюя ‘; for i:=1 to length(slovo) do begin for k:=1 to length(alf) do if slovo[i]=alf[k] then p:=(k+n) mod 34; anslovo:=alf[p]; end; writeln(‘зашифрованный текст=’,anslovo); readln; END.
Последний раз редактировалось Stilet; 02.12.2012 в 14:02 .
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,138
var lalp: integer; const alp = ‘абвгдеёжзийклмнопрстуфхцчшщъыьэюя’ + ‘АБВГДЕЁЖЗИЙКЛМНПОРСТУФХЦЧШЩЪЫЬЭЮЯ’ + ‘abcdefghijklmnopqrstuvwxyz’ + ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’ + ‘0123456789’; function Caesar_cipher(str: string; way: integer; key: integer): string; var s: string; i, t: integer; begin if way > 0 then key := -key; key := key mod lalp; if key = 0 then begin writeln(‘Error: wrong key (key not equals zero and not divisible by ‘, lalp, ‘)’); Caesar_cipher := str; exit; end; s := str; for i := 1 to length(str) do begin t := pos(str[i], alp); if t <> 0 then s[i] := alp[(t — 1 + key + lalp) mod lalp + 1]; end; Caesar_cipher := s; end; begin lalp := length(alp); writeln(Caesar_cipher(‘Тестовая фраза’, 0, 12)); // 0 — шифрование; не 0 — дешифрование // 12 — сдвиг readln; end.
Замечания по Вашей программе:
slovo — никак не инициализирована
anslovo:=alf[p] — в anslovo будет 1 буква
(k+n) mod 34 — легко может оказаться равно 0 (ошибка)
Пишите язык программирования — это форум программистов , а не экстрасенсов. (<= это подпись )
Последний раз редактировалось BDA; 02.12.2012 в 14:25 .
Регистрация: 10.04.2013
Сообщений: 1
почему не работает ?
ar a,c,f,kods,r,t,kon,nah:string; i,k,n,b,z,p,xz:integer; begin a:=’abcdefghijklmnopqrstuvwxyz’; f:=a; readln(t); readln(kods); readln(p); c:=kods; b:=length(c); k:=length(a); begin for i:=1 to b do for n:=1 to k do if c[i]=a[n] then delete(a,n,1); kon:=copy(a,0,p); xz:=length(a)-length(kon); nah:=copy(a,xz+1,xz); a:=nah+kods+kon; end; r:=»; begin for i:=1 to length(t) do begin z:=pos(t[i],f); r:=r+a[z]; end; writeln(r); readln end; end.
________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!
Последний раз редактировалось Serge_Bliznykov; 10.04.2013 в 22:10 .
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,138
«почему не работает?» — потому что неправильно что-то написали.
Даже после нескольких прочтений не понял алгоритма Вашей программы.
Пишите язык программирования — это форум программистов , а не экстрасенсов. (<= это подпись )
Регистрация: 23.10.2015
Сообщений: 1
Вот так правильней будет, думаю
program anslovo22; var alf,anslovo,slovo:string; i,n,k,p:integer; BEGIN writeln(‘введите количество сдвигов’); readln(n); writeln(‘введите текст’); readln(slovo); alf:=’абвгдежзийклмнопрстуфхцчшщъыьэюя ‘; for i:=1 to length(slovo) do begin for k:=1 to length(alf) do if slovo[i]=alf[k] then p:=k+n; if p>length(alf) then p:=p-length(alf); anslovo:=anslovo+alf[p]; end; writeln(‘зашифрованный текст=’,anslovo); readln; END.
Последний раз редактировалось BDA; 24.10.2015 в 05:02 . Причина: Тег CODE
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,138
Ceh9i, некропостить нехорошо. Давайте разберем Ваш код:
1) «anslovo» не инициализируется явно.
2) Если в алфавите буквы не окажется, то «p» в лучшем случае будет иметь значение с предыдущей итерации цикла.
3) Если заданный сдвиг «n» гораздо больше длины алфавита, то однократного вычитания длины не хватит.
Источник: www.programmersforum.ru