Ukážka jednoduché šifrace texte Albertiho šifra
Princíp Albertiho šifry spočíva v šifrovanie textu pomocou 2 šifrovaných abecied. Teda nepárne pozície znakov sa zašifrujú pomocou prvý abecedy a párne 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:
ABCDEFGHIJKLMNOPQRSTU VWXYZ
K tomu prvej šifrovanú abecedu:
COYQGWMZPBITNJHKSDEFR UVLX A
Plus ešte druhú šifrovanú abecedu:
AXLVURFEDSKHJNTIBPZMW GQYO C
Slovo "ahoj" si rozdelíme na jednotlivé znaky a tie na párne a nepá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 či 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 -> prvý v klasickej abecede, to zodpovedá prvému znaku v prvej šifrovanej abecede, teda znaku C- H -> ôsmej 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 -> desiatej 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š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())]; } }
A