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 [2025-03-11 12:51] – [Aufgabe C2] 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 | ||
Zeile 115: | 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 134: | Zeile 138: | ||
++++ | ++++ | ||
- | < | + | < |
++++Mehr Tipps| | ++++Mehr Tipps| | ||
<code python> | <code python> | ||
Zeile 159: | Zeile 163: | ||
</ | </ | ||
- | < | + | < |
++++Lösung| | ++++Lösung| | ||
<code python> | <code python> | ||
Zeile 252: | Zeile 256: | ||
``` | ``` | ||
++++ | ++++ | ||
- | < | + | < |
++++Python Lösung| | ++++Python Lösung| | ||
<code python> | <code python> | ||
Zeile 265: | Zeile 269: | ||
return text | return text | ||
| | ||
- | |||
def count_letters(text): | def count_letters(text): | ||
""" | """ | ||
Zeile 310: | Zeile 313: | ||
<code python> | <code python> | ||
from urllib.request import urlopen | from urllib.request import urlopen | ||
- | import itertools | ||
count = 0 | count = 0 | ||
- | data = faust = urlopen(< | + | data = urlopen(< |
- | for line in data.readlines(): | + | text = data.read().decode(' |
- | line = line.decode(' | + | |
- | line = line.replace(' | + | |
- | if 10 <= count <= 20: | + | |
- | print(line) # Achtung: keine gute Idee, wenn File sehr viele Zeilen beinhaltet! Baue z.B. Counter ein, damit nach z.B. 100 Ausgaben abbricht | + | |
- | count += 1 | + | |
</ | </ | ||
- | |||
- | 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 | ||
- | # 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 | ||
- | # entire book). | ||
- | |||
from urllib.request import urlopen | from urllib.request import urlopen | ||
- | import itertools | ||
faust = urlopen(' | faust = urlopen(' | ||
s= faust.read().decode(' | s= faust.read().decode(' | ||
- | print(s) | + | print_percentages(count_letters(s)) |
- | + | ||
- | print_percentages(count_letters(itertools.chain.from_iterable(s))) | + | |
</ | </ | ||
++++ | ++++ |