Lekce 5 - Ukázka jednoduché šifrace textu Vigenerova šifra
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:
M | O | R | I | B | U | N | D | U | S |
A | H | O | J | A | H | O | J | A | H |
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 Caesarovi šifry -> odečteme od výsledku 25
109 | 111 | 114 | 105 | 98 | 117 | 110 | 100 | 117 | 115 |
1 | 8 | 15 | 10 | 1 | 8 | 15 | 10 | 1 | 8 |
N | O | R | I | B | U | N | D | U | S |
N | W | R | I | B | U | N | D | U | S |
N | W | G | I | B | U | N | D | U | S |
N | W | G | S | B | U | N | D | U | S |
N | W | G | S | C | U | N | D | U | S |
N | W | G | S | C | C | N | D | U | S |
N | W | G | S | C | C | C | D | U | S |
N | W | G | S | C | C | C | N | U | S |
N | W | G | S | C | C | C | N | V | S |
N | W | G | S | C | C | C | N | V | A |
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); // shift $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); }
Komentáře


Zobrazeno 5 zpráv z 5.