Strona główna » Algorytmy » Szyfry » Szyfr Stukany
 

Szyfr Stukany

Opis

Szyfr Stukany wymaga bardzo dużego skupienia, żeby odczytać wiadomość. Jest on bardzo dyskretny i wymaga jedynie wystukiwania zaszyfrowanej wiadomości. Należy jednak pamiętać, aby zachować równe tempo, ponieważ inaczej druga osoba może źle odszyfrować. Szyfrowanie polega na zamianie każdej litery na stuknięcia, które symbolicznie będą oznaczane przez kropkę. Do szyfrowania używa się następującej tabelki:

.12345
1ABC/KDE
2FGHIJ
3KLMNO
4PQRST
$5UWXYZ

W celu zaszyfrowania znaku należy sprawdzić w którym wierszu oraz kolumnie znajduje się dany znak. Tutaj należy uważać, bo znak C oraz K będą szyfrowane tak samo. Obydwie odczytane wartości zamieniamy na tyle stuknięć ile wynoszą. Pomiędzy wystukaniem wiersz i kolumny jak również następnego znaku należy zostawić trochę dłuższą przerwę. Koniec zdania sygnalizuje się wystukując literę X.

Przykład

Zaszyfrowanie litery Q na pozycji (4, 2) wymaga wystukania ".... ..", gdzie kropka oznacza stuknięcie, a spacja przerwę. Przykładowo, aby zaszyfrować słowa "test" należy wystukać ".... ..... . ..... .... .... .... .....". Jak można zauważyć szyfr ten wymaga dużo pracy dla nawet bardzo krótkich wiadomości, ale im więcej się ich używa tym szybciej i łatwiej się porozumieć.

Implementacja

Celem implementacji jest napisanie funkcji do szyfrowania oraz deszyfrowania tekstu zapisanego małymi literaim alfabetu łacińskiego. Zaszyfrowana oraz odszyfrowana wiadomość zostanie wypisana na standardowe wyjście.

Szyfrowanie

Funkcja szyfrująca szyfruj() przyjmuje jako argument tekst do zaszyfrowania. Oto jej przykładowy kod:

  1. static string szyfruj(string tekst) {
  2.   string wynik = "";
  3.   for (int i = 0; i < tekst.Length; i++) {
  4.     char c = tekst[i];
  5.     if (c >= 'a' && c <= 'z') {
  6.       if (c == 'k') {
  7.         c = 'c';
  8.       } else if (c > 'k') {
  9.         c--;
  10.       }
  11.       dopiszKropki(ref wynik, (c - 'a') / 5 + 1);
  12.       dopiszKropki(ref wynik, (c - 'a') % 5 + 1);
  13.     }
  14.   }
  15.   return wynik;
  16. }

Podczas szyfrowania dla każdego znaku szukamy jego pozycji w tabeli. Tutaj należy uważać na połączone litery C oraz K co skutkuje dalej, że wszystkie litery po K są przesunięte o jedną pozycję wcześniej. Na koniec każdej iteracji należy dopisać odpowiednią ilość kropek: najpierw tyle jaki ma numer wiersz, a potem, która to jest kolumna.

W celu dopisania kropek została zadeklarowana dodatkowa funkcja dopiszKropki(), która na końcu aktualnego wyniku dopisuje przekazaną ilość kropek.

  1. static void dopiszKropki(ref string dane, int ile) {
  2.   while (ile-- > 0) {
  3.     dane += '.';
  4.   }
  5.   dane += ' ';
  6. }

Deszyfrowanie

Zaszyfrowaną wiadomość można rozszyfrować przy pomocy funkcji odszyfruj(). Analogicznie jak w przypadku funkcji szyfrującej wystarczy podać tekst do rozszyfrowania. Oto przykładowy kod:

  1. static string odszyfruj(string tekst) {
  2.   string wynik = "";
  3.   int i = 0;
  4.   while (i < tekst.Length) {
  5.     int kolumna = 0, wiersz = 0;
  6.     while (tekst[i] == '.') {
  7.       wiersz++;
  8.       i++;
  9.     }
  10.     i++;
  11.     while (tekst[i] == '.') {
  12.       kolumna++;
  13.       i++;
  14.     }
  15.     char c = (char)('a' + (wiersz - 1) * 5 + (kolumna - 1));
  16.     if (c >= 'k') {
  17.       c++;
  18.     }
  19.     wynik += c;
  20.     while (i < tekst.Length && tekst[i] == ' ')
  21.       i++;
  22.   }
  23.   return wynik;
  24. }

Dopóki nie zostanie osiągnięty koniec tekstu w każdej iteracji po dwa razy zliczane są kolejne kropki, aż do wystąpienia spacji. Potem na podstawie odczytanej pozycji dopisywana jest odpowiednia litera. Należy zauważyć, że w odszyfrowanej wiadomości nigdy nie wystąpi litera K, ponieważ informacja ta została utracona i w miejsce tej litery będzie litera C.

Testowanie funkcji

W celu przetestowania napisanych funkcji można skorzystać z poniższego kodu. Wczytuje on tekst do zaszyfrowania, a następnie wypisuje zaszyfrowaną wiadomość, a potem ją deszyfruje.

  1. static void Main(string[] args) {
  2.   Console.WriteLine("Podaj tekst do zaszyfrowania:");
  3.   string tekst = Console.ReadLine();
  4.   string zaszyfrowany = szyfruj(tekst);
  5.   Console.WriteLine("Zaszyfrowany: " + zaszyfrowany);
  6.   Console.WriteLine("Odszyfrowany: " + odszyfruj(zaszyfrowany));
  7.   Console.ReadKey();
  8. }