Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2020 mgr Jerzy Wałaszek
I LO w Tarnowie

Szyfr Cezara

SPIS TREŚCI
Tematy pomocnicze

Problem

Należy opracować algorytm szyfrujący i deszyfrujący dla szyfru Cezara

Rozwiązanie

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

Zmienne 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 kroki 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ładowe programy

Uwaga:

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.
Pascal
// Szyfrowanie Kodem Cezara
// Data: 18.08.2008
// (C)2020 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.
C++
// Szyfrowanie Kodem Cezara
// Data: 18.08.2008
// (C)2020 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;
}
Basic
' Szyfrowanie Kodem Cezara
' Data: 18.08.2008
' (C)2020 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)2020 mgr Jerzy Wałaszek

 

.

Algorytm deszyfrowania tekstu zaszyfrowanego kodem Cezara

Wejście:

Łańcuch tekstowy s  zaszyfrowany kodem Cezara

Wyjście:

Tekst jawny

Zmienne 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 kroki 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ładowe programy

Uwaga:

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.
Pascal
// Deszyfrowanie Kodu Cezara
// Data: 18.08.2008
// (C)2020 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.
C++
// Deszyfrowanie Kodu Cezara
// Data: 18.08.2008
// (C)2020 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;
}
Basic
' Deszyfrowanie Kodu Cezara
' Data: 18.08.2008
' (C)2020 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)2020 mgr Jerzy Wałaszek


 

.

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2020 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.