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.
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.
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);
DEF ABC
- 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.
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}");
}
}
- 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.
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ę →