Algorytmy

Szyfr Cezara - implementacje i wyjaśnienie

cezare_historia

Szyfrowanie tekstu jest zabiegiem, który ma na celu uniemożliwić odczytanie tekstu przez osoby nieupoważnione do tego. Z założenia zaszyfrowaną wiadomość zdoła odczytać jedynie osoba, dla której wiadomość jest przeznaczona. Osoba, która oczywiście zna szyfr. Zapraszam do zapoznania się z pojęciem szyfru Cezara i implementacjami szyfru Cezara w C++, Javie oraz Pythonie.

Szyfr Cezara - metoda szyfrowania

Szyfr Cezara (znany również jako kod Cezara oraz przesunięcie cezariańskie) jak nie trudno się domyślić ma coś wspólnego z najbardziej znanym rzymskim wodzem. Wykorzystywał on bowiem ten szyfr do komunikacji z oddziałami wojskowymi.
Szyfr ten jest podręcznikowym przykładem szyfru podstawieniowego, czyli takiego, który dany znak zastępuje innym. W metodzie szyfrowania Cezara znakiem, którym zastępujemy daną literę jest trzeci następny znak w alfabecie łaciński. Występuje więc tak zwane przesunięcie. Stąd kolejna nazwa dla tego szyfru: szyfr przesuwający.

Szyfr Cezara C++

Oczywiście przesunięcie o 3 nie jest obowiązkowe. Przesuwać można o więcej liter, przy czym dla każdej litery przesunięcie powinno być o tyle samo znaków i w tym samym kierunku.
Szyfry podstawieniowe nie są obecnie używane w profesjonalnym szyfrowaniu. Są po prostu zbyt proste i na pewno nie stanowią problemu dla współczesnych hackerów. Niemniej jednak zadanie, wykorzystujące szyfr Cezara wystąpiło na maturze z informatyki w 2016 roku, więc chyba warto się z nim zapoznać.

Szyfr Cezara C++

Szyfr Cezara - implementacja

W tym programie szyfrowanie odbywa się na oryginale naszej zmiennej tekstowej, a klucz jaki obierzemy może być dowolną liczbą całkowitą. Dla zachowania poprawności wpisane małe litery są zamieniane na duże za pomocą funkcji transform.

C++

//Program wykonujący szyfrowanie metodą Cezara
//Łukasz Kosiński
#include <iostream>
#include <algorithm>//zawiera definicję funkcji transform

using namespace std;

void szyfruj(string &napis, int k)
{	if(k>26)k=k%26;//jeżeli klucz będzie większy od liczby liter w alfabecie to go ucinamy
	
	for(int i=0; i<napis.length(); i++)
	{	
		if(napis[i]==' ')continue;//działanie pętli dla spacji w naszym napisie pomijamy za pomocą continue
		napis[i]+=k;//wykonujemy przesunięcie o klucz
		if(napis[i]>'Z') napis[i]-=26;//jeżeli literka ucieknie nam poza 'Z' to odejmujemy 26
		
	}
	
	
}

int main()
{
	string napis;
	cout << "Wpisz informacje, ktora chcesz zaszyfrowac: ";
	getline (cin,napis);	
	transform(napis.begin(), napis.end(), napis.begin(), ::toupper);//dla ułatwienia wszystkie litery w napisie zmieniamy na duże
	int klucz;
	cout << "Podaj klucz, za pomoca ktorego bedziesz szyfrowac: ";
	cin >> klucz;
	
	szyfruj(napis, klucz);
	
	cout << napis << endl;	
	
	system("PAUSE");
	return 0;
}

Java

import java.util.Scanner;

public class Caesar_encryption {

	
	public static void main(String[] args) {
		System.out.println("Program szyfrujący tekst za pomocą Szyfru cezara");
		System.out.println("Podaj tekst do zaszyfrowania: ");
		Scanner scanner = new Scanner(System.in); // inicjalizacja skanera, który będzie pobierał wartości zmiennych
		String txt = scanner.nextLine().toUpperCase(); // pobieramy tekst od użytkownika, zamieniamy na duże litery
		System.out.println("Podaj klucz szyfrowania (ilość przesunięć): ");
		int n = scanner.nextInt(); // pobieramy liczbe przesuniec od uzytkownika
		String encrypted = ""; // tworzymy zmienna pomocniczą , która przechowa utworzony tekst
		for(int i =0; i < txt.length(); i++) { // iterujemy przez wprowadzony tekst
			char c = (char) (txt.charAt(i) + n); // pobieramy znak na iterowanej pozycji i przesuwamy o wybraną przez użytkownika ilość znaków
			if(c > 'Z') // jeżeli jednak wyjdziemy 'poza alfabet', to cofamy się o 26 znaków
				c -= 26;
			encrypted += c; // dopisujemy przesunięty znak do zmiennej
		}
		System.out.println("Twój tekst po szyfrowaniu cezara wygląda tak: " + encrypted); //drukujemy wynik
		scanner.close(); //zwalniamy zasoby
	}
	
}

Python

print("Program szyfrujący tekst za pomocą Szyfru cezara")
print("Podaj tekst do zaszyfrowania: ")
word = input().upper()
print("Podaj klucz szyfrowania (ilość przesunięć): ")
p = int(input())
encrypted = ""
for c in word:
    if c != "\n":
        ch = chr(ord(c) + p)
        if ord(ch) > ord('Z'):
            ch = chr(ord(ch)-26)
        encrypted += ch
print("Twój tekst po szyfrowaniu cezara wygląda tak: " + encrypted)

Jeżeli chcesz zgłębić temat kryptografii i poznać inne metody szyfrowania, zachęcam Cię do zapoznania się z tą książką:

Dyskusja archiwalna

Komentarze (4)

Komentarze pochodzą z poprzedniej wersji bloga i pozostają tylko do odczytu.

  1. ERMLAB

    Dobrze wyjaśnione ;) Nie jest to na pewno nic bardzo skomplikowanego, coś bardzo zaawansowanego, ale na pewno niejedna osoba trafi na ten artykuł, który rozwiąże wiele wątpliwości.

  2. Szyfrowanie 2 znakowe

    Szyfr podstawieniowy może być o wiele silniejszy jeżeli zastosujemy np. szyfrowanie 2 znakowe, czyli w standardowym alfabecie będzie to już 676 kombinacji. Jak na razie jednak nie udało mi się napisać w C++ poprawnie działający program szyfrujący i deszyfrujący w systemie 2 znakowym, a zwiedziłem już sporo stron traktujących w tym temacie.

  3. adam z działu (podhale)

    bardzo dźękuję za mega dobre wyjaźnienie szyfru cezara. zmotywofało mnje to do dalszej nałki ci plus plus.

  4. adam "big rol" rollo

    chlopy powiem wam ze ogolnie zajebiscie to wyglada