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

Szyfr Beaufort

Szyfr

Szyfr Beaufort jest to szyfr podstawieniowy, który częściowo przypomina szyfrowanie Vigenère. Różnica tkwi jednak w sposobie wyboru znaku do szyfrogramu na podstawie znaku tekstu oraz znaku klucza.

Algorytm

Szyfr Beauforta przyjmuje dwie dane: jedną z nich jest klucz, który będzie użyty do szyfrowania oraz tekst czyli informacje, które będziemy szyfrować. Podobnie jak w przypadku szyfr Vigenère do szyfrowania należy posłużyć się następującą tabelką:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
AABCDEFGHIJKLMNOPQRSTUVWXYZ
BBCDEFGHIJKLMNOPQRSTUVWXYZA
CCDEFGHIJKLMNOPQRSTUVWXYZAB
DDEFGHIJKLMNOPQRSTUVWXYZABC
EEFGHIJKLMNOPQRSTUVWXYZABCD
FFGHIJKLMNOPQRSTUVWXYZABCDE
GGHIJKLMNOPQRSTUVWXYZABCDEF
HHIJKLMNOPQRSTUVWXYZABCDEFG
IIJKLMNOPQRSTUVWXYZABCDEFGH
JJKLMNOPQRSTUVWXYZABCDEFGHI
KKLMNOPQRSTUVWXYZABCDEFGHIJ
LLMNOPQRSTUVWXYZABCDEFGHIJK
MMNOPQRSTUVWXYZABCDEFGHIJKL
NNOPQRSTUVWXYZABCDEFGHIJKLM
OOPQRSTUVWXYZABCDEFGHIJKLMN
PPQRSTUVWXYZABCDEFGHIJKLMNO
QQRSTUVWXYZABCDEFGHIJKLMNOP
RRSTUVWXYZABCDEFGHIJKLMNOPQ
SSTUVWXYZABCDEFGHIJKLMNOPQR
TTUVWXYZABCDEFGHIJKLMNOPQRS
UUVWXYZABCDEFGHIJKLMNOPQRST
VVWXYZABCDEFGHIJKLMNOPQRSTU
WWXYZABCDEFGHIJKLMNOPQRSTUV
XXYZABCDEFGHIJKLMNOPQRSTUVW
YYZABCDEFGHIJKLMNOPQRSTUVWX
ZZABCDEFGHIJKLMNOPQRSTUVWXY

Jednak w tym szyfrze najpierw szukamy kolumny o nagłówku, którym jest kolejna litera z klucza (te litery wybieramy cyklicznie), a potem szukamy w tej kolumnie szyfrowany znak. Znak ten zostanie zastąpiony przez znak, który znajdzie się w tym samym wierszu co pozycja znalezionego znaku. Takie szyfrowanie jest powtarzane dla każdego znaku.

W celu odszyfrowania danych to wystarczy je ponownie zaszyfrować przy pomocy tego samego klucza, ale podając za tekst jawny szyfrogram do rozszyfrowania.

Przykład

Spróbujmy teraz zaszyfrować wyrażenie "TAJNAINFORMACJA" przy pomocy klucza "HASLO". Kolejne litery będą szyfrowane następująco:

TekstTAJNAINFORMACJA
KluczHASLOHASLOHASLO
SzyfrogramOAJYOZNNXXVAQCO

Ostatecznie szyfrogram to "OAJYOZNNXXVAQCO".

Implementacja

Ze względu na fakt, że do zaszyfrowani i rozszyfrowania jest potrzebny ten sam algorytm to zostanie napisana tylko jedna funkcja zmien(), która będzie przyjmować dwa argumenty. Jednym z nich będzie tekst - dane do za- lub rozszyfrowania oraz klucz - wyrażenie zmieniające podany tekst.

C++
C#
  1. string zmien(string tekst, string klucz) {
  2.   string w = "";
  3.   for (int i = 0; i < tekst.length(); i++) {
  4.     int przes = (klucz[i % klucz.length()] - 'A');
  5.     int znak = (tekst[i] - 'A');
  6.     w += ((char)('A' + (-znak + 26 + przes) % 26));
  7.   }
  8.   return w;
  9. }

Na początek (2.) deklarujemy zmienną w do której będą dopisywane kolejne zaszyfrowane znaki. Potem (3.) dla każdego znaku: (4.) wyliczana jest kolumna oraz (5.) pozycję szukanego elementu w kolumnie w alfabecie. Następnie (6.) przy pomocy wzoru wyliczamy zaszyfrowany znak. Na koniec (8.) zwracamy wynik w.

Testowanie funkcji

Poniższy fragment kodu wczyta od użytkownika klucz, a potem tekst jawny, a potem wyświetli na ekran szyfrogram.

C++
C#
  1. int main () {
  2.   string klucz, tekst;
  3.   cout << "Podaj klucz:\n klucz = ";
  4.   cin >> klucz;
  5.   cin.ignore();
  6.   cout << "Podaj tekst:\n";
  7.   getline(cin, tekst);
  8.   string szyfrogram = zmien(tekst, klucz);
  9.   cout << "\nSzyfrogram:\n" << szyfrogram;
  10.   string tekstjawny = zmien(szyfrogram, klucz);
  11.   cout << "\nTekst jawny:\n" << tekstjawny;
  12.   system("pause");
  13.   return 0;
  14. }

Zadania

Zadanie 1

Napisz funkcje zmien(), który będzie implementował funkcjonalność szyfru Beaufort. Tym razem użytkownik ma dostać więcej swobody i tekst nie będzie składać się jedynie z wielkich liter. Program ma pomijać wszystkie znaki nie będące wielkimi literami, ale pominięcie znaku nie oznacza pominięcie klucza. Tekst ma dalej być zaszyfrowany jakby się składał tylko z wielkich liter.

Napisz funkcje zmien(), który będzie implementował funkcjonalność szyfru Beaufort. Tym razem użytkownik ma dostać więcej swobody i tekst nie będzie składać się jedynie z wielkich liter. Program ma pomijać wszystkie znaki nie będące wielkimi literami, ale pominięcie znaku nie oznacza pominięcie klucza. Tekst ma dalej być zaszyfrowany jakby się składał tylko z wielkich liter.

Przykładowo szyfrując wyrażenie "TAJNA INFORMACJA." otrzymamy:

  1. OAJYO ZNNXXVAQCO.