Ukázka jednoduché šifrace textu Caesarova šifra

Algoritmy Ostatní Ukázka jednoduché šifrace textu Caesarova šifra

Caesarova šifrace textu spočívá v posunu každého znaku v zadaném slově právě o zadaný číselný počet. Pokud například zadáte slovo 'ahoj' a zvolíte posun o jeden znak. Pak se s tímto slovem stane postupně toto:

'a' se převede na číselnou ascii hodnotu => '97' k tomuto číslu se přičte zvolený posun v našem případě '1' == '98', poté se ascii hodnota převede zpět na písmeno => 'b' a postoupí se k dalšímu písmenu

Pokud bychom chtěli například posunout 'z' o 4 místa tak si můžete všimnout že v ascii tabulce je '~' jenže v Caesarově šifře je posun přes 'z' na 'a' takže by nám mělo vyjít 'e', proto když je rozsah větší jak 122 ('z') tak se od výsledku odečte 25 (počet písmen v anglické abecedě je 26 a právě s jedním písmenem operujeme proto ho nezapočítáváme) Toho se také využívá v šifrování pomocí 'ROT13' kde se všechny znaky posouvají o 13 znaků tím pádem je to šifrace i dešifrace. V linuxech je přímo utilita zvaná tr která vám text takto zašifruje. Caesarova šifra pokud zvolíte posun o 13 znaků takto samozřejmě také funguje.

A H O J
B H O J
B I O J
B I P J
B I P K

Zde si můžete vyzkoušet Caesarovu šifru v praxi.

Poku bychom chtěli napsat algoritmus na tuto šifru v PHP by to vypadalo nějak takhle:
(zbavíme se prvně diakritiky a text převedeme na malé písmena -> iconv, strtolower)

for($i=0;$i<strlen($text);$i++)
        $text[$i] = chr(ord($text[$i]) + $posun);

Krásné dva řádky kódu. Ovšem je tu problém co když tam napíšu 'z' a dám posun o 4 já nechci přece '~' já chci 'e'

Musíme náš kód rozšířit o další dva řádky

if (ord($text[$i]) > ord('z')) {
        $thumb = ord('z') - ord('a') + 1;
        $text[$i] = chr(ord($text[$i]) - $thumb);
}

Pozn.: Dešifrace probíha obdobně akorát změníte v cyklu znaménko na '-', v podmínce otočíte zobáček a přepíšete 'z' na 'a' a $thumb budeme teď přičítat

if (ord($text[$i]) < ord('a')) {
        $thumb = ord('z') - ord('a') + 1;
        $text[$i] = chr(ord($text[$i]) + $thumb);
}

 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Celkem (4 hlasů) :
4.54.54.54.54.5


 


Miniatura
Všechny články v sekci
Ostatní algoritmy

 

 

Komentáře

Avatar
Kristýna Janoušková:

Zdravím, zajímalo by mě, jak by kód vypadal, kdyby na začátku uživatel zadal např 1 z 5 možných vět, která už je zašifrovaná ale nevíme o jaký posun a úkolem je vypsat právě hodnotu toho posunu? :)

 
Odpovědět 8. listopadu 11:36
Avatar
Odpovídá na Kristýna Janoušková
Libor Šimo (libcosenior):

Správne chápem, že tých 5 možných viet by bolo zadaných nezašifrovaných a tá jedna vybratá by bola aj zašifrovaná?

Odpovědět 8. listopadu 11:57
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Kristýna Janoušková:

Ano, přesně tak :) měla jsem to lépe popsat.

 
Odpovědět 8. listopadu 12:21
Avatar
Odpovídá na Libor Šimo (libcosenior)
Kristýna Janoušková:

A ještě dodatek, ani to nemusí být přímo v kódu klidně jen pseudokód.

Editováno 8. listopadu 12:43
 
Odpovědět 8. listopadu 12:43
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Kristýna Janoušková
Martin Dráb:

Nenapíšu pseudokód, ale...

Počet možných posunů je poměrně malý (řekněme 26), takže se dají bez problémů na "zašifrovaný" text všechny vyzkoušet. Pak jde jen o to poznat, která z variant je správná. Pokud znáš jazyk otevřeného textu, můžeš použít heuristiku pro jeho detekci – například se dívat na dvojice po sobě jdoucích písmen a přiřazovat danému textu skóre podle toho, jak moc obvykle jednotlivé dvojice v jazyce jsou (třeba QX asi v češtině moc nenajdeš). To samé lze použít i pro jednotlivá písmena.

Obecnější postup je provést frekvenční analžzu: zjistit si četnosti jednotlivých písmen v textu a namapovat je na relativní četnosti písmen v daném jazyce (tzn. pokud víme, že v našem jazyce je nejčastější E a v "šifrovaném" textu je to H, pravděpodobně H by se mělo dešifrovat na E). Tento postup pořeší nejen Caesara, ale i obecnější variantu – monoalfabetickou substituční šifru (nedělá e posun, ale máš tabulku (permutaci) překládající jednotlivá písmena na jiná).

Pro oba postupy platí: čím delší text, tím lepší výsledky.

Odpovědět 8. listopadu 13:50
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Kristýna Janoušková
Libor Šimo (libcosenior):

Takze je to jednoduche. Budes porovnavat dekodovany text s jednotlivymi vetami a pri zhode vypises posun.
Nehnevaj sa, ale kod ti nenapisem. To by si sa nic nenaucila. ;-)

Odpovědět 8. listopadu 20:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Kristýna Janoušková:

Jo děkuji, v průběhu dne na to tak nějak krok po kroku vymíšlím. Je mi jasné že nějak se to naučit musím :)

 
Odpovědět 8. listopadu 20:38
Avatar
Odpovědět 8. listopadu 20:39
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.