Caesarova šifra je jednoduchou substituční šifrou, jejíž princip spočívá v posunu každého písmene otevřeného textu o konstantní počet míst v abecedě. Ačkoliv se v době Julia Caesara používala jen varianta posunu o 3 písmena, tak název se Caesarova šifra používá pro všechny varianty tohoto šifrovacího systému.
Šifrování proto probíhá dle následujícího vzorce:
Ti - i-tý znak otevřeného textu
k - posun
m - délka abecedy
Dešifrování funguje přesně opačným způsobem (odečtením posunu od šifrovaného textu):
Útoky na Caesarovu šifru
Všechny varianty
Protože variant je jen tolik, jaká je délka abecedy, tak se dají snadno zkusit všechny možnosti a vybrat tu, která dává smysl.
Frekvenční analýza
Pokud víme, v jakém jazyce byl napsán otevřený text, tak zároveň známe percentuelní zastoupení písmen v otevřeném textu. Dále zjistíme frekvenci písmen v zachyceném šifrovaném textu a prostým porovnáním frekvencí znaků zjistíme posun. Se znalostí posunu jsme schopni dešifrovat zachycený text.
Příklad
Šifrování
Otevřený text: "barbariutoci", posun: 3
b + 3 = 1 + 3 = 4 = e a + 3 = 0 + 3 = 3 = d r + 3 = 17 + 3 = 20 = u b + 3 = 1 + 3 = 4 = e a + 3 = 0 + 3 = 3 = d r + 3 = 17 + 3 = 20 = u i + 3 = 8 + 3 = 11 = l u + 3 = 20 + 3 = 23 = x t + 3 = 19 + 3 = 22 = w o + 3 = 14 + 3 = 17 = r c + 3 = 2 + 3 = 5 = f i + 3 = 8 + 3 = 11 = l
Šifrovaný text: "eduedulxwrfl"
Dešifrování
Šifrovaný text: "eduedulxwrfl", posun: 3
e - 3 = 4 - 3 = 1 = b d - 3 = 3 - 3 = 0 = a u - 3 = 20 - 3 = 17 = r e - 3 = 4 - 3 = 1 = b d - 3 = 3 - 3 = 0 = a u - 3 = 20 - 3 = 17 = r l - 3 = 11 - 3 = 8 = i x - 3 = 23 - 3 = 20 = u w - 3 = 22 - 3 = 19 = t r - 3 = 17 - 3 = 14 = o f - 3 = 5 - 3 = 2 = c l - 3 = 11 - 3 = 8 = i
Otevřený text: "barbariutoci"
Kód
01.
/**
02.
* Caesarova sifra
03.
* @author Pavel Micka
04.
*/
05.
public
class
CaesarCipher {
06.
/**
07.
* Posun (Caesarova sifra ma 3)
08.
*/
09.
public
static
final
int
SHIFT =
3
;
10.
11.
/**
12.
* Zasifruje Caesarovou sifrou
13.
* @param s retezec obsahujici pouze velka pismena
14.
* @return zasifrovany retezec
15.
*/
16.
public
static
String encipher(String s){
17.
StringBuilder builder =
new
StringBuilder();
18.
for
(
int
i =
0
; i < s.length(); i ++){
19.
if
(s.charAt(i) <
65
|| s.charAt(i) >
90
){
//znak v ASCII
20.
throw
new
IllegalArgumentException(
""
+
21.
"Sifrovany retezec neobsahuje jen velka pismena"
);
22.
}
23.
//modularne pricteme shift
24.
char
enciphered = s.charAt(i) + SHIFT >
90
? (
char
)((s.charAt(i) + SHIFT) -
26
) : (
char
)(s.charAt(i) + SHIFT);
25.
builder.append(enciphered);
26.
}
27.
return
builder.toString();
28.
}
29.
/**
30.
* Desifruje retezec zasifrovany Caesarovou sifrou
31.
* @param s retezec k desiforvani
32.
* @return desifrovany retezec
33.
*/
34.
public
static
String decipher(String s){
35.
StringBuilder builder =
new
StringBuilder();
36.
for
(
int
i =
0
; i < s.length(); i ++){
37.
if
(s.charAt(i) <
65
|| s.charAt(i) >
90
){
//znak v ASCII
38.
throw
new
IllegalArgumentException(
""
+
39.
"Desifrovany retezec neobsahuje jen velka pismena"
);
40.
}
41.
//modularne odecteme shift
42.
char
deciphered = s.charAt(i) - SHIFT <
65
? (
char
)((s.charAt(i) - SHIFT) +
26
) : (
char
)(s.charAt(i) - SHIFT);
43.
builder.append(deciphered);
44.
}
45.
return
builder.toString();
46.
}
47.
}