Ukázka jednoduché šifrace textu Vigenerova šifra

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

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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

 

 

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Jak se ti líbí článek?
3 hlasů
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í.
Miniatura
Všechny články v sekci
Ostatní algoritmy
Miniatura
Následující článek
Úvod do analýzy přirozeného jazyka
Aktivity (1)

 

 

Komentáře

Avatar
Miroslav Melzer:24.11.2016 10:38

Ř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.11.2016 10:38
Avatar
Miroslav Melzer:24.11.2016 11:09
  • oprava mvfrbbbmuz
 
Odpovědět 24.11.2016 11:09
Avatar
Odpovídá na Miroslav Melzer
Miroslav Melzer:25.11.2016 11:53

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

 
Odpovědět 25.11.2016 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.