Szyfr Cezara
Szyfr Cezara (szyfr przesuwający) jest jednym z najstarszych znanych szyfrów. Jest on zbudowany na zasadzie szyfru podstawieniowego gdzie każda litera, tekstu niezaszyfrowanego zastępowana jest oddaloną od niej o stałą liczbę pozycji w alfabecie inną literą. W szyfrze Cezara nie rozróżnia się dużych i małych liter.
Obecnie Szyfr Cezara nie gwarantuje żadnego bezpieczeństwa.
Zasada działania Szyfru Cezara jest bardzo prosta:
Każdą literę tekstu niezaszyfrowanego zastępujemy inną przesuniętą względem litery kodowanej o stałą liczbę pozycji w alfabecie. Na przykład dla litery „a” (kod ASCII 97) przy przesunięciu o 2, literą kodowaną będzie „c” (kod ASCII 99) itd.
Przeanalizujmy prosty program szyfrujący szyfrem Cezara. Aplikacja została napisana w języku C#:
using System; class Program { public static void Main() { Console.WriteLine("Proszę wciskać dowolne klawisze."); ConsoleKeyInfo keyInfo; do { keyInfo = Console.ReadKey(true); if (keyInfo.KeyChar >= 97 && keyInfo.KeyChar <= 122) { char znak = (char)(((keyInfo.KeyChar - 95) % 27) + 97); Console.WriteLine(znak); } } while (keyInfo.Key != ConsoleKey.Escape); } }
Głównym elementem programu, który odpowiedzialny jest za szyfrowanie jest ten fragment:
char znak = (char)(((keyInfo.KeyChar - 95) % 27) + 97);
Działa on w następujący sposób:
- Najpierw pobieramy kod ASCII wprowadzonego znaku ( keyInfo.KeyChar ),
- Następnie odejmujemy liczbę 95 od numery ASCII podanej litery (kiedy podstawimy numer ASCII pierwszej litery alfabetu czyli „a” i odejmiemy od niego 95 (czyli 97 – 95), otrzymamy stałą liczbę miejsc w alfabecie o jaką będziemy przesuwać litery),
- Potem wykonujemy dzielenie modulo przez 27 (jest to wynik działania: 122 – 95, numer 122 to kod ostatniej litery alfabetu, a 95 to wcześniej zadeklarowana liczba),
- Na końcu dodajemy cyfrę 97 czyli numer ASCII pierwszego znaku.
Dzięki tak przygotowanemu algorytmowi każda litera zostanie odpowiednio zakodowana.
Szyfr Cezara w C++:
#include <iostream> #include <stdio.h> #include <cstdlib> using namespace std; void szyfrowanie(char tab[]) { int dlugosc = strlen(tab); for(int i=0;i<dlugosc;i++) tab[i] = ((tab[i] - 95) % 27) + 97; } int main() { int dlugosc; cout << "Podaj dlugosc tekstu:\n"; cin >> dlugosc; char tab[dlugosc]; cout << "Podaj tekst (maksymalna dlugosc tekstu: " << dlugosc << "):\n"; scanf("%s", &tab); szyfrowanie(tab); cout << "Po zaszyfrowaniu:\n"; for(int i = 0;i<dlugosc;i++) cout << tab[i]; return 0; }