Шифр Цезаря, также известный как шифр сдвига, код Цезаря или сдвиг Цезаря — один из самых простых и наиболее широко известных методов шифрования.
Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите.
Например, в шифре со сдвигом вправо на 3, А была бы заменена на Г, Б станет Д, и так далее.
Шифр назван в честь римского полководца Гая Юлия Цезаря, использовавшего его для секретной переписки со своими генералами.
Шаг шифрования, выполняемый шифром Цезаря, часто включается как часть более сложных схем, таких как шифр Виженера, и всё ещё имеет современное приложение в системе ROT13. Как и все моноалфавитные шифры, шифр Цезаря легко взламывается и не имеет почти никакого применения на практике.
Программа просит ввести строку и ключ (размер сдвига). Если ключ k положителен, выполняется шифрование, если отрицателен — дешифрование.
Pascal
program caesar1;
const
sym = 'abcdefghijklmnopqrstuvwxyz '+
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'+
'01234567890.';
var
s0,s1: string;
key:integer;
procedure Encrypt(s: string;k: integer;var es:string);
var
l,ll,i,p: integer;
c:char;
begin
l:=length(s); ll:=length(sym);
es:=s;
for i:=1 to l do begin
c:=s[i];
p:=pos(c,sym); p:=p+k;
if p>ll then p:=p-ll;
es[i]:=sym[p];
end;
end;
procedure Decrypt(s:string;k:integer;var ds:string);
var
l,ll,i,p:integer;
c: char;
begin
L:=length(s); ll:=length(sym);
k:=1;
ds:=s;
for i:=1 to l do begin
c:=s[i];
p:=pos(c,sym)-k; if p<=0 then p:=p+ll;
ds[i]:=sym[p];
end;
end;
begin
write('Input text: '); readln(s0);
write('Input key: '); readln(key);
if key>0 then Encrypt(s0,key,s1)
else Decrypt(s0,-key,s1);
writeln(s1);
readln;
end.
Python
В программе шифруется текст «A simple example.» . Ключ генерируются случайным образом
from string import printable
import random
EXAMPLE_KEY = ''.join(sorted(printable, key=lambda _:random.random()))
def encode(plaintext, key):
return ''.join(key[printable.index(char)] for char in plaintext)
def decode(plaintext, key):
return ''.join(printable[key.index(char)] for char in plaintext)
original = "A simple example."
encoded = encode(original, EXAMPLE_KEY)
decoded = decode(encoded, EXAMPLE_KEY)
print("""The original is: {}
Encoding it with the key: {}
Gives: {}
Decoding it by the same key gives: {}""".format(
original, EXAMPLE_KEY, encoded, decoded))