V minulé lekci, Pod pokličkou šifrovacího algoritmu RC4, jsme si ukázali algoritmus RC4, který se
používá v zabezpečení WEP.
Vigenerova šifrace textu spočívá v zadaném hesle. Text se posune právě
o tolik znaků, kolik činí v závislosti na posloupnosti jednotlivá písmena
v hesle v ascii hodnotě. Pokud například zadáme 'ahoj' a jako heslo 'a' pak
se všechna písmena ve slově posunou právě o jedno -> vznikne 'bipk'.
Avšak pokud zadáme jako heslo 'ahoj' pak to bude zajímavější. Zkusíme si
to na nějakém odlišném slově raději. Například 'moribundus' a heslo
'ahoj'. Jde vlastně o stejnou metodu šifrování jako u Caesarovy
šifry avšak zde je pro každé písmeno ve slově použito postupně
každé písmenko z hesla (pokud je slovo delší než heslo pak se heslo
opakuje). Názorná ukázka:
Všechny písmena se převedou postupně na jejich ascii hodnotu a písmeno z
textu se sečte s písmenem z hesla které mu náleží.
'm' = 109 'a' = 97 (zde bereme v potaz kolikáté písmeno v abecedě to je)
takže odečteme 96
109 + 1 = 110 -> 'n'
Pokud by se stalo že písmenu přesahuje '122' ('z') postupuje se stejně
jako u Caesarovy šifry -> odečteme od výsledku 26
109 |
111 |
114 |
105 |
98 |
117 |
110 |
100 |
117 |
115 |
Vigenerovu šifru si
můžete v praxi vyzkoušet zde.
Pokud bychom chtěli Vigenerovu šifru jako algoritmus pak by to bylo v PHP
nějak takto:
(odstraníme mezery, dikritiku a převedeme písmena na malá -> str_repalce,
iconv, strtolower)
for($i=0; $i < strlen($text); $i++)
{
$x = ord($passwd[$i % strlen($passwd)]) - (ord('a') - 1);
$text[$i] = chr(ord($text[$i]) + $x);
if (ord($text[$i]) > ord('z')) {
$x = ord('z') - ord('a') + 1;
$text[$i] = chr(ord($text[$i]) - $x);
}
}
Dešifrace se provádí stejně akorát zaměníte znaménko na druhém
řádku v cyklu
$text[$i] = chr(ord($text[$i]) - $x);
V podmínce otočíte zobáček změníte 'z' na 'a' a dole přehodíte
znaménko
if (ord($text[$i]) < ord('a')) {
$x = ord('z') - ord('a') + 1;
$text[$i] = chr(ord($text[$i]) + $x);
}