IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

2. diel - Ukážka jednoduchej šifrace textu Albertiho šifra

V minulej lekcii, Úvod do šifrovanie a blokové šifry , sme si uviedli pojem blokové šifry a spôsob, ako túto konštrukciu využiť pre ochranu tajomstva malého rozsahu.

Princíp Albertiho šifry spočíva v šifrovaní textu pomocou 2 šifrovaných abecied. Nepárne pozície znakov sa teda zašifrujú pomocou prvej abecedy a párnej pozície znakov pomocou druhej abecedy. Šifrované abecedy môžu byť samozrejme ľubovoľné. Šifru si môžeme predviesť na slove „ahoj“.

Vytvoríme si klasickú abecedu:

ABCDEFGHIJKLMNOP­QRSTU VWXYZ

K tomu prvú šifrovanú abecedu:

COYQGWMZPBITNJHKSDEFR UVLX A

Plus ešte druhú šifrovanú abecedu:

AXLVURFEDSKHJNTIB­PZMW GQYO C

Slovo "ahoj" si rozdelíme na jednotlivé znaky a tie na nepárne a párne:

AHOJ

  • A - nepárne - prvá abeceda
  • H - párne - druhá abeceda
  • O - nepárne - prvá abeceda
  • J - párne - druhá abeceda
Teraz prejdeme znak po znaku a podľa nepárne alebo párne pozície určíme, ktorú šifrovanú abecedu na znak použijeme. Znak vyhľadáme v klasickej abecede a n-tú pozíciu v tejto abecede vyberieme v určenej šifrovanej abecede. Tento zašifrovaný znak potom zodpovedá znaku v texte, ktorý chceme zašifrovať. Takto prejdeme celý text.

A

  • A -> prvá v klasickej abecede, to zodpovedá prvému znaku v prvej šifrovanej abecede, teda znaku C
  • H -> ôsmy v klasickej abecede, to zodpovedá ôsmemu znaku v druhej š. abecede, teda E
  • O -> pätnástej v klasickej abecede, teda pätnásty znak v prvej š. abecede, znak H
  • J -> desiate v klasickej abecede, desiaty znak v druhej š. abecede, znak S
Algoritmus tejto šifry v C# .NET môže vyzerať nejako takto:

(Definujeme abecedy, prejdeme text po znakoch a do premennej šifra priradíme hodnotu z šifrovaných abecied)

string[] abeceda = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " " };
string[] p = { "C", "O", "Y", "Q", "G", "W", "M", "Z", "P", "B", "I", "T", "N", "J", "H", "K", "S", "D", "E", "F", "R", "U", "V", "L", "X", "A", " " };
string[] d = { "A", "X", "L", "V", "U", "R", "F", "E", "D", "S", "K", "H", "J", "N", "T", "I", "B", "P", "Z", "M", "W", "G", "Q", "Y", "O", "C", " " };

string sifra = "";

for (int i = 1; i <= text.Length; i++)
{
    string pismeno = text[i-1].ToString();

    if (i % 2 == 0)
        sifra += d[Array.IndexOf(abeceda, (pismeno.ToString()).ToUpper())];
    else
        sifra += p[Array.IndexOf(abeceda, (pismeno.ToString()).ToUpper())];
}

A pre dešifráciu:

string[] abeceda = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " " };
string[] p = { "C", "O", "Y", "Q", "G", "W", "M", "Z", "P", "B", "I", "T", "N", "J", "H", "K", "S", "D", "E", "F", "R", "U", "V", "L", "X", "A", " " };
string[] d = { "A", "X", "L", "V", "U", "R", "F", "E", "D", "S", "K", "H", "J", "N", "T", "I", "B", "P", "Z", "M", "W", "G", "Q", "Y", "O", "C", " " };
string puvodniText = "";

for (int i = 1; i <= sifra.Length; i++)
{
    string pismeno = sifra[i - 1].ToString();

    if (i % 2 == 0)
    {
        puvodniText += abeceda[Array.IndexOf(d, (pismeno.ToString()).ToUpper())];
    }
    else
    {
        puvodniText += abeceda[Array.IndexOf(p, (pismeno.ToString()).ToUpper())];
    }
}

V ďalšej lekcii, Ukážka jednoduchej šifrace textu Caesarovho šifra , si ukážeme Caesarovu šifru.


 

Aktivity