Szyfr Cezara w Javie - Prosta Implementacja

advertisement

Szyfr Cezara w Javie to jedna z najczęściej implementowanych technik szyfrowania dla początkujących programistów. W tym artykule pokażemy, jak krok po kroku zaimplementować go w języku Java - zarówno funkcję szyfrującą, jak i deszyfrującą. Jeśli chcesz najpierw poznać ogólne zasady działania tego szyfru, sprawdź nasz Przewodnik po Szyfrze Cezara.

Implementacja w Javie

Poniżej przedstawiam prosty kod w Javie, który pozwala na szyfrowanie i deszyfrowanie tekstu za pomocą szyfru Cezara. Domyślnie używamy przesunięcia o 3 pozycje (klasyczny szyfr Cezara), ale kod pozwala na ustawienie dowolnej wartości przesunięcia.


public class SzyfrCezara {

    // Metoda szyfrująca tekst
    public static String szyfruj(String tekst, int przesuniecie) {
        StringBuilder zaszyfrowanyTekst = new StringBuilder();

        for (int i = 0; i < tekst.length(); i++) {
            char znak = tekst.charAt(i);

            // Szyfrujemy tylko litery
            if (Character.isLetter(znak)) {
                // Sprawdzamy czy to mała czy wielka litera
                char baza = Character.isUpperCase(znak) ? 'A' : 'a';

                // Wykonujemy przesunięcie i operację modulo, aby zostać w zakresie alfabetu
                char zaszyfrowany = (char) (((znak - baza + przesuniecie) % 26) + baza);
                zaszyfrowanyTekst.append(zaszyfrowany);
            } else {
                // Znaki niebędące literami pozostawiamy bez zmian
                zaszyfrowanyTekst.append(znak);
            }
        }

        return zaszyfrowanyTekst.toString();
    }

    // Metoda deszyfrująca tekst
    public static String deszyfruj(String zaszyfrowanyTekst, int przesuniecie) {
        // Deszyfrowanie to szyfrowanie z przesunięciem w przeciwnym kierunku
        return szyfruj(zaszyfrowanyTekst, 26 - (przesuniecie % 26));
    }

    public static void main(String[] args) {
        String tekst = "Witaj Świecie!";
        int przesuniecie = 3;

        String zaszyfrowanyTekst = szyfruj(tekst, przesuniecie);
        System.out.println("Tekst oryginalny: " + tekst);
        System.out.println("Tekst zaszyfrowany: " + zaszyfrowanyTekst);

        String odszyfrowany = deszyfruj(zaszyfrowanyTekst, przesuniecie);
        System.out.println("Tekst odszyfrowany: " + odszyfrowany);
    }
}

Jak to działa?

Nasz kod składa się z trzech głównych części:

  • Metoda szyfrująca - przyjmuje tekst i wartość przesunięcia, a następnie zmienia każdą literę na inną, przesuniętą o określoną liczbę pozycji w alfabecie.
  • Metoda deszyfrująca - działa na tej samej zasadzie co szyfrująca, ale z przesunięciem w przeciwnym kierunku.
  • Metoda main - demonstrująca użycie powyższych metod na przykładowym tekście.

Ważne elementy implementacji:

  • Kod obsługuje zarówno małe, jak i wielkie litery
  • Znaki specjalne, spacje i cyfry pozostają niezmienione
  • Użyliśmy operacji modulo (%), aby zapewnić "zapętlenie" alfabetu
  • Deszyfrowanie to po prostu szyfrowanie z przesunięciem w przeciwną stronę

Przykład użycia

Załóżmy, że chcemy zaszyfrować wiadomość "Programowanie w Javie jest super!" z przesunięciem o 5 pozycji:


String wiadomosc = "Programowanie w Javie jest super!";
int klucz = 5;

String zaszyfrowana = SzyfrCezara.szyfruj(wiadomosc, klucz);
System.out.println(zaszyfrowana);
// Wynik: "Uwtlwfrtbfsnj b Ofanj ojxy xzujw!"

String odszyfrowana = SzyfrCezara.deszyfruj(zaszyfrowana, klucz);
System.out.println(odszyfrowana);
// Wynik: "Programowanie w Javie jest super!"

Ograniczenia szyfru Cezara

Pamiętaj, że szyfr Cezara jest bardzo prosty i nie powinien być używany do prawdziwego zabezpieczania danych. Służy głównie do nauki podstaw kryptografii i jako interesujący przykład historycznej metody szyfrowania.

Zadanie dla czytelnika:

Spróbuj rozszerzyć powyższy kod, dodając obsługę polskich znaków diakrytycznych (ą, ę, ś itd.) lub zmodyfikować go tak, aby przyjmował tekst od użytkownika za pomocą klasy Scanner.

Efektywność i Optymalizacja Kodu

Przedstawiony kod jest prosty i czytelny, ale w rzeczywistych aplikacjach można go jeszcze zoptymalizować. Jednym z potencjalnych ulepszeń jest użycie metody StringBuilder zamiast zwykłej konkatenacji Stringów, co już zrobiliśmy w naszym przykładzie. Jest to ważne, szczególnie gdy pracujemy z dużymi tekstami.

Dla większych tekstów, złożoność czasowa naszego algorytmu wynosi O(n), gdzie n to długość tekstu, co jest całkiem efektywne. Pamięciowo również jest optymalny, ponieważ używamy tylko jednego StringBuilder oraz kilku zmiennych pomocniczych.

Zastosowania Edukacyjne

Implementacja szyfru Cezara w Javie jest doskonałym ćwiczeniem dla studentów informatyki, ponieważ łączy kilka ważnych koncepcji:

  • Manipulacja tekstem i operacje na znakach
  • Używanie typów prymitywnych i konwersje między typami
  • Operacje matematyczne, szczególnie modulo
  • Praca z metodami statycznymi i klasami narzędziowymi
  • Podstawy kryptografii i bezpieczeństwa danych

Jeśli jesteś nauczycielem informatyki, możesz wykorzystać ten przykład jako podstawę do zadań laboratoryjnych, dodając własne modyfikacje, jak obsługa specjalnych znaków czy implementacja innych algorytmów szyfrujących.

Rozszerzenia i Modyfikacje

Przedstawiony kod można rozszerzyć na wiele sposobów:

  • Dodanie interfejsu graficznego z wykorzystaniem JavaFX lub Swing
  • Implementacja szyfrowania dla plików tekstowych (odczyt/zapis)
  • Rozszerzenie o inne szyfry podstawieniowe
  • Dodanie mechanizmu automatycznego łamania szyfru (analiza częstotliwości)
  • Implementacja jako mikrousługa REST API za pomocą Spring Boot

Podsumowanie

Implementacja szyfru Cezara w Javie jest prostym zadaniem, które pomaga zrozumieć podstawy przetwarzania tekstów i operacji na znakach w tym języku. Choć sama metoda szyfrowania jest przestarzała, jej implementacja jest świetnym ćwiczeniem dla początkujących programistów Java.

Zachęcamy do eksperymentowania z kodem, wprowadzania własnych modyfikacji i rozszerzeń, które pomogą lepiej zrozumieć zarówno koncepcje programowania w Javie, jak i podstawy kryptografii.