Moja strona główna

.::Szyfr Cezara::.

Szyfr Cezara (zwany też szyfrem przesuwającym, kodem Cezara lub przesunięciem Cezariańskim) – w kryptografii jedna z najprostszych technik szyfrowania. Jest to rodzaj szyfru podstawieniowego, w którym każda litera tekstu jawnego (niezaszyfrowanego) zastępowana jest inną, oddaloną od niej o stałą liczbę pozycji w alfabecie, literą (szyfr monoalfabetyczny), przy czym kierunek zamiany musi być zachowany. Nie rozróżnia się przy tym liter dużych i małych. Nazwa szyfru pochodzi od Juliusza Cezara, który prawdopodobnie używał tej techniki do komunikacji ze swymi przyjaciółmi.


Szyfr Cezara zastępuje każdą literę tekstu jawnego inną, przesuniętą względem litery kodowanej o stałą liczbę pozycji w alfabecie. Na rysunku szyfr z przesunięciem równym 3, tak więc B w tekście jawnym jest podmieniane w szyfrogramie na E (rozpatrywany jest alfabet łaciński).

Przykład:

Zaszyfrować zdanie: NIEPRZYJACIEL JEST BARDZO BLISKO.

Poszczególne literki tekstu jawnego zastępujemy literkami szyfru Cezara zgodnie z powyższą tabelką kodu. Spacje oraz inne znaki nie będące literami pozostawiamy bez zmian:

 

NIEPRZYJACIEL JEST BARDZO BLISKO
QLHSUCBMDFLHO MHVW EDUGCR EOLVNR



 

Deszyfrowanie tekstu zaszyfrowanego kodem Cezara polega na wykonywaniu operacji odwrotnych. Każdą literę kodu zamieniamy na literę leżącą o trzy pozycje wcześniej w alfabecie.

 

Szyfr Cezara 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
Tekst jawny X Y Z A B C D E F G H I J K L M N O P Q R S T U V W

 

Podobnie jak poprzednio trzy pierwsze znaki szyfru Cezara nie posiadają bezpośrednich odpowiedników liter leżących o trzy pozycje wcześniej, ponieważ alfabet rozpoczyna się dopiera od pozycji literki D. Rozwiązaniem jest ponowne "zawinięcie" alfabetu tak, aby przed literą A znalazły się trzy ostatnie literki X, Y i Z.

 

Do wyznaczania kodu literek przy szyfrowaniu i deszyfrowaniu posłużymy się operacjami modulo. Operacja modulo jest resztą z dzielenia danej liczby przez moduł. Wynik jest zawsze mniejszy od modułu. U nas moduł będzie równy 26, ponieważ tyle mamy liter alfabetu.
 

Ujęcie matematyczne:

Operację szyfrowania i deszyfrowania można wyrazić w języku arytmetyki modularnej. W tym celu wystarczy każdej literze alfabetu jednoznacznie przypisać jej numer według schematu A↔0, Ą↔1, B↔2, …, Ż↔31. Wygodnie jest też przyjąć, że klucz n jest pewną liczbą z zakresu 0...31 (jest to numer zaszyfrowanej litery A).

Szyfrowanie można wtedy zdefiniować za pomocą kongruencji:

E_n(x) \equiv x + n \pmod {32},

gdzie x jest numerem litery tekstu jawnego w alfabecie, E_n(x) – numerem litery szyfrogramu w alfabecie.

Podobnie deszyfrowanie tekstu można zapisać jako:

D_n(y) \equiv y - n \pmod {32}

gdzie y jest numerem litery szyfrogramu w alfabecie, D_n(y) – numerem litery tekstu jawnego w alfabecie.

Na podstawie własności kongruencji i tego, że E_n(x), D_n(y) są z przedziału 0...31:

  • jeśli przy wyznaczaniu E_n(x) wartość wyrażenia x + n przekroczy 32 – 1, to należy ją zmniejszyć o 32.
  • jeśli przy wyznaczaniu D_n(x) wartość wyrażenia y - n będzie ujemna, to należy ją zwiększyć o 32.

Operacje E_n(x), D_n(y) są do siebie odwrotne, bowiem przesuwanie w prawo o k jest zarazem przesuwaniem w lewo o 32-k.

Liczba 32 powyżej jest liczbą liter w alfabecie polskim. Dla alfabetu łacińskiego należy przyjąć liczbę 26



Algorytm szyfrowania tekstu kodem Cezara:

Wejście
Łańcuch tekstowy s
Wyjście:

Łańcuch tekstowy s zaszyfrowany kodem Cezara

Elementy pomocnicze:
i  –  indeks, i N
kod(x)  – zwraca kod litery x
znak(x)  – zamienia kod x na odpowiadający mu znak ASCII
Lista kroków:
K01: Dla i = 0,1,...,|s| - 1 wykonuj K02...K03 ; przeglądamy kolejne znaki tekstu
K02:     Jeśli s[i] < "A" ∨ s[i] > "Z", to następny obieg pętli K01 ; pomijamy znaki nie będące literami A...Z
K03:     s[i] ← znak(65 + (kod(s[i]) - 62) mod 26) ; szyfrujemy szyfrem Cezara
K04: Pisz s  
K05: Zakończ


Przykład kodu w C++:


#include <iostream>
#include <string>

using namespace std;

int main()
{
  string s;
  int i;

// odczytujemy wiersz znaków

  getline(cin,s);

// zamieniamy małe litery na duże
// i kodujemy szyfrem cezara

  for(i = 0; i < s.length(); i++)
  {
    s[i] = toupper(s[i]);
    if((s[i] >= 'A') && (s[i] <= 'Z')) s[i] = char(65 + (s[i] - 62) % 26);
  }

// wypisujemy zaszyfrowany tekst

  cout << s << endl << endl;
  return 0;






Algorytm deszyfrowania tekstu zaszyfrowanego kodem Cezara:
Wejście:

Łańcuch tekstowy s zaszyfrowany kodem Cezara

Wyjście:

Tekst jawny

Elementy pomocnicze:
i  –  indeks, i N
kod(x)  – zwraca kod litery x
znak(x)  – zamienia kod x na odpowiadający mu znak ASCII
Lista kroków:
K01: Dla i = 0,1,...,|s| - 1 wykonuj K02...K03 ;przetwarzamy kolejne znaki tekstu
K02:     Jeśli s[i] < "A" ∨ s[i] > "Z", to następny obieg pętli K01 ; pomijamy znaki nie będące literami A...Z
K03:     s[i] ← znak(65 + (kod(s[i] - 42) mod 26) ; deszyfrujemy
K04: Pisz s  
K05: Zakończ


Przykład kodu w C++:
#include <iostream>
#include <string>

using namespace std;

int main()
{
  string s;
  int i;

// odczytujemy wiersz znaków

  getline(cin,s);

// zamieniamy małe litery na duże
// i rozszyfrowujemy

  for(i = 0; i < s.length(); i++)
  {
    s[i] = toupper(s[i]);
    if((s[i] >= 'A') && (s[i] <= 'Z')) s[i] = char(65 + (s[i] - 42) % 26);
  }

// wypisujemy rozszyfrowany tekst

  cout << s << endl << endl;
  return 0;
ASCII ilosc liteA

 


Ta strona internetowa została utworzona bezpłatnie pod adresem Stronygratis.pl. Czy chcesz też mieć własną stronę internetową?
Darmowa rejestracja