Ukážka jednoduché šifrace texte cézarova šifra
Caesarovho šifrace textu spočíva v posune každého znaku v zadanom slove práve o zadaný číselný počet. Ak napríklad zadáte slovo 'ahoj' a zvolíte posun o jeden znak. Potom sa s týmto slovom stane postupne toto:
'A' sa prevedie na číselnú ascii hodnotu => '97' k tomuto číslu sa pripočíta zvolený posun v našom prípade '1' == '98', potom sa ascii hodnota prevedie späť na písmeno => 'b' a postúpi sa k ďalšiemu písmene
Ak by sme chceli napríklad posunúť 'z' o 4 miesta tak si môžete všimnúť že v ascii tabuľke je '~' lenže v Cézarovej šifre je posun cez 'z' na 'a' takže by nám malo vyjsť 'e', preto keď je rozsah väčší ako 122 ( 'z') tak sa od výsledku odpočíta 25 (počet písmen v anglickej abecede je 26 a práve s jedným písmenom operujeme preto ho nezapočítavame) Toho sa tiež využíva v šifrovanie pomocou 'ROT13' kde sa všetky znaky posúvajú o 13 znakov tým pádom je to šifrace aj dešifrace. V Linuxe je priamo utilita zvaná tr ktorá vám text takto zašifruje. Cézarova šifra ak zvolíte posun o 13 znakov takto samozrejme tiež funguje.
A | H | O | J |
B | H | O | J |
B | Aj | O | J |
B | Aj | P | J |
B | Aj | P | K |
Poku by sme chceli napísať algoritmus na túto šifru v PHP by to vyzeralo
asi takto:
(Zbavíme sa prvýkrát diakritiky a text prevedieme na malé písmená ->
iconv, strtolower)
for($i=0;$i<strlen($text);$i++) $text[$i] = chr(ord($text[$i]) + $posun);
Krásne dva riadky kódu. Ovšem je tu problém čo keď tam napíšem 'z' a dám posun o 4 ja nechcem predsa '~' ja chcem 'e'
Musíme náš kód rozšíriť o ďalšie dva riadky
if (ord($text[$i]) > ord('z')) { $thumb = ord('z') - ord('a') + 1; $text[$i] = chr(ord($text[$i]) - $thumb); }
Pozn .: Dešifrace prebieha obdobne akurát zmeníte v cykle znamienko na '-', v podmienke otočíte zobáčik a prepíšete 'z' na 'a' a $ thumb budeme teraz pričítať
if (ord($text[$i]) < ord('a')) { $thumb = ord('z') - ord('a') + 1; $text[$i] = chr(ord($text[$i]) + $thumb); }