Ukázka jednoduché šifrace textu Vigenerova šifra

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

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);
}

 

  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 (2 hlasů) :
55555


 


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

 

 

Komentáře

Avatar
Miroslav Melzer:

Řeším java cvičení, zašifrovat text do Vigenerovy šifry,ale nějak nechápu ten princip.
*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'*
Nevim jestli to dobře popíšu (to co nechápu)... proč se u textu (moribundus) pracuje s ascii hodnotou nebo ordinární 109 pro M a u hesla (ahoj) se odečítá 96 jako, že A je první ? Proč teda se nepřevádí už u toho textu, že vlastně M je 13té písmeno? Jak jako můžu k ascii soustavě přičítat jinou "normální" abecedu ?
A ještě, na wikipedii je uveden Vigenerův čtverec. Proč jsou ty výsledky zašifrování odlišné od zde uváděného "šifrovátka" online ? Moribundus s heslem ahojahojah tam vypadá takhle:
mvfrbbbmmz....(vše posunuté o 1)

 
Odpovědět 24. listopadu 10:38
Avatar
Miroslav Melzer:
  • oprava mvfrbbbmuz
 
Odpovědět 24. listopadu 11:09
Avatar
Odpovídá na Miroslav Melzer
Miroslav Melzer:

Tak už jsem to pochopil, proč -96....ale asi by se mělo odečítat 97.....

 
Odpovědět 25. listopadu 11:53
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 3 zpráv z 3.