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

Szyfr Condi

O szyfrze

Szyfr Condi to szyfr, który wykorzystuje przesunięcia do szyfrowania kolejnych liter. W celu zaszyfrowania trzeba jedynie podać przesunięcie pierwszego znaku. Każdy następny znak jest szyfrowany na podstawie poprzedniego. W celu zwiększenia bezpieczeństwa danych wykorzystywane jest słowo klucz, które ustala alfabet na podstawie określa się litery po przesunięciu. Podczas szyfrowania zachowywane są wszystkie znaki interpunkcyjne.

Przykład

Alfabet i słowo klucz

Pierwszy etap szyfrowania rozpoczyna się od ustalenia słowa klucza. Przyjmijmy, że taki słowem będzie wyraz "KLUCZ". Należy z niego wybrać wszystkie unikalne pierwsze wystąpienia liter, a następnie dopisać wszystkie litery alfabetu w kolejności alfabetycznej, które nie wystąpiły w słowie klucz. Na koniec należy ponumerować kolejne litery. Wynik tego etap został przedstawiony w tabeli.

1234567891011121314151617181920212223242526
KLUCZABDEFGHIJMNOPQRSTVWXY

Najprotszym sprawdzeniem czy alfabet jest poprawny jest porównanie długości alfabetu powstałego z wybranym np. łacińskim oraz sprawdzenie czy żadna litera się nie powtarza.

Szyfrowanie

Każda kolejna litera jest szyfrowana poprzez przesunięcie jej o tyle pozycji jaką pozycje ma poprzednia litera w szyfrowanym tekście. Jednak pierwsza litera nie ma nic przed sobą, więc potrzebne jest wstępne przesunięcie. Przyjmijmy, że początkowe przesunięcie ma wartość 7. Wtedy kolejne litery są szyfrowane następująco:

PrzesunięcieLiteraPozycjaNowa Litera
7T22U
22A6L
6J14R
14N16C
16A6T
6---
6I13Q
13N16U
16F10Y
10O17K
17R20G
20M15E
15A6S
6C4F
4J14P
14A6R

Ostatecznie szyfrogram to: "ULRCT QUYKGESFPR".

Deszyfrowanie

Rozszyfrowywanie danych należy tak jak szyfrowanie przeprowadzić od lewej do prawej. W celu rozszyfrowania pierwszej litery należy przesunąć ją o ustalone przesunięcie w lewo. Dopiero pozycja odszyfrowanej litery może posłużyć do odszyfrowania kolejnej litery.

Implementacja

Przedstawiona przykładowa implementacja pozwala na zaszyfrowanie jedynie wielkich liter. Wszystkie pozostałe znaki są traktowane jako interpunkcyjne i są przepisywane na tą samą pozycję w wyniku w której są zapisane w szyfrowanym tekście bez zmian. Program zakłada poprawność danych wejściowych.

Tworzenie alfabetu

Funkcja utworzAlfabet() przyjmuje tylko jeden argument: slowoKluczowe - jest to słowo kluczowe. Zwracanym wynikiem jest alfabet potrzebny do szyfrowania. Dokładane litery są tutaj pobierane z alfabetu łacińskiego.

C++
C#
  1. static string utworzAlfabet(string slowoKluczowe) {
  2.   string alfabet = "";
  3.   for (int i = 0; i < slowoKluczowe.Length; i++) {
  4.     if (alfabet.IndexOf(slowoKluczowe[i]) == -1)
  5.       alfabet += slowoKluczowe[i];
  6.   }
  7.   for (int i = 'A'; i <= 'Z'; i++) {
  8.     if (alfabet.IndexOf((char)(i)) == -1)
  9.       alfabet += (char)(i);
  10.   }
  11.   return alfabet;
  12. }

Szyfrowanie

Przedstawiona funkcja szyfrująca szyfruj() przyjmuje trzy argumenty: tekst - tekst do zaszyfrowania, klucz - słowo klucz na podstawie którego będzie ustalony alfabet oraz przes - liczba oznaczająca przesunięcie pierwszego znaku. Wynikiem działania funkcji jest szyfrogram.

C++
C#
  1. static string szyfruj(string tekst, string klucz, int przes) {
  2.   string alfabet = utworzAlfabet(klucz);
  3.   string wynik = "";
  4.   for (int i = 0; i < tekst.Length; i++) {
  5.     char c = tekst[i];
  6.     if (c >= 'A' && c <= 'Z') {
  7.       int pos = alfabet.IndexOf(c);
  8.       wynik += alfabet[(pos + przes) % 26];
  9.       przes = pos + 1;
  10.     } else {
  11.       wynik += c;
  12.     }
  13.   }
  14.   return wynik;
  15. }

Deszyfrowanie

Poniższa funkcja deszyfrująca rozszyfruj() przyjmuje trzy argumenty: tekst - szyfrogram do rozszyfrowania, klucz - słowo klucz na podstawie którego będzie ustalony alfabet oraz przes - liczba oznaczająca przesunięcie pierwszego znaku. Wynikiem działania funkcji jest szyfrogram.

C++
C#
  1. static string rozszyfruj(string tekst, string klucz, int przes) {
  2.   string alfabet = utworzAlfabet(klucz);
  3.   string wynik = "";
  4.   for (int i = 0; i < tekst.Length; i++) {
  5.     char c = tekst[i];
  6.     if (c >= 'A' && c <= 'Z') {
  7.       int pos = alfabet.IndexOf(c);
  8.       wynik += alfabet[(pos - przes + 26) % 26];
  9.       przes = alfabet.IndexOf(wynik[i]) + 1;
  10.     } else {
  11.       wynik += c;
  12.     }
  13.   }
  14.   return wynik;
  15. }

Testowanie funkcji

Działanie funkcji można przetestować przy pomocy poniższego fragmentu kodu:

C++
C#
  1. static void Main(string[] args) {
  2.   Console.WriteLine("Podaj słowo kluczowe:");
  3.   string klucz = Console.ReadLine();
  4.   Console.WriteLine("Podaj tekst do zaszyfrowania:");
  5.   string tekst = Console.ReadLine();
  6.   Console.WriteLine("Podaj przesunięcie początkowe:");
  7.   int przes = Convert.ToInt32(Console.ReadLine());
  8.   string szyfrogram = szyfruj(tekst, klucz, przes);
  9.   Console.WriteLine("Szyfrogram to:");
  10.   Console.WriteLine(szyfrogram);
  11.   string tekstjawny = rozszyfruj(szyfrogram, klucz, przes);
  12.   Console.WriteLine("Tekst Jawny to:");
  13.   Console.WriteLine(tekstjawny);
  14.   Console.ReadKey();
  15. }

Zadania

Zadanie 1

W przypadku szyfru Condi każdy następny znak jest szyfrowany na podstawie poprzedniego. Uogólnijmy to do przypadku szyfrowania, gdzie n-ty znak będzie szyfrowany na podstawie znaku na pozycji n - k. Pierwsze k znaków powinno zostać zaszyfrowane przez przesunięcie podane na początku. Napisz funkcje i sprawdź ich działanie.

Przykład

Szyfrują wyrażenie "TAJNA INFORMACJA" przy pomocy słowa klucz "KLUCZ", przesunięcia 7 na podstawie wyrazu o k = 3 pozycji wcześniej otrzymamy szyfrogram:

  1. UISVL QANOBZNSDS