Szyfr Cezara


Tematy pokrewne
Łańcuchy znakowe
Podstawowe pojęcia dotyczące przetwarzania tekstów
Podstawowe operacje na łańcuchach znakowych
Naiwne wyszukiwanie wzorca w tekście
Wyszukiwanie maksymalnego prefikso-sufiksu
Szybkie wyszukiwanie wzorca algorytmem Morrisa-Pratta
Szybkie wyszukiwanie wzorca algorytmem Knutha-Morrisa-Pratta
Szybkie wyszukiwanie wzorca uproszczonym algorytmem Boyera-Moore'a
Szybkie wyszukiwanie wzorca pełnym algorytmem Boyera-Moore'a
Wyszukiwanie wzorca algorytmem Karpa-Rabina
Zliczanie słów w łańcuchu
Dzielenie łańcucha na słowa
Wyszukiwanie najdłuższego słowa w łańcuchu
Wyszukiwanie najdłuższego wspólnego podłańcucha
Wyszukiwanie najdłuższego wspólnego podciągu
Wyszukiwanie najkrótszego wspólnego nadłańcucha
Wyszukiwanie słów podwójnych
Wyszukiwanie palindromów
MasterMind – komputer kontra człowiek
MasterMind – człowiek kontra komputer
Szyfr Cezara
Szyfrowanie z pseudolosowym odstępem
Szyfry przestawieniowe
Szyfr Enigmy
Szyfrowanie RSA
Dodawanie dużych liczb
Mnożenie dużych liczb
Potęgowanie dużych liczb
Duże liczby Fibonacciego
Haszowanie
Liniowe generatory liczb pseudolosowych
Generowanie liczb pseudolosowych

 

Problem

Opracować algorytm szyfrujący i deszyfrujący dla szyfru Cezara

 

 

Szyfrowanie tekstów (ang. text encryption) ma na celu ukrycie ważnych informacji przed dostępem do nich osób niepowołanych. Historia kodów szyfrujących sięga czasów starożytnych. Już tysiące lat temu egipscy kapłani stosowali specjalny system hieroglifów do szyfrowania różnych tajnych wiadomości. Szyfr Cezara (ang. Ceasar's Code lub Ceasar's Cipher) jest bardzo prostym szyfrem podstawieniowym (ang. substitution cipher). Szyfry podstawieniowe polegają na zastępowaniu znaków tekstu jawnego (ang. plaintext) innymi znakami przez co zawarta w tekście informacja staje się nieczytelna dla osób niewtajemniczonych. Współcześnie szyfrowanie stanowi jedną z najważniejszych dziedzin informatyki – to dzięki niej stał się możliwy handel w Internecie, funkcjonują banki ze zdalnym dostępem do kont, powstał podpis elektroniczny oraz bezpieczne łącza transmisji danych. Przykładów zastosowania jest bez liku i dokładne omówienie tej dziedziny wiedzy leży daleko poza możliwościami tego artykułu.

Szyfr Cezara został nazwany na cześć rzymskiego imperatora Juliusza Cezara, który stosował ten sposób szyfrowania do przekazywania informacji o znaczeniu wojskowym. Szyfr polega na zastępowaniu liter alfabetu A...Z literami leżącymi o trzy pozycje dalej w alfabecie:

 

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

 

Ostatnie trzy znaki X, Y i Z nie posiadają następników w alfabecie przesuniętych o trzy pozycje. Dlatego umawiamy się, iż alfabet "zawija się" i za literką Z następuje znów litera A. Teraz bez problemu znajdziemy następniki X → A, Y → B i Z → C.

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.

 

Jeśli c jest kodem ASCII dużej litery alfabetu (rozważamy tylko teksty zbudowane z dużych liter), to szyfrowanie kodem Cezara polega na wykonaniu następującej operacji arytmetycznej:

 

c = 65 + (c - 62) mod 26

 

Deszyfrowanie polega na zamianie kodu wg wzoru:

 

c = 65 + (c - 42) mod 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  

 

Program

Ważne:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

 

Program odczytuje wiersz znaków. Zamienia litery małe na duże i szyfruje kodem Cezara wyświetlając wynik.

 

Lazarus
// Szyfrowanie Kodem Cezara
// Data: 18.08.2008
// (C)2012 mgr Jerzy Wałaszek
//-----------------------------

program prg;

var
  s : string;
  i : integer;

begin

// odczytujemy wiersz znaków

  readln(s);

// zamieniamy małe litery na duże

  s := upcase(s);

// tekst kodujemy szyfrem Cezara

  for i := 1 to length(s) do
    if s[i] in ['A'..'Z'] then s[i] := chr(65 + (ord(s[i]) - 62) mod 26); 

// wypisujemy zaszyfrowany tekst

  writeln(s);
  writeln;
end.
Code::Blocks
// Szyfrowanie Kodem Cezara
// Data: 18.08.2008
// (C)2012 mgr Jerzy Wałaszek
//-----------------------------

#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;
}
Free Basic
' Szyfrowanie Kodem Cezara
' Data: 18.08.2008
' (C)2012 mgr Jerzy Wałaszek
'-----------------------------

Dim As String s
Dim As Integer i

' odczytujemy wiersz znaków

Line Input s

' zamieniamy małe litery na duże

s = Ucase(s)

' tekst kodujemy szyfrem Cezara

For i = 1 To Len(s)
  If Mid(s,i,1) >= "A" And Mid(s,i,1) <= "Z" Then Mid(s,i,1) = Chr(65 + (Asc(Mid(s,i,1)) - 62) Mod 26)
Next

' wypisujemy zaszyfrowany tekst

Print s
Print
End
Wynik
nieprzyjaciel jest bardzo blisko
QLHSUCBMDFLHO MHVW EDUGCR EOLVNR

 

Szyfrowanie Szyfrem Cezara
(C)2012 mgr Jerzy Wałaszek


 

.

 

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  

 

Program

Ważne:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

 

Program odczytuje wiersz znaków zaszyfrowanych szyfrem Cezara, deszyfruje je i wypisuje tekst jawny.

 

Lazarus
// Deszyfrowanie Kodu Cezara
// Data: 18.08.2008
// (C)2012 mgr Jerzy Wałaszek
//-----------------------------

program prg;

var
  s : string;
  i : integer;

begin

// odczytujemy wiersz znaków

  readln(s);

// zamieniamy małe litery na duże

  s := upcase(s);

// rozszyfrowujemy

  for i := 1 to length(s) do
    if s[i] in ['A'..'Z'] then s[i] := chr(65 + (ord(s[i]) - 42) mod 26); 

// wypisujemy rozszyfrowany tekst

  writeln(s);
  writeln;
end.
Code::Blocks
// Deszyfrowanie Kodu Cezara
// Data: 18.08.2008
// (C)2012 mgr Jerzy Wałaszek
//-----------------------------

#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;
}
Free Basic
' Deszyfrowanie Kodu Cezara
' Data: 18.08.2008
' (C)2012 mgr Jerzy Wałaszek
'-----------------------------

Dim As String s
Dim As Integer i

' odczytujemy wiersz znaków

Line Input s

' zamieniamy małe litery na duże

s = Ucase(s)

' rozszyfrowujemy

For i = 1 To Len(s)
  If Mid(s,i,1) >= "A" And Mid(s,i,1) <= "Z" Then Mid(s,i,1) = Chr(65 + (Asc(Mid(s,i,1)) - 42) Mod 26)
Next

' wypisujemy rozszyfrowany tekst

Print s
Print
End
Wynik
QLHSUCBMDFLHO MHVW EDUGCR EOLVNR
NIEPRZYJACIEL JEST BARDZO BLISKO

 

Szyfrowanie Szyfrem Cezara
(C)2012 mgr Jerzy Wałaszek


 

.

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.