Ukázka jednoduché šifrace textu Albertiho šifra

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

Princip Albertiho šifry spočívá v šifrování textu pomocí 2 šifrovaných abeced. Tedy liché pozice znaků se zašifrují pomocí první abecedy a sudé pozice znaků pomocí druhé abecedy. Šifrované abecedy můžou být samozřejmě libovolné. Šifru si můžeme předvést na slově "ahoj".

Vytvoříme si klasickou abecedu:

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

K tomu první šifrovanou abecedu:

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

Plus ještě druhou šifrovanou abecedu:

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

Slovo "ahoj" si rozdělíme na jednotlivé znaky a ty na liché a sudé:

A H O J

  • A - liché - první abeceda
  • H - sudé - druhá abeceda
  • O - liché - první abeceda
  • J - sudé - druhá abeceda

Nyní projdeme znak po znaku a podle liché či sudé pozice určíme, kterou šifrovanou abecedu na znak použijeme. Znak vyhledáme v klasické abecedě a n-tou pozici v této abecedě vybereme v určené šifrované abecedě. Tento zašifrovaný znak pak odpovídá znaku v textu, jež chceme zašifrovat. Takhle projdeme celý text.

A H O J

  • A -> první v klasické abecedě, to odpovídá prvnímu znaku v první šifrované abecedě, tedy znaku C
  • H -> osmé v klasické abecedě, to odpovídá osmému znaku ve druhé š. abecedě, tedy E
  • O -> patnácté v klasické abecedě, tedy patnáctý znak v první š. abecedě, znak H
  • J -> desáté v klasické abecedě, desátý znak ve druhé š. abecedě, znak S

Algoritmus této šifry v C# .NET může vypadat nějak takhle:

(Definujeme abecedy, projdeme text po znacích a do proměnné šifra přiřadíme hodnotu z šifrovaných abeced)

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 pro dešifraci:

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