15C: Cezara TFLSFUOZ QSAFQJT OB CJHPT

Ćwiczenia 15A, 15B i 15C mogą być wykonane w dowolnej kolejności.

Kryptografia to sztuka i nauka ukrywania znaczenia informacji w taki sposób, aby tylko niektórzy ludzie ją widzieli. W tej lekcji wprowadzimy jedną z najprostszych metod kryptograficznych, Szyfr Cezara (znany również jako szyfr podstawieniowy), a także napiszemy program, który go złamie. Zaprojektujesz każdy aspekt swojego rozwiązania (w przeciwieństwie do lekcji 15A, w której podzieliliśmy rozwiązywanie problemu na podzadania).

Szyfr Cezara zastępuje każdą literę alfabetu inną literą. Działa tak, gdy chcesz zakodować jakiś tekst, musisz wybrać wartość przesunięcia S, które może wynosić od 0 do 25. Następnie zamienić każdą literę w tekście na literę, która jest o S liter dalej w alfabecie, a po osiągnięciu Z na końcu alfabetu wraca na początek.

Przykład

Załóżmy, że chcemy zakodować sekretną wiadomość

JOIN ME AT EIGHT BY THE ZOO

używając przesunięcia S=2.

Reguła szyfrowania mówi, że każda litera jest zastąpiona literą, która występuje w dalszej części alfabetu. Na przykład, ponieważ alfabet ma postać ABCDEFGHIJKL ..., pierwsza litera J zostanie zastąpiona literą L. Kontynuując, O zastępuje się literą Q, I zastępuje się literą K, itd. Aby zakodować literę Y, musimy na początek alfabetu: po Y pochodzi Z, a następnie A, więc Y jest zastępowane przez A. Podobnie Z zastąpione jest przez B. Więc zakodowana wersja naszego tajnego komunikatu to:

LQKP OG CV GKIJV DA VJG BQQ

Gdyby jakiś szpieg zobaczył tę wiadomość, nie byłby dla niego oczywiste, jaka jest jej treść.

Zadanie krótkiej odpowiedzi: Szpiegowski Szyfrator
Jaki będzie rezultat rozkodowania SPY CODER przy wartości przesunięcia S=5? (Używaj dużych liter.) Jeśli chcesz, napisz program w konsoli, który to obliczy — może się on przydać później.
Bezbłędnie!

Deszyfracja

Gdy Twój przyjaciel dostanie wiadomość, to jeśli zna wartość tajnego przesunięcia S, to łatwo odszyfruje wiadomość: każda litera jest zastępowana przez literę umieszczoną w alfabecie o S pozycji wcześniej. Na przykład, popatrzy na L, cofnie się o dwie pozycje w alfabecie i znajdzie literę J, o której teraz wie, że jest pierwszą literą twojej tajnej wiadomości. Znowu należy traktować alfabet w sposób cykliczny, zakładając, że Z przechodzi na A.

Zadanie krótkiej odpowiedzi: Szpiegowski Deszyfrator
Jeśli zaszyfrowana wiadomość to HUD, a wartość przesunięcia wynosi S=6, to jaka była pierwotna wiadomość? (Użyj wielkich liter.)
Bezbłędnie!

Pracuję dla Złych Facetów

Zostałeś zatrudniony przez szpiega, aby pomóc odszyfrować wiadomość zaszyfrowaną przy użyciu szyfru podstawieniowego. Niestety, szpieg nie zna wartości S. Do napisania programu będziesz musiał używać statystyk, które dają duże szanse na automatyczne znalezienie odpowiedniej wartości S.

Nasza metoda polega na analizie częstotliwości literowej. W języku angielskim niektóre litery są bardzo powszechne (np. E), a niektóre występują rzadko (np. J). Oto tabela częstotliwości, oparta na liczeniu częstotliwości wystąpień w dużym obszarze tekstu.

A B C D E F G H I
.0817 .0149 .0278 .0425 .1270 .0223 .0202 .0609 .0697
J K L M N O P Q R
.0015 .0077 .0402 .0241 .0675 .0751 .0193 .0009 .0599
S T U V W X Y Z
.0633 .0906 .0276 .0098 .0236 .0015 .0197 .0007

Na przykład, częstotliwość L wynosi 0,0402=4,02%, co oznacza, że tekst angielski średnio zawiera 4,02% L liter.

Wywołanie goodness dla litery daje wartość zawartą w powyższej tabeli. Teraz, dla naszej metody statystycznej, określamy goodness dla zdania jako sumę goodness każdej z jej liter. Na przykład, goodness łańcucha GOOD wynosi

goodness("GOOD") = .0202 + .0751 + .0751 + .0425 = .2129

Idea analizy częstotliwości polega na tym, że łańcuchy o wyższej częstotliwości goodness z większym prawdopodobieństwem reprezentują tekst w języku angielskim. Na przykład, jeśli szpieg widzi zaszyfrowaną wiadomość "JRRG", to oryginalny tekst może być "GOOD z przesunięciem S = 3 lub "IQQF" z S = 1. Ale goodness "IQQF" jest

goodness("IQQF") = .0697 + .0009 + .0009 + .0223 = .0938

i skoro 0,0938 < 0,2129, to twój program powinien wywnioskować, że GOOD jest bardziej prawdopodobną prawidłową wiadomością niż IQQF.

Ocenianie łańcuchów poprzez goodness nie jest doskonałe. Dajmy na to, że sekretna wiadomość to JAZZ, a wartość tajnego przesunięcia to S = 10, więc rozszyfrowany tekst to TKJJ. Kiedy wprowadzisz TKJJ do swojego programu i sprawdzisz dla S = 10, wtedy goodness dla JAZZ wyniesie 0,0846, ale lepszą wartość uzyskasz dla S = 5 i otrzymanej wiadomości OFEE z goodness 0,3514 jako najlepszego proponowanego wyniku tego programu. Twój program powinien iść dalej i wyświetlić to nieangielskie słowo OFEE. (Analiza częstotliwości tego typu działa lepiej, jeśli zakodowana wiadomość jest dłuższa).

Zadanie na kodowanie : Automatyczna deszyfracja
Napisz program, który wykonuje następujące czynności: Najpierw czyta na wejściu jedną linię, która jest zakodowaną wiadomością składającą się z dużych liter i spacji. Twój program ma próbować dekodować wiadomość używając wszystkich 26 możliwych wartości przesunięcia S; z tych 26 możliwych oryginalnych wiadomości, program ma wydrukować tę, która ma największą goodness.

Dla Twojej wygody, zdefiniowaliśmy dla ciebie zmienną letterGoodness, jest to lista długości 26, której elementy są równe wartościom z powyższej tabeli częstotliwości,

letterGoodness = [.0817,.0149,.0278,.0425,.1270,.0223,.0202,...

Kliknij tutaj, aby uzyskać ogólne porady.
Wpisz polecenia takie jak print(mafonction("test-argument")) w polu poniżej.

Takie rozwiązanie nazywa się rozwiązaniem brute force, ponieważ próbowałeś wszystkich 26 możliwości. Można nawet zrobić to ręcznie, jeśli trzeba. Z drugiej strony nowoczesne protokoły kryptograficzne są tak zaprojektowane, że brute force nie zapewnia rozwiązania, nawet jeśli używasz bardzo szybkich komputerów, aby spróbować wszystkich możliwości.

Jeśli chcesz, aby ten system automatycznego dekodowania był dokładniejszy, możesz zwrócić uwagę na inne statystyki w języku angielskim, takie jak "jakie litery mogą występować w parach obok siebie?", od jakich liter mogą zaczynać się słowa?" Jest to również użyteczne dla bardziej ogólnych szyfrów podstawieniowych, gdzie litery zastępują litery, ale nie w sposób cykliczny. Dla takich szyfrów brute force nie działa, ponieważ istnieją 26 * 25 * ... * 1 możliwe szyfry podstawieniowe, co odpowiada około 4 * 1026 (czterysta septylionów).

Ukończyłeś tę lekcję! Aby to świętować, zachęcam do wysyłania twoim znajomym zaszyfrowanej wiadomości.