Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:verschluesselung:caesar [2024-03-19 07:09] – [Aufgabe B2] hof | gf_informatik:verschluesselung:caesar [2025-03-18 15:34] (aktuell) – hof | ||
|---|---|---|---|
| Zeile 58: | Zeile 58: | ||
| </ | </ | ||
| - | < | + | < |
| ++++Lösung: | ++++Lösung: | ||
| <code python caesar.py> | <code python caesar.py> | ||
| - | import string | ||
| - | def caesar(text, key): | + | def caesar(klartext, n): |
| - | | + | |
| - | for letter | + | |
| - | | + | # Jeden Buchstaben b im Klartext durchgehen. |
| - | if index != -1: | + | for b in klartext: |
| - | | + | # Mit jedem Buchstaben: |
| - | | + | # - Position im Alphabet finden alphabet.find |
| - | letter = string.ascii_uppercase[index] | + | |
| - | | + | # |
| - | return | + | |
| + | # | ||
| + | p = p % len(alphabet) | ||
| + | | ||
| + | return | ||
| key = 17 | key = 17 | ||
| Zeile 81: | Zeile 84: | ||
| ++++ | ++++ | ||
| </ | </ | ||
| + | |||
| #### Aufgabe 2 | #### Aufgabe 2 | ||
| ##### a) | ##### a) | ||
| - | Die folgende Nachricht ist mit der Caesar-Verschlüsslung verschlüsselt, | + | Die folgende Nachricht ist mit der Caesar-Verschlüsslung verschlüsselt, |
| Als Alphabet wurden folgende Zeichen verwendet: `ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 .,!?` | Als Alphabet wurden folgende Zeichen verwendet: `ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 .,!?` | ||
| Zeile 93: | Zeile 97: | ||
| ##### b) | ##### b) | ||
| - | Nutze deinen Code, um die folgende Nachricht zu knacken: | + | Nutze deinen Code, um die folgende Nachricht zu knacken: |
| ++++Tipp| | ++++Tipp| | ||
| Probiere alle möglichen Verschiebungen aus. Am einfachsten geht dies mit einer ...! | Probiere alle möglichen Verschiebungen aus. Am einfachsten geht dies mit einer ...! | ||
| ++++ | ++++ | ||
| - | |||
| ## Monoalphabetische Verschlüsslung | ## Monoalphabetische Verschlüsslung | ||
| - | Eine Weiterentwicklung der Caesar-Verschlüsselung erhält man, wenn man das Alphabet nicht nur um eine fest Anzahl stellen verschiebt, sondern das gesamte Alphabet *durchmischt*. Aus "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | + | Eine Weiterentwicklung der Caesar-Verschlüsselung erhält man, wenn man das Alphabet nicht nur um eine fest Anzahl stellen verschiebt, sondern das gesamte Alphabet *durchmischt*. Aus `ABCDEFGHIJKLMNOPQRSTUVWXYZ` wird dann zum Beispiel |
| Zeile 116: | Zeile 119: | ||
| 1. Eine mit der Caesar-Methode verschlüsselte Nachricht kann man problemlos mit Brute-Force entschlüsseln (alle Möglichkeiten ausprobieren). Funktioniert dies bei der monoalphabetische Verschlüsselung auch? Gibt es bessere Möglichkeiten, | 1. Eine mit der Caesar-Methode verschlüsselte Nachricht kann man problemlos mit Brute-Force entschlüsseln (alle Möglichkeiten ausprobieren). Funktioniert dies bei der monoalphabetische Verschlüsselung auch? Gibt es bessere Möglichkeiten, | ||
| - | < | + | < |
| ++++Lösung| | ++++Lösung| | ||
| Für den ersten Buchstaben A können wir unter 26 Möglichkeiten auswählen, um ihn umzuplatzieren. Für B bleiben noch 25, für C 24 Möglichkeiten, | Für den ersten Buchstaben A können wir unter 26 Möglichkeiten auswählen, um ihn umzuplatzieren. Für B bleiben noch 25, für C 24 Möglichkeiten, | ||
| Zeile 123: | Zeile 126: | ||
| ++++ | ++++ | ||
| </ | </ | ||
| - | |||
| #### Aufgabe B2 | #### Aufgabe B2 | ||
| - | Die Nachricht | + | Die Nachricht |
| ++++Tipps| | ++++Tipps| | ||
| Zeile 132: | Zeile 134: | ||
| 1. Gehe Buchstaben um Buchstaben durch die Nachricht. | 1. Gehe Buchstaben um Buchstaben durch die Nachricht. | ||
| 1. Ermittle die Position von diesem Buchstaben im durchmischten Alphabet (Schlüssel). | 1. Ermittle die Position von diesem Buchstaben im durchmischten Alphabet (Schlüssel). | ||
| - | | + | |
| ++++ | ++++ | ||
| - | <nodisp 2> | + | < |
| + | ++++Mehr Tipps| | ||
| + | <code python> | ||
| + | def decrypt(ciphertext, | ||
| + | # oder string.ascii_uppercase | ||
| + | alphabet = " | ||
| + | cleartext = "" | ||
| + | for letter in ciphertext: | ||
| + | # TODO | ||
| + | # 1: Jeden Buchstaben im Chiffrat einzeln entschlüsseln. | ||
| + | # 1a: Index des Buchstabens im Schlüssel finden. | ||
| + | index = ... | ||
| + | # 1b: Klartext-Buchstaben am gleichen Index im Alphabet auslesen. | ||
| + | clear_letter = ... | ||
| + | # 2: entschlüsselten Buchstaben an den Klartext anfügen. | ||
| + | cleartext = cleartext + clear_letter | ||
| + | return cleartext | ||
| + | |||
| + | ciphertext = " | ||
| + | key = " | ||
| + | print(decrypt(ciphertext, | ||
| + | </ | ||
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | <nodisp 1> | ||
| ++++Lösung| | ++++Lösung| | ||
| <code python> | <code python> | ||
| Zeile 159: | Zeile 186: | ||
| ++++ | ++++ | ||
| </ | </ | ||
| - | + | + | |
| ## Häufigkeitsanalyse | ## Häufigkeitsanalyse | ||
| Zeile 229: | Zeile 256: | ||
| ``` | ``` | ||
| ++++ | ++++ | ||
| - | < | + | < |
| ++++Python Lösung| | ++++Python Lösung| | ||
| <code python> | <code python> | ||
| Zeile 242: | Zeile 269: | ||
| return text | return text | ||
| | | ||
| - | |||
| def count_letters(text): | def count_letters(text): | ||
| """ | """ | ||
| Zeile 273: | Zeile 299: | ||
| # Print the letter with width 2 | # Print the letter with width 2 | ||
| # Print the frequency with width 6 and precision 2, in percent format. | # Print the frequency with width 6 and precision 2, in percent format. | ||
| - | print(" | + | print(f"{letter:2}{percent: |
| print_percentages(count_letters(faust)) | print_percentages(count_letters(faust)) | ||
| Zeile 286: | Zeile 312: | ||
| <code python> | <code python> | ||
| - | import | + | from urllib.request |
| - | + | count = 0 | |
| - | data = urllib2.urlopen(< | + | data = urlopen(< |
| - | line_first | + | text = data.read().decode(' |
| - | line_last | + | |
| - | for line in data: | + | |
| - | line = line.replace(' | + | |
| - | if line_first <= count <= line_last: | + | |
| - | print(line) # Achtung: keine gute Idee, wenn File sehr viele Zeilen beinhaltet! Baue z.B. Counter ein, damit nach z.B. 100 Ausgaben abbricht | + | |
| </ | </ | ||
| - | |||
| - | Beachte, dass du noch die erste und letzte Zeilennummer im Buch angeben musst: Der Text am Anfang und Ende des Files gehört nicht zum Buch und soll ignoriert werden. | ||
| Kontrolle: am häufigsten vorkommen sollte $E$ (gut $15\%$), gefolgt von $N$ (ca. $10\%$) und $S$. Die letzten Ränge machen typischerweise $Y$, $Q$ und $X$ unter sich aus. | Kontrolle: am häufigsten vorkommen sollte $E$ (gut $15\%$), gefolgt von $N$ (ca. $10\%$) und $S$. Die letzten Ränge machen typischerweise $Y$, $Q$ und $X$ unter sich aus. | ||
| - | < | + | < |
| ++++Lösung mit Gutenberg| | ++++Lösung mit Gutenberg| | ||
| <code python> | <code python> | ||
| # Rest as above. | # Rest as above. | ||
| - | # Trick: urlopen() returns a file-like object, which iterates over lines of text | + | from urllib.request |
| - | # itertools.chain.from_iterable() will create an iterator that takes those lines | + | |
| - | # and iterates over each of them (creating an iterator over the characters of the | + | faust = urlopen(' |
| - | # entire book). | + | s= faust.read().decode(' |
| - | + | print_percentages(count_letters(s)) | |
| - | # Caution: this solution will not properly decode UTF-8 characters. | + | |
| - | + | ||
| - | import | + | |
| - | import itertools | + | |
| - | + | ||
| - | faust = urllib2.urlopen(' | + | |
| - | print_percentages(count_letters(itertools.chain.from_iterable(faust))) | + | |
| </ | </ | ||
| ++++ | ++++ | ||