C# týden Slevový týden - Březen
Využij náš slevový týden a získej až 30 % bodů navíc zdarma! Zároveň také probíhá C# týden se slevou na e-learning až 80 %
Hledáme fulltime programátora do ITnetwork týmu -100% homeoffice, 100% časově flexibilní #bezdeadlinu Mám zájem!

Ukážka jednoduché šifrace texte Vigenerova šifra

Vigenerova šifrace textu spočíva v zadanom hesle. Text sa posunie práve o toľko znakov, koľko činí v závislosti na postupnosti jednotlivé písmená v hesle v ascii hodnote. Ak 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 u Caesarove šifry avšak tu je pre každé písmeno v slove použité postupne každé písmenko z hesla (ak je slovo dlhší ako heslo potom sa heslo opakuje). Názorná ukážka:

M O R Aj B U N D U S
A H O J A H O J A H
Všetky písmená sa prevedú postupne na ich ascii hodnotu a písmeno z textu sa sčíta s písmenom z hesla ktoré mu patria.

'M' = 109 'a' = 97 (tu berieme do úvahy koľké písmeno v abecede to je) takže odpočítame 96

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

109 + 1 = 110 -> 'n'

Ak by sa stalo že písmene presahuje '122' ( 'z') postupuje sa rovnako ako u Caesarovi šifry -> odpočítame 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 Aj B U N D U S
N W R Aj B U N D U S
N W G Aj 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 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); // 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 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);
}

 

 

Článok pre vás napísal David Jančík
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Všetky články v sekcii
Ostatné algoritmy
Aktivity (1)

 

 

Komentáre

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)

 
Odpovedať
24.11.2016 10:38
Avatar
Miroslav Melzer:24.11.2016 11:09
  • oprava mvfrbbbmuz
 
Odpovedať
24.11.2016 11:09
Avatar
Odpovedá 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.....

 
Odpovedať
25.11.2016 11:53
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Ondřej Tesař:13.12.2018 2:40

Ahoj všem myslím si, že ve výkladu je chyba. Znaků v abecedě je 26, tudíž při přetečení abecedy je potřeba odečíst 26 a ne 25 jak je uvedeno. Například poslední znak by nevycházel - S(115) s posunem H(8) je 123, 123 - 25 = 98 -> B. Prosím o opravu. Přeji všem pěkný den. Ondřej

 
Odpovedať
13.12.2018 2:40
Avatar
Martin Masáček:18. marca 3:15

Přepsal jsem si kód podle předlohy do c#.
Šifrování funguje úplně stejně. Problém je s dešifrováním.
Prosím o odpověď. Martin

 
Odpovedať
18. marca 3:15
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 5 správy z 5.