Szyfry monoalfabetyczne

Skip to content

To jest tekst przetłumaczony maszynowo, który może zawierać błędy!

O zadaniach kryptograficznych

Te zadania są strukturalnie nieco inne niż pozostałe zadania na Piggy, zastanawiam się, co wolicie! 😎

Na początku będzie trochę informacji na temat, a następnie pojawią się zadania!

„Poziomy” w tym zadaniu nie są do końca takie same jak poprzednie, tutaj wszystko jest bardziej podzielone na tematy.

Przejdź bezpośrednio do zadań

Co to jest “Cipher”?

Czy kiedykolwiek chciałeś napisać tajną wiadomość do przyjaciela, tak aby nikt inny nie mógł jej zrozumieć? W takim razie potrzebujesz Cipher, czyli szyfru! Szyfr to po prostu metoda, która przekształca zwykły tekst w “kod” poprzez zamianę znaków (często liter) na inne znaki. Wynik wygląda jak bełkot dla osób, które nie wiedzą, jak działa kod. Chodzi o to, że tylko osoby znające klucz (zasadę zamiany liter) mogą ponownie uczynić kod zrozumiały. Innymi słowy: szyfry umożliwiają tajne wiadomości, niezależnie od tego, czy jest to dziecięca zabawa z tajnym językiem, czy prawdziwi szpiedzy wysyłający zaszyfrowane wiadomości. 😄

Czy wiesz?

Słowo „szyfr” pochodzi w rzeczywistości od arabskiego słowa: sifr, które oznacza „zero”. Być może dlatego, że tajny kod wydawał się niczym (bez znaczenia!), gdy ludzie nie mogli go rozwiązać!

Istnieje wiele rodzajów szyfrów – niektóre używają liczb, niektóre symboli, a nowoczesna kryptografia danych wykorzystuje bardzo skomplikowane algorytmy. Te skomplikowane algorytmy wymagają bardzo skomplikowanej matematyki, więc przyjrzyjmy się najpierw kilku prostszym algorytmom!

Szyfry monoalfabetyczne

Przyjrzyjmy się najpierw niektórym z najprostszych (i najstarszych) istniejących metod kodowania: szyfrom monoalfabetycznym.

Monoalfabetyczny może brzmieć jak trudne słowo, ale możemy je podzielić: mono oznacza „jeden”, a alfabetyczny odnosi się do alfabetu.

Zatem szyfry monoalfabetyczne to kody, w których używa się jednego pojedynczego „alfabetu szyfrującego” dla całej wiadomości. Oznacza to, że każda litera w oryginalnym tekście jest zawsze zastępowana tą samą literą w całej zaszyfrowanej wiadomości.

Na przykład, jeśli zdecydujesz, że A ma zostać zastąpione przez X, to wszystkie litery A w tekście zostaną zamienione na X.

Szyfr Cezara

Klasycznym przykładem szyfru monoalfabetycznego jest szyfr Cezara (nazwany na cześć Juliusza Cezara). Jest to zasadniczo reguła „przesuwania” wszystkich liter o pewną liczbę pozycji w alfabecie. Podobno sam Cezar używał przesunięcia o 3 litery w swoich tajnych wiadomościach. Działa to tak, że A staje się D, B staje się E, C staje się F i tak dalej przez cały alfabet. (Kiedy przechodzi się obok Z, zaczyna się od A ponownie.) Wiadomość, która brzmi ABC, stałaby się DEF, jeśli użylibyśmy metody Cezara.

Nikt nie spodziewa się wiadomości w szyfrze Cezara?

Ceasar Cipher Meme

Jak działa szyfr Cezara w praktyce:

  • Wybierz klucz: Zdecyduj się na tajną liczbę (na przykład 3), która określa, o ile miejsc należy przesunąć każdą literę.
  • Zamień każdą literę: Dla każdej litery w oryginalnej wiadomości znajdź literę, która znajduje się tyle miejsc po niej w alfabecie (dla klucza 3, A staje się D, B staje się E, itd. – pamiętaj, aby wrócić do A po Z, jeśli to konieczne). Możesz również uwzględnić Æ, Ø i Å, ale to będzie trochę bardziej skomplikowane.
  • Zaszyfrowana wiadomość: Zastąp litery i napisz nową wiadomość z „przesuniętymi” literami. I voila – masz nieczytelny, tajny tekst, który tylko ci z kluczem mogą zrozumieć!
  • Aby odszyfrować (czyli zamienić go z powrotem na czytelny tekst), wykonaj po prostu odwrotne przesunięcie. Jeśli znasz klucz (np. 3), odczytanie wiadomości jest równie łatwe, przesuwając litery 3 miejsca wstecz w alfabecie.

Bezpieczeństwo?

Te kody nie są zbyt bezpieczne w dłuższej perspektywie. Ponieważ wzorzec (substytucja) jest stały, osoba z wystarczającą cierpliwością lub sprytnymi trikami może łatwo odkryć sekret. Na przykład w szyfrze Cezara istnieje tylko kilka możliwych przesunięć, tyle, ile liter w alfabecie, więc każdy może wypróbować wszystkie, aż wiadomość stanie się zrozumiała – lub użyć częstotliwości występowania liter, aby zgadnąć. Innymi słowy, może nie używaj szyfru Cezara do supertajnych zapisków w dzienniku lub tajemnic państwowych 😉.

Szyfry monoalfabetyczne to fantastyczny sposób na poznanie zasady działania szyfrowania. Są proste i pokazują, jak możemy użyć prostej reguły (klucza) do przekształcenia zrozumiałego tekstu w coś tajemniczego i niezrozumiałego – i z powrotem. Więc następnym razem, gdy chcesz wysłać przyjacielowi tajną wiadomość, możesz użyć szyfru Cezara! Może spróbujecie stworzyć własną wersję tajnego alfabetu Cezara? 🔐✨


Zadania

Języki programowania?

Jak wcześniej, śmiało używaj dowolnego języka programowania! Przykłady tutaj będą w Pythonie.

Medium Zadanie 1.1 - Szyfrowanie Cezara

Teraz napiszemy trochę kodu! Zacznijmy prosto od stworzenia szyfrowania, bazując na teorii powinno być dość proste.

Zaimplementuj szyfrowanie za pomocą szyfru Cezara, używając funkcji, która przyjmuje tekst i liczbę będącą “kluczem”, czyli o ile alfabet ma być przesunięty.

Wskazówki dotyczące procedury.
  1. Stwórz funkcję o nazwie caesar, która przyjmuje tekst do zaszyfrowania oraz “shift”, czyli o ile miejsc w alfabecie ma zostać przesunięty tekst.
  2. Przejdź przez tekst litera po literze.
  3. Nie chcemy “przesuwać” innych znaków niż litery: dowiedz się, jak sprawdzić, czy dany znak w tekście jest literą.
  4. Musimy “obrócić” literę o n miejsc, czyli musimy dodać przesunięcie: dowiedz się, jak możesz przekształcić tekst w liczby, aby móc dodać shift. Podpowiedź: funkcja ord().
  5. Pamiętaj! Otrzymasz tutaj różne wartości w zależności od tego, czy masz małe, czy wielkie litery. Odnieś się do Tabeli ASCII.
  6. Gdy masz już wartość, wystarczy po prostu dodać n do tej wartości. Ale co się stanie, jeśli będziesz na końcu alfabetu? Po literze Z otrzymamy same błędy. Jak to naprawić? Wymaga to nieco przemyślenia.
Naprawienie szyfrowania.

Aby całkowicie naprawić szyfrowanie, potrzeba trochę przemyślenia.

  • Pierwszym krokiem do rozważenia jest użycie operatora modulo, %.
  • Ponieważ alfabet (po angielsku) składa się z 26 liter, możemy zastosować modulo 26.
  • Ale to nie działa do końca, widzisz dlaczego?
  • Spróbuj printować wartość znaku za pomocą ord(), co otrzymasz?
  • Dla a otrzymasz 97. Jeśli zastosujesz modulo 26 do tej liczby, otrzymasz 19. Pamiętaj, że modulo zawsze daje wynik między 0 a tą liczbą.
  • Można to naprawić, zapisując wartość początkową dla wielkich i małych liter, odejmując ją od litery, a następnie stosując modulo. Wtedy wzór brzmi: (ord(bokstav) - ord('a')) % 26
  • Aby odzyskać właściwą literę, po prostu dodaj ponownie wartość początkową.
  1. Po tym wszystkim możesz w końcu ponownie przekształcić liczbę w literę. Możesz tu użyć funkcji chr().
  2. Teraz możesz w końcu dodać literę do wyniku i zwrócić zaszyfrowany tekst!

Rozwiązanie:
def caesar_cipher(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
        # znajdź punkt startowy w zależności od wielkości liter
        start = ord('A') if char.isupper() else ord('a')
        # Trudne obliczenie przesunięcia
        result += chr((ord(char) - start + shift) % 26 + start)
    else:
        result += char
    return result

Easy Zadanie 1.2 - Dekryptacja Szyfru Cezara

Dekryptacja to po prostu wykonanie odwrotnego obliczenia do szyfrowania. Odejmujesz przesunięcie zamiast dodawać.

Wskazówki dotyczące procedury.

Użyj funkcji, którą stworzyłeś w zadaniu 1, do tego celu. Po prostu użyj tej samej funkcji, ale w odwrotnej kolejności. Możesz to zrobić, wykonując przesunięcie za pomocą 26 - shift.

Rozwiązanie:
def caesar_decrypt(text, shift):
    return caesar_cipher(text, 26 - shift)

Inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne inne

Jak działa Atbash?

Jest to bardzo proste, zamiast rotacji litery są mapowane na przeciwne litery alfabetu. Poniżej znajduje się tabela pokazująca mapowanie:

a b c d e f g h i j k l m n o p q r s t u v w x y z
z y x w v u t s r q p o n m l k j i h g f e d c b a

Medium Zadanie 1.3 - Szyfrowanie i deszyfrowanie Atbash

Wygodą Atbash jest to, że ponieważ szyfrowanie jest transformacją 1 do 1, działa ono bezpośrednio w odwrotnej kolejności. Oznacza to, że jeśli utworzyłeś szyfrowanie, automatycznie utworzyłeś również deszyfrowanie.

Jak to można zrobić w praktyce?

Możesz albo odjąć literę w odniesieniu do Z, albo stworzyć tabelę “Look-up”. Oznacza to, tabelę lub słownik, który zawiera wszystkie litery od a do z i co z nich ma powstać. Może to być dobre rozwiązanie, jeśli chcecie stworzyć inny rodzaj szyfrowania.

Implementacja tablicy asocjacyjnej.
letters = {
    'a': 'z'
    'b': 'y'
    'c': 'x'
    'd': 'w'
    # ... dodaj pozostałe litery w dół
}

Korzystając z tej tabeli, możesz przejść przez nią literę po literze, pobrać wartość dla każdej litery z tabeli odniesienia, a następnie ją wypisać. Co musisz zrobić w przypadku wielkich i małych liter?


Część 2 - Kryptoanaliza Szyfrów Monoalfabetycznych

W tej części spróbujecie stworzyć algorytm do “złamania” szyfru Cezara, czyli pobrać zaszyfrowany tekst, a następnie odzyskać oryginalny tekst bez znajomości klucza.

Można to zrobić w miarę ręcznie, lub spróbować wykorzystać prostą “kryptoanalizę”. Jest to koncepcja, którą przyjrzymy się głębiej później, ale na razie zajmiemy się jedną z najprostszych metod: analizą częstotliwości (frequency analysis). Możesz przeczytać więcej o tej koncepcji tutaj: Frequency Analysis lub tutaj Wikipedia - frequency analysis.

Metodę tę można stosować nie tylko w szyfrach Cezara, ale także w bardziej skomplikowanych algorytmach, jednak szyfr Cezara jest tak prosty, że analiza częstotliwości jest trywialna.

Jak działa analiza częstotliwości?

Analiza częstotliwości, jak sugeruje nazwa, to sposób na sprawdzenie częstotliwości występowania liter w tekście. Dlaczego to może być przydatne? Wyobraź sobie, że masz długi tekst, załóżmy tekst angielski, pochodzący z Wikipedia - frequency analysis:

In cryptanalysis, frequency analysis is the study of the frequency of letters or groups of letters in a ciphertext. The method is used as an aid to breaking classical ciphers.

Frequency analysis is based on the fact that, in any given stretch of written language, certain letters and combinations of letters occur with varying frequencies. Moreover, there is a characteristic distribution of letters that is roughly the same for almost all samples of that language. For instance, given a section of English language, E, T, A and O are the most common, while Z, Q, X and J are rare. Likewise, TH, ER, ON, and AN are the most common pairs of letters termed bigrams or digraphs), and SS, EE, TT, and FF are the most common repeats. The nonsense phrase ETAOIN SHRDLU represents the 12 most frequent letters in typical English language text.

In some ciphers, such properties of the natural language plaintext are preserved in the ciphertext, and these patterns have the potential to be exploited in a ciphertext-only attack.

Jeśli przekształcimy ten tekst za pomocą szyfru Cezara (usuwając przecinki, spacje i inne znaki specjalne), otrzymamy następujący tekst zaszyfrowany:

xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz

Ten tekst wygląda niemożliwie do złamania, ale za pomocą „Analizy Częstotliwości” nie tylko jest to możliwe, ale i łatwe.

Zobacz następującą figurę:
English frequency distribution

Jest to figura przedstawiająca rozkład liter w języku angielskim. Widzimy, że litera E jest najczęściej występującą literą, po niej T, A i O.

Można to przedstawić w tabeli, a następnie wykorzystać do zliczania i analizowania danego tekstu zaszyfrowanego, aby go „złamać”. W zadaniach poniżej musisz stworzyć program, który potrafi samodzielnie „złamać” szyfr Cezara. Prawda jest taka, że szyfr Cezara jest tak prosty, że możesz sprawdzić wszystkie 26 możliwości ręcznie, ale tutaj chcemy znaleźć rozwiązanie, w pełni automatycznie.

Easy Zadanie 2.1 - Tworzenie tabeli częstości

W pliku python, utwórz tabelę częstości występowania liter w języku angielskim. Możesz spróbować znaleźć ją samodzielnie, ale jeśli nie chcesz tego robić, rozumiemy to!

Jeśli absolutnie chcesz znaleźć ją samodzielnie, możesz postąpić jak w Zadaniu 2.2, ale na bardzo dużym tekście.

Częstotliwość liter w języku angielskim (Odpowiedź)
english_letter_frequency = {
    'E': 12.70, 
    'T': 9.06, 
    'A': 8.17, 
    'O': 7.51, 
    'I': 6.97, 
    'N': 6.75, 
    'S': 6.33, 
    'H': 6.09, 
    'R': 5.99, 
    'D': 4.25, 
    'L': 4.03, 
    'C': 2.78, 
    'U': 2.76, 
    'M': 2.41, 
    'W': 2.36, 
    'F': 2.23, 
    'G': 2.02, 
    'Y': 1.97, 
    'P': 1.93, 
    'B': 1.29, 
    'V': 0.98, 
    'K': 0.77, 
    'J': 0.15, 
    'X': 0.15, 
    'Q': 0.10, 
    'Z': 0.07
}

Medium Zadanie 2.2 - Zliczanie częstotliwości występowania liter w tekście

Teraz stworzymy algorytm, który znajdzie częstotliwość występowania liter w danym tekście.

Wskazówki dotyczące procedury
  1. Zacznij od funkcji, która przyjmuje tekst (może to być cokolwiek).
  2. W funkcji utwórz “dictionary” (Python Dictionaries), z wpisami dla każdej litery alfabetu, ustawionymi na 0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0})
  3. Przejdź przez cały tekst i policz każdą literę (zwiększ o 1 odpowiedni wpis w słowniku). Powinieneś tutaj prawdopodobnie zignorować znaki, które nie są literami, pamiętaj również o wielkich i małych literach.
  4. Śledź, ile liter zostało policzonych łącznie.
  5. Gdy skończysz liczyć, podziel / każdą wartość w tabeli przez długość tekstu, a następnie pomnóż przez 100, co da Ci częstotliwość procentową. (Możesz oczywiście pozwolić, aby Twoja tabela mieściła się w zakresie od 0 do 1).
  6. Teraz powinieneś mieć tabelę częstotliwości dla tekstu.

Medium Zadanie 2.3 - Porównanie częstotliwości tekstu z rzeczywistą częstotliwością

Kiedy już znajdziesz częstotliwość wszystkich liter w tekście, możesz stworzyć funkcję, która znajdzie „odległość”. Co to? Co przez to rozumiesz?!

Możesz sobie wyobrazić, że częstotliwość na przykład E w tekście będzie liczbą. Możesz znaleźć „odległość”, jaką ma od rzeczywistej częstotliwości, która wynosi 12.70. Przykład: Częstotliwość wynosi 9.63, jaka jest odległość? Odległość będzie wartością bezwzględną (liczby ujemne stają się dodatnie) między tymi dwiema wartościami: \(12.70 - 9.63 = 3.07\).

Stwórz funkcję, która przechodzi przez każdą z liter i znajduje odległość. Następnie zsumuj wszystkie odległości do „całkowitej” odległości.

Funkcja matematyczna?

Jeśli zastanawiasz się, jak wygląda funkcja matematyczna dla tego, to wygląda ona tak:

\(\sum_{n=0}^{N} \lvert a - b\rvert\)

Wskazówki dotyczące procedury
  1. Użyj pętli for, aby przejść przez całą tabelę częstotliwości.
  2. Dla każdej litery w tabeli częstotliwości znajdź wartość bezwzględną w porównaniu z rzeczywistą częstotliwością. Użyj do tego funkcji abs() w Pythonie.
  3. Zsumuj wszystkie wartości, aby uzyskać wynik końcowy.

Hard Zadanie 2.4 - “Złamanie” szyfru Cezara

Teraz podsumujmy wszystko, co do tej pory zrobiliśmy! Teraz “złamiemy” szyfr Cezara.

Stwórz program, który “złamie” szyfr Cezara! Bez interakcji z użytkownikiem, program powinien być w stanie przyjąć zaszyfrowany tekst i odzyskać odszyfrowany tekst bez potrzeby klucza.

Test data

Oto niektóre dane testowe, których możecie użyć, co o nich sądzicie?

Test-data
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac
lsaizivxlmwqiwwekimwuymxiwlsvxwsmqklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha

Wskazówki dotyczące procedury
  1. Zacznij od stworzenia funkcji, która przyjmuje tekst.
  2. Użyj funkcji deszyfrującej dla szyfru Cezara z rotacją N dla tekstu, gdzie N zaczyna się od 0.
  3. Stwórz tabelę częstotliwości z wyniku.
  4. Oblicz odległość wyniku w stosunku do rzeczywistej tabeli częstotliwości.
  5. Albo: a) śledź odległość w liście, albo b) śledź najmniejszą wartość i rotację (to stanie się kluczem).
  6. Zwiększ rotację o 1 i powtarzaj kroki 2 do 6, aż N osiągnie 26 (pełna rotacja).
  7. Zwróć odszyfrowany tekst, czyli najmniejsza odległość to właściwy klucz.