Strona główna » Algorytmy » Artykuły » XOR i szyfrowanie
 

XOR i szyfrowanie

Wstęp

Często chcemy zaszyfrować na szybko dokument, ale nie mam pod ręką akurat żadnego programu. Czasem nie potrzebujemy używać RSA lub SHA-512. Wtedy można użyć funkcji XOR, która umożliwia szybką implementację "szyfrowania".

Uwaga: Choć na zwykłej kartce papieru złamanie tego szyfru może zająć trochę czasu nie oznacza, że jest silny. Jego zabezpieczenia są porównywalna do klasycznych szyfrów polialfabetycznych. Algorytm ten nie powinien być używany do szyfrowania wrażliwych dokumentów.

Implementacja

Szyfrowanie i deszyfrowanie

Szyfrowanie przy pomocy funkcji XOR polega na szyfrowaniu i-tego znaku tekstu przy pomocy i-tego znaku hasła. W przypadku, gdy hasło jest krótsze niż szyfrowany tekst to dopisuje się do hasła hasło tak długo, aż jego długość jest niemniejsza niż tekstu.

Jeśli użyć funkcji XOR na dowolnych dwóch znakach, których reprezentatami będą wartości z tablicy ASCII to szybko okaże się, że na konsolę zostaną wypisaną dziwne znaczki. Z tego powodu poniższa implementacja ogranicza się jedynie do 32 znaków po literze 'A' zgodnie z tablicą ASCII.

C++
C#
  1. string zaszyfruj(string tekst, string klucz) {
  2.   for (int i = 0; i < tekst.size(); i++) {
  3.     int znakTekst = tekst[i] - 'A';
  4.     int znakKlucz = klucz[i % klucz.length()] - 'A';
  5.     tekst[i] = (char)((znakTekst ^ znakKlucz) + 'A');
  6.   }
  7.   return tekst;
  8. }

Algorytm jest bardzo prosty. Iteracyjnie każdą literkę szyfrujemy przy użyciu kolejnego znaku z hasła. Funkcja modulo dba, aby po przekroczeniu długości hasła, program zaczął pobierać hasło od początku, aż do zakończenia iteracji.

Zaletą tego rozwiązania jest bardzo szybka i prosta implementacja. Warto zauważyć, że zaszyfrowany tekst możemy odszyfrować przy pomocy ponownego szyfrowania.

Testowanie programu

Poniższy fragment kodu wczytuje od użytkownika tekst do zaszyfrowania oraz klucz, a następnie wypisuje na ekran szyfrogram i deszyfruje go.

C++
C#
  1. int main() {
  2.   string tekst, klucz;
  3.   cout << "Podaj klucz:\n";
  4.   cin >> klucz;
  5.   cout << "Podaj tekst jawny:\n";
  6.   cin >> tekst;
  7.   cout << "Szyfrogram to:\n";
  8.   cout << zaszyfruj(tekst, klucz);
  9.   cout << "Po rozszyfrowaniu:\n";
  10.   cout << zaszyfruj(zaszyfruj(tekst, klucz), klucz);
  11.   system("pause");
  12.   return 0;
  13. }