Lekce 2 - Ukázka jednoduché šifrace textu Albertiho šifra
V minulé lekci, Úvod do šifrování a blokové šifry, jsme si uvedli pojem blokové šifry a způsob, jak tuto konstrukci využít pro ochranu tajemství malého rozsahu.
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())]; } }
V další lekci, Ukázka jednoduché šifrace textu Caesarova šifra, si ukážeme Caesarovou šifru.