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.
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 – 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++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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ą:
Szyfrowanie 2 znakowe
says: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.
ERMLAB
says: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.