INF.04 · C# · lekcja 23

Algorytmy szyfrowania i tekstowe (szyfr Cezara, GADERYPOLUKI)

Przekształć tekst według jawnej reguły

  • Zrozum
  • Sprawdź
  • Napisz sam

Po tej lekcji: przekształć tekst według jawnej reguły

Dzisiaj zrobisz konkretną rzecz

Podstawa programowa (INF.04.3.3) wymienia wprost "algorytmy tekstowe" i "algorytmy szyfrowania" jako coś, co trzeba umieć zaimplementować. To też świetny sposób na przećwiczenie pracy z tekstem (string) w C# — indeksowanie znaków, kody ASCII, pętle po znakach — czyli umiejętności przydatne w każdym programie przetwarzającym dane od użytkownika.

Szyfr Cezara i podobne proste szyfry podstawieniowe nie są dziś używane do prawdziwego zabezpieczania danych (łamie się je w kilka sekund), ale sama IDEA podstawienia znaków leży u podstaw dużo poważniejszych systemów szyfrowania (np. AES, którego używa HTTPS przy każdym wejściu na stronę bankową). Zrozumienie prostego przypadku pomaga zrozumieć, na czym w ogóle polega szyfrowanie — zamiana czytelnej informacji na nieczytelną według znanego obu stronom klucza/reguły.

Sprawdź w działaniu

Przekształć tekst według jawnej reguły

Najpierw przewidź wynik. Zmień dane w modelu i porównaj efekt. Spróbuj także przypadku granicznego, a nie tylko pierwszego poprawnego przykładu.

Ta interakcja wymaga włączonego JavaScriptu.

Model pokazuje wybraną zasadę. Nie uruchamia ani nie ocenia wklejonego kodu C#.

1. Przygotuj i uruchom własny projekt

2. Najpierw mały przykład

Wykonaj tę próbę przed dłuższym rozwiązaniem. Najpierw sprawdzamy zakres A–Z, potem zamieniamy literę na indeks0–25, przesuwamy i zawijamy modulo26. Spacje zostają. To dydaktyczny szyfr, nie ochrona haseł ani danych.

Program.cscsharp
string tekst = "ABC XYZ";
string wynik = "";
foreach (char znak in tekst)
{
    wynik += znak >= 'A' && znak <= 'Z'
        ? (char)('A' + (znak - 'A' + 3) % 26) : znak;
}
Console.WriteLine(wynik);
Wynik
DEF ABC
  1. Co sprawdzić? Zmień jedną wartość i przed uruchomieniem zapisz przewidywany rezultat. Porównaj go z opisem wyniku; przy błędzie wróć do konkretnej instrukcji.

Jak to działa — 1

Szyfr Cezara to jeden z najstarszych i najprostszych szyfrów podstawieniowych — każda litera tekstu jawnego jest zastępowana literą przesuniętą o stałą liczbę pozycji w alfabecie (tzw. klucz). Przy przesunięciu 3: A→D, B→E, C→F, itd. Po dotarciu do końca alfabetu przesunięcie "zawija się" na początek (X→A, Y→B, Z→C). Do deszyfrowania wystarczy przesunąć litery w przeciwną stronę o tę samą wartość.

GADERYPOLUKI to polski szyfr podstawieniowy, w którym litery alfabetu są zamieniane parami zgodnie ze słowem-kluczem GADERYPOLUKI: G↔A, D↔E, R↔Y, P↔O, L↔U, K↔I (litery łączone są w pary wg kolejności liter w tym słowie). Zasada działania jest identyczna jak w prostym szyfrze podstawieniowym — tylko reguła zamiany jest inna niż stałe przesunięcie.

W C# do pracy z pojedynczymi znakami tekstu przydają się: indeksowanie tekst[i] (dostęp do konkretnego znaku), typ char oraz fakt, że w C# znaki mają swoje kody liczbowe (ASCII/Unicode) — można je konwertować na liczby i z powrotem, co jest kluczowe przy przesuwaniu liter w szyfrze Cezara.

3. Pełny przykład — czytaj od Main

Teraz zastąp Program.cs tym programem. Zanim uruchomisz, znajdź dane wejściowe, operację i miejsce prezentacji wyniku. W tym wariancie zachowujemy jawny Main. Nie wklejaj kilku pełnych programów do jednego pliku.

Program.cs — osobne uruchomieniecsharp
using System;
using System.Text;

class Program
{
    // Szyfr Cezara — działa tylko na wielkich literach A-Z dla uproszczenia.
    static string SzyfrCezara(string tekst, int przesuniecie)
    {
        var wynik = new StringBuilder();

        foreach (char znak in tekst)
        {
            if (znak >= 'A' && znak <= 'Z')
            {
                // 'A' ma kod 65. Odejmujemy go, żeby dostać pozycję 0-25,
                // dodajemy przesunięcie, bierzemy resztę z dzielenia przez 26
                // (żeby "zawinąć" po Z z powrotem na A), i wracamy do litery.
                int pozycja = (znak - 'A' + przesuniecie) % 26;
                wynik.Append((char)('A' + pozycja));
            }
            else
            {
                wynik.Append(znak); // spacje i inne znaki bez zmian
            }
        }

        return wynik.ToString();
    }

    static void Main()
    {
        string tajneSlowo = "PROGRAMOWANIE";
        string zaszyfrowane = SzyfrCezara(tajneSlowo, 3);
        string odszyfrowane = SzyfrCezara(zaszyfrowane, 26 - 3); // przesunięcie w drugą stronę

        Console.WriteLine($"Tekst jawny:    {tajneSlowo}");
        Console.WriteLine($"Zaszyfrowany:   {zaszyfrowane}");
        Console.WriteLine($"Odszyfrowany:   {odszyfrowane}");
    }
}
  1. Prześledź kod Najważniejsza linijka to (znak - 'A' + przesuniecie) % 26. Odejmowanie znaków w C# (znak - 'A') daje liczbę — różnicę ich kodów. Dla litery A da to 0, dla B da 1, itd. Po dodaniu przesunięcia bierzemy resztę z dzielenia przez 26 (liczba liter w alfabecie łacińskim), żeby po przekroczeniu Z "zawinąć" z powrotem na A. Na końcu (char)('A' + pozycja) zamienia tę liczbę z powrotem na literę. Deszyfrowanie to po prostu przesunięcie w drugą stronę — a przesunięcie "w drugą stronę o 3" to to samo co "do przodu o 26-3=23", dzięki czemu można użyć tej samej funkcji.

Sprawdź, zanim przepiszesz cały program

Zapominanie o "zawijaniu" alfabetu — bez operatora % (reszta z dzielenia) litera Z przesunięta o 3 dałaby znak spoza alfabetu zamiast wrócić na C.

Szyfrowanie znaków spoza zakresu A-Z — bez sprawdzenia if (znak >= 'A' && znak <= 'Z') spacje, cyfry i polskie znaki (ą, ę, ć) też zostałyby "przesunięte" i zmieniłyby się w bezsensowne symbole.

Mylenie kierunku przesunięcia przy deszyfrowaniu — trzeba pamiętać, że deszyfrowanie to przesunięcie o tę samą wartość, ale w przeciwnym kierunku.

Ćwiczenie z pomocą · samodzielna praca

4. Teraz Twoja zmiana

Zmień przesunięcie na inną wartość (np. 7 albo 13 — słynne ROT13) i sprawdź, czy szyfrowanie i deszyfrowanie nadal działają poprawnie dla tego samego tekstu.

Oczekiwany rezultat
Spełnij warunki polecenia. Zapisz wejście, otrzymany wynik i wyjaśnij, która część kodu za niego odpowiada.
Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź

Wróć do podstawowej formy oraz objaśnienia: Najpierw sprawdzamy zakres A–Z, potem zamieniamy literę na indeks0–25, przesuwamy i zawijamy modulo26. Spacje zostają. To dydaktyczny szyfr, nie ochrona haseł ani danych.

Krok 2 — pokaż podpowiedź

Zmień tylko część potrzebną do polecenia. Zachowaj działającą wersję przed zmianą i uruchamiaj po każdym małym etapie.

Krok 3 — pokaż podpowiedź

Sprawdź przypadek zwykły i graniczny; porównaj z regułą: DEF ABC

Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.

5. Sprawdź rozumienie, nie tylko uruchomienie

Dalej na swoim koncie

Rozgrzewki, quiz i zadania są w biurku ucznia.

Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.

Zaloguj się →
Źródła i dalsza nauka