V minulej lekcii, Pod pokrievkou šifrovacieho algoritmu RC4 , sme si ukázali algoritmus RC4, ktorý sa
používa v zabezpečení WEP.
Vigenerova šifraca textu spočíva v zadanom hesle. Text sa posunie práve o
toľko znakov, koľko činí v závislosti od postupnosti jednotlivé písmená
v hesle v ascii hodnote. Pokiaľ napríklad zadáme 'ahoj' a ako heslo 'a' potom
sa všetky písmená v slove posunú práve o jedno -> vznikne 'bipk'. Avšak
ak zadáme ako heslo 'ahoj' potom to bude zaujímavejšie. Skúsime si to na
nejakom odlišnom slove radšej. Napríklad 'moribundus' a heslo 'ahoj'. Ide
vlastne o rovnakú metódu šifrovania ako pri Caesarovej
šifri, avšak tu je pre každé písmeno v slove použité postupne každé
písmenko z hesla (pokiaľ je slovo dlhšie ako heslo potom sa heslo opakuje).
Názorná ukážka:
Všetky písmená sa prevedú postupne na ich asciu hodnotu a písmeno z textu
sa spočíta s písmenom z hesla ktoré mu patrí.
'm' = 109 'a' = 97 (tu berieme do úvahy koľké písmeno v abecede to je)
takže odpočítame 96
109 + 1 = 110 -> 'n'
Pokiaľ by sa stalo že písmenu presahuje '122' ('z') postupuje sa rovnako
ako u Caesarovej šifry -> odpočítame od výsledku 25
109 |
111 |
114 |
105 |
98 |
117 |
110 |
100 |
117 |
115 |
Vigenerovu šifru si
môžete v praxi vyskúšať tu.
Ak by sme chceli Vigenerovu šifru ako algoritmus potom by to bolo v PHP
nejako takto:
(odstránime medzery, dikritiku a prevedieme písmená 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 sa vykonáva rovnako akurát zameníte znamienko na druhom riadku
v cykle
$text[$i] = chr(ord($text[$i]) - $x);
V podmienke otočíte zobáčik zmeníte 'z' na 'a' a dole prehodíte
znamienko
if (ord($text[$i]) < ord('a')) {
$x = ord('z') - ord('a') + 1;
$text[$i] = chr(ord($text[$i]) + $x);
}