Lernziele
Prüfungsrelevant ist alles, was in den Lektionen und Übungen behandelt wurde. Die Lernziele unten dienen als Gradmesser und sind nicht unbedingt komplett.
Inhaltliche Lernziele:
Wichtigste Programmierskills:
Slides Verschlüsselung
Bei der Caesar-Verschlüsselung werden alle Buchstaben um eine Anzahl Stellen verrückt. Im folgenden Beispiel wird jeder Buchstabe um drei Stellen nach hinten gerückt ($n=3$):
Der römische Feldherr Gaius Julius Caesar soll diese Art der Verschlüsselung für militärische Kommunikation verwendet haben. Um von Hand eine solche Nachricht zu entziffern, kann man eine Chiffrierscheibe verwenden:
Aufgabe A1
Schreibe eine Funktion encryption_caesar(cleartext,n)
, die einen Klartext (cleartext) mithilfe der Caesar-Verschlüsselung in einen Geheimtext (ciphertext) umwandelt. Alle Buchstaben werden um $n$ Stellen im Alphabet nach hinten verschoben.
Hier ein paar Tipps:
# Option 1: Liste
ALPHABET = ['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']
ALPHABET.index('T') # finde Position von Symbol
ALPHABET[12] # Element an angegebener Position
# Option 2: String
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
ALPHABET.index('Z') # finde Position von Symbol
ALPHABET.find('Z') # finde Position von Symbol
ALPHABET[12] # Symbol an angegebener Position
# beachte: Für Strings kann man index oder find verwenden. Unterschied: Sucht man nach einem Zeichen, welches nicht in ALPHABET vorkommen, gibt find -1 zurück und index gibt einen Fehler aus.
Tipps
Versuche, die Aufgabe möglichst ohne diese Schritt-für-Schritt Tipps zu lösen.
Erstelle einen leeren String für das verschlüsselte Wort, nenne diesen z.B. cipher
oder ciphertext
Gehe Liste/String Symbol-für-Symbol durch
Finde heraus, an welcher Stelle in der Liste/im String dieses vorkommt
Addiere die Zahl $n$ hinzu.
Stelle sicher, dass diese Zahl nicht zu gross ist. Stichwort: Modulo-Operator
Finde das Symbol an dieser Stelle …
… und füge es dem verschlüsselten Wort hinzu.
Gebe dieses zurück.
Passe Code so an, dass Symbole, die nicht in Liste/String vorkommen (z.B. „;“), unverschlüsselt zum verschlüsselten Wort hinzugefügt werden.
Aufgabe A2
a)
Die folgende Nachricht ist mit der Caesar-Verschlüsslung verschlüsselt, indem alle Buchstaben um $17$ Stellen nach hinten verschoben wurden: „ZEWFIDRKZB ZJK JLGVI!“
Was bedeutet die Nachricht?
b)
Nutze deinen Code, um die folgende Nachricht zu knacken: „VLYET CZXLYDSZCY, OTP TYYZGLETGP DNSFWP TX RCFPYPY.“
Tipp
Probiere alle möglichen Verschiebungen aus. Am einfachsten geht dies mit einer …!
Zusatzaufgabe
Die Caesar-Verschlüsselung ist nicht sehr sicher. Überlege dir selbst (ohne googlen oder im Wiki weiter unten nachzusehen) eine besser Verschlüsslungsmethode. Bespreche deine Idee mit deiner Lehrperson und setze diese in einem Code um.
Bei der Caesar-Verschlüsselung werden alle Buchstaben des Klartextes um die gleiche Anzahl Stellen $n$ verschoben. Eine so verschlüsselte Nachricht ist extrem zu entschlüsseln, auch wenn man den Schlüssel (sprich die Zahl $n$) nicht kennt. Daher gibt es 'Weiterentwicklungen', der Caesar-Verschlüsselung. Die Buchstaben des Klartextes werden nach wie vor verschoben, aber nicht immer um die gleiche Anzahl Stellen:
Vigenère-Verschlüsselung
Verwendung eines Schlüsselwortes, wessen Buchstaben angeben, um wie viele Stellen verschoben werden soll:
Jeder Buchstabe im Passwort steht für eine Verschiebung. Beispiel: Klartext „INFORMATIK“ wird mit Passwort „ABED“ verschlüsselt:
Klartext | Verschiebung | Geheimtext |
I | 1 (A) | J |
N | 2 (B) | P |
F | 5 (E) | K |
O | 4 (D) | S |
R | 1 (A) | S |
M | 2 (B) | O |
A | 5 (E) | F |
T | 4 (D) | X |
I | 1 (A) | J |
K | 2 (B) | M |
Monoalphabetische Verschlüsselung
Bei der monoalphabetischen Verschlüsselung wird das das gesamte Alphabet durchmischt. Aus „ABCDEFGHIJKLMNOPQRSTUVWXYZ“ wird dann zum Beispiel
„UELXBICNYAZJSQORTPKFMGVHWD“ oder „VSEIYHJTBUPANRCOQDLXFWKMZG“. Diese neu sortierte Version dient als Schlüssel und wird benötigt, um die Nachricht zu entziffern. Man muss also darauf achten, dass dieser nicht in feindliche Hände gelangt.
Für mehr Info, siehe Slides (am Anfang der Seite).
Tipp: Falls du die Aufgaben mit der Tastatur auf OneNote lösen möchtest, lohnt es sich, eine Monospace-Schriftart zu wählen, also eine, bei der alle Buchstaben genau gleich breit sind. Dies ist v.a. dann sehr nützlich, wenn man Wörter direkt untereinander schreiben will. Verwende dazu eine der beiden Schriftarten Courier oder Courier New.
Aufgabe B1
Verschlüssle von Hand:
Vigenère: Klartext „INFORMATIK“, Schlüssel: „ACDC“
Monoalphabetische Verschlüsselung: Klartext „THURGAU“, Schlüssel: „LBCNKJMFPYHAEODZTURGVQIWXS“
Aufgabe B2
Entschlüssle nun von Hand. Hier muss man bedenken, dass man den Verschlüsselungsprozess umkehren muss.
Vigenère: Geheimtext: „UUBIMFVYJ“, Schlüssel: „BEA“
Monoalphabetische Verschlüsselung: Geheimtext: „LPOEVGCX“, Schlüssel: „NULICHBWZTQFOAPEMXDGVSRYJK“
Aufgabe B3
Ist die Caesar-Verschlüsselung auch eine monoalphabetische Verschlüsselung?
Wie viele Möglichkeiten gibt es, eine Nachricht mit der Caesar-Verschlüsselung zu verschlüsseln? Es sollen nur die $26$-Standardbuchstaben des Alphabets verschlüsselt werden.
Wie viele Möglichkeiten gibt es für die monoalphabtische Verschlüsselung? (wieder mit $26$ Buchstaben).
Wie schätzt du die Sicherheit der monoalphabetische Verschlüsselung ein? Welche Möglichkeiten gibt es, um eine damit verschlüsselte Nachricht zu entziffern?
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, eine solche zu entziffern?
Aufgabe B4 - Code monoalphabetische Verschlüsselung
Die Nachricht „RYDDUYKFXUKEBKFBBKKBQXBPVBJF“ wurde mit dem Schlüssel „UELXBICNYAZJSQORTPKFMGVHWD“ verschlüsselt. Schreibe ein Programm, mit welchem du die Nachricht im Klartext ermitteln kannst.
Tipps
Gehe Buchstaben um Buchstaben durch die Nachricht.
Ermittle die Position von diesem Buchstaben im durchmischten Alphabet (Schlüssel).
Dieser Buchstabe gehört zum Buchstaben im normalen Alphabet an dieser Stelle.
Aufgabe B5
Wie sicher ist die Vigenère-Verschlüsselung? Wie kann man versuchen, eine mit Vigenère verschlüsselte Nachricht zu entschlüsseln, ohne dass man den Schlüssel kennt? Unter welchen Bedingungen ist dies möglich, unter welchen nicht?
Aufgabe B6: Code Vigenère
Implementiere die Vigenère-Verschlüsslung:
Speichere in einer Variablen cleartext
die Nachricht im Klartext. Speichere in einer Variablen key
das Schlüsselwort. Bestimme nun den zugehörigen Geheimtext (→ ciphertext
).
Erstelle nun eine Funktion encryption_vigenere(cleartext,key)
, die den Klartext und den Key entgegen nimmt und den entsprechenden Geheimtext zurückgibt. Verwende dazu deinen Code aus 1.
Zusatzaufgaben
Morsen
Geheimschriften sind auch eine Art der Verschlüsselung. Schreibe ein Programm, welches eine Klartext-Nachricht ins Morse-Alphabet übersetzt und umgekehrt: cleartext_to_morsecode(cleartext)
und morsecode_to_cleartext(morsecode)
. Die zu Nachrichten cleartext
und morsecode
sollen jeweils als String (und nicht Liste) der Funktion übergeben werden. Es kann aber durchaus Sinn machen, den String in der Funktion drin in eine Liste umzuwandeln (siehe falls nötig Tipps unten).
Morse-Alphabet und Tipps
ALPHABET = ['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', '(', ')', '-', '.', '/', '0', '1', '2', '3', '4', ', ', '5', '6', '7', '8', '9', '?']
MORSE = ['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..', '-.--.', '-.--.-', '-....-', '.-.-.-', '-..-.', '-----', '.----', '..---', '...--', '....-', '--..--', '.....', '-....', '--...', '---..', '----.', '..--..']
Tipps:
Morsen 2
Freimaurer-Alphabet
Ist die verschlüsselte Nachricht lange genug, kann man eine Häufigkeitsanalyse durchführen. In der deutschen Sprache kommt der Buchstabe „E“ mit gut $16\%$ eindeutig am häufigsten vor. Kommt also in der verschlüsselten Nachricht der Buchstabe „Q“ am häufigsten vor, können wir davon ausgehen, dass es sich bei diesem eigentlich um ein „E“ handelt. Mit dieser Methode kann man zumindest einmal die häufigsten paar Buchstaben richtig bestimmen. Bei den weniger häufigen Buchstaben wird die Reihenfolge dann wohl nicht mehr ganz stimmen. Mit ein paar cleveren Vermutungen, kann man dies aber relativ einfach korrigieren. Kommt zum Beispiel im verschlüsselten Text häufig das Wort „HIE“ vor, dürfte es sich beim „H“ um wohl um ein „D“ handeln. Ein „S“ wäre auch eine Möglichkeit, aber da „S“ der dritthäufigste Buchstabe ist, wurde dieser wohl bereits korrekt erkannt. Dabei hilft es zu wissen, welche Wörter besonders oft vorkommen: Liste der häufigsten Wörter der deutschen Sprache
Häufigkeitsanalyse Buchstaben in der deutschen Sprache:
Buchstaben | Häufigkeit |
E | 16.93% |
N | 10.53% |
I | 8.02% |
R | 6.89% |
S | 6.79% |
A | 6.12% |
T | 5.79% |
D | 4.98% |
H | 4.98% |
U | 4.48% |
L | 3.6% |
C | 3.16% |
G | 3.02% |
M | 2.55% |
O | 2.54% |
B | 1.96% |
W | 1.78% |
F | 1.49% |
K | 1.32% |
Z | 1.21% |
V | 0.84% |
P | 0.67% |
J | 0.24% |
X | 0.05% |
Y | 0.05% |
Q | 0.02% |
Beachte: Je nach Quelle variieren die genauen Werte. Die Analyse hängt natürlich davon ab, welche Texte man für die Analyse verwendet. Die grobe Reihenfolge ist aber immer gleich.
Aufgabe C1
Der folgende Geheimtext wurde mit einer monoalphabetischen Verschlüsselung verschlüsselt ($26$ Grossbuchstaben, Zahlen und Sonderzeichen wurden unverschlüsselt übernommen):
Geheimtext:
QULSHLYYKXOET DHJULYXHDL. ETPSIPER. ZDUUJITE. RUY ETPSIPER FHDJOEPTDS RPT BTYTLSEPKXTL VDOLRBTDST RTY NOYUJJTLETITLY OLR RTY VTJTPLYUJTL UDITPSTLY. TY VPIS OLY HDPTLSPTDOLV OLR TPLTL ITNOVYDUXJTL FOD RTL YKXOEUEESUV. RUY ETPSIPER PYS HFFTL FOD GTDULRTDOLVTL OLR YKXOEPYKXT TLSBPKQEOLVTL. 1. JTLYKXTLIPER. BPD IPERTL TPLT YKXOEVTJTPLYKXUFS, UL RTD BPD YTEIYS VTDLT STPEXUITL. BPD YSTEETL RTL JTLYKXTL OLR RPT TLSBPKQEOLV YTPLTD ZHSTLSPUET PLY NTLSDOJ. 2. IPEROLVYGTDYSULRLPY. TPLT OJFUYYTLRT UEEVTJTPLIPEROLV HFFLTS SODTL FOD RPT NOQOLFS. YPT ITDTPSTS UOF ULYZDOKXY- OLR GTDULSBHDSOLVYGHEET UOFVUITL PL RTD VTYTEEYKXUFS GHD OLR PYS GHDUOYYTSNOLV FOD RPT YSORPTDFUXPVQTPS. BPD YPLR LTOVPTDPV, PLSTDTYYPTDS OLR HFFTL. BPD FHDRTDL QDPSPYKXTY RTLQTL OLR QDTUSPGPSUS. BPD TDJHVEPKXTL TPLT GPTEFUESPVT IPEROLV RODKX XTDUOYFHDRTDLRT, FUKXTDYZTNPFPYKXT OLR PLSTDRPYNPZEPLUDT FDUVTYSTEEOLVTL. 3. OLSTDDPKXS OLR ETPYSOLV. BPD FHDRTDL ETPYSOLV OLR TLVUVTJTLS. FHDRTDOLV XUS FHDRTDOLV NOJ NPTE. BPD QHJJOLPNPTDTL OLYTDT NPTET OLR GTDFHEVTL RPTYT PL TPLTD GPTEFUESPVTL ETXD- OLR ETDLOJVTIOLV. BPD IPTSTL DUOJ, RTL BTV NOD NPTETDDTPKXOLV JPSNOVTYSUESTL. 4. VTJTPLYKXUFS OLR QHJJOLPQUSPHL. BPD VTXTL UOFTPLULRTD NO OLR LTXJTL TPLULRTD TDLYS. BPD VTXTL DTYZTQSGHEE OLR BTDSYKXUSNTLR JPSTPLULRTD OJ. BPD ZFETVTL TPLT QHLYSDOQSPGT RPYQOYYPHLYQOESOD. BPD OLSTDYSOSNTL TPLULRTD PL RTD SUVEPKXTL UDITPS OLR OITDLTXJTL GTDULSBHDSOLV PL RTD VTJTPLYKXUFS. BPD ZFETVTL OLR FHDRTDL RPT VTJTPLYKXUFS OLR BPD VTYSUESTL VTJTPLYUJT ULEUYYT. BPD SDUVTL YHDVT NO OLYTDTD VTYOLRXTPS OLR OLYTDTD OJBTES. 5. TLSBPKQEOLV OLR PLLHGUSPHL. BPD FHDRTDL TLSBPKQEOLV OLR PLLHGUSPHL, RPT OLYTDTJ IPEROLVYGTDYSULRLPY TLSYZDTKXTL. ITBUXDSTY TLSBPKQTEL BPD BTPSTD. BPD OITDZDOFTL OLR YPKXTDL RPT MOUEPSUS DTVTEJUYYPV. BPD ETDLTL UOY TDFHEVTL OLR JPYYTDFHEVTL VETPKXTDJUYYTL. 6. HFFTLSEPKXQTPS. BPD ULUEWYPTDTL VTYTEEYKXUFSEPKXT TLSBPKQEOLVTL OLR ITNPTXTL RPTYT PL OLYTDT TLSYKXTPROLVTL JPS TPL. BPD YKXUFFTL VTETVTLXTPSTL FOD ITVTVLOLVTL, IPEROLV OLR QOESOD. BPD VTXTL ZUDSLTDYKXUFSTL OLR QHHZTDUSPHLTL TPL. BPD YPLR IHSYKXUFSTDPLLTL OLR IHSYKXUFSTD OLYTDTD YKXOET. RUY ETPSIPER BODRT PJ YKXOECUXD 2017/18 GHL ETXDZTDYHLTL, YKXOETDPLLTL OLR YKXOETDL, ULVTYSTEESTL OLR RTD YKXOEETPSOLV TDUDITPSTS.
Auftrag: Knacke den verschlüsselten Text oben mithilfe der Häufigkeitsanalyse.
Ergebnis der Häufigkeitsanalyse des verschlüsselten Textes (Geheimtext)
Buchstabe | Häufigkeit |
T | 15.68% |
L | 12.31% |
P | 8.57% |
D | 7.79% |
O | 6.37% |
Y | 5.89% |
S | 5.79% |
R | 4.79% |
E | 4.73% |
U | 4.21% |
V | 3.84% |
X | 3.0% |
F | 2.58% |
K | 2.37% |
H | 2.31% |
B | 2.1% |
J | 2.1% |
I | 1.63% |
Q | 1.21% |
N | 1.0% |
G | 0.89% |
Z | 0.68% |
C | 0.05% |
M | 0.05% |
W | 0.05% |
A | 0.0% |
Tipps:
Die Häufigkeitsanalyse für die deutsche Sprache findest du am Anfang der Aufgabenserie
Ersetze im Geheimtext der Reihe nach ein Buchstaben mit einem anderen. Durch welchen Buchstaben sollte man das 'T' ersetzen?
Verwende Kleinbuchstaben beim ersetzen, damit man unterscheiden kann zwischen verschlüsselten Buchstaben (Gross) und hoffentlich korrekt entschlüsselten Buchstaben (klein).
Verwende z.B. die Funktion replace
, um Buchstaben zu ersetzen (siehe Beispiel unten).
geheimtext = geheimtext.replace('X','g') # ersetzt alle grossen X durch kleine g
Aufgabe C1.5
Schreibe einen Code, um die folgenden Fragen zu beantworten:
Wie oft kommt im Text faust
(siehe unten) der Buchstabe 'E'
vor?
Wie viele Buchstaben gibt es insgesamt darin? Sonderzeichen wie ' ','.','!'
usw. sollen nicht gezählt werden.
Berechne die Häufigkeit des Buchstabens 'E' in diesem Text. Verwende dazu die Resultate aus 1. & 2.
Text Faust
faust = 'HABE NUN, ACH! PHILOSOPHIE, JURISTEREI UND MEDIZIN, UND LEIDER AUCH THEOLOGIE DURCHAUS STUDIERT, MIT HEISSEM BEMUHN. DA STEH ICH NUN, ICH ARMER TOR! UND BIN SO KLUG ALS WIE ZUVOR; HEISSE MAGISTER, HEISSE DOKTOR GAR UND ZIEHE SCHON AN DIE ZEHEN JAHR HERAUF, HERAB UND QUER UND KRUMM MEINE SCHULER AN DER NASE HERUM UND SEHE, DASS WIR NICHTS WISSEN KONNEN! DAS WILL MIR SCHIER DAS HERZ VERBRENNEN. ZWAR BIN ICH GESCHEITER ALS ALL DIE LAFFEN, DOKTOREN, MAGISTER, SCHREIBER UND PFAFFEN; MICH PLAGEN KEINE SKRUPEL NOCH ZWEIFEL, FURCHTE MICH WEDER VOR HOLLE NOCH TEUFEL DAFUR IST MIR AUCH ALLE FREUD ENTRISSEN, BILDE MIR NICHT EIN, WAS RECHTS ZU WISSEN, BILDE MIR NICHT EIN, ICH KONNTE WAS LEHREN, DIE MENSCHEN ZU BESSERN UND ZU BEKEHREN. AUCH HAB ICH WEDER GUT NOCH GELD, NOCH EHR UND HERRLICHKEIT DER WELT; ES MOCHTE KEIN HUND SO LANGER LEBEN! DRUM HAB ICH MICH DER MAGIE ERGEBEN, OB MIR DURCH GEISTES KRAFT UND MUND NICHT MANCH GEHEIMNIS WURDE KUND; DASS ICH NICHT MEHR MIT SAUREM SCHWEISS ZU SAGEN BRAUCHE, WAS ICH NICHT WEISS; DASS ICH ERKENNE, WAS DIE WELT IM INNERSTEN ZUSAMMENHALT, SCHAU ALLE WIRKENSKRAFT UND SAMEN, UND TU NICHT MEHR IN WORTEN KRAMEN. O SAHST DU, VOLLER MONDENSCHEIN, ZUM LETZTENMAL AUF MEINE PEIN, DEN ICH SO MANCHE MITTERNACHT AN DIESEM PULT HERANGEWACHT. DANN UBER BUCHERN UND PAPIER, TRUBSELGER FREUND, ERSCHIENST DU MIR! ACH! KONNT ICH DOCH AUF BERGESHOHN IN DEINEM LIEBEN LICHTE GEHN, UM BERGESHOHLE MIT GEISTERN SCHWEBEN, AUF WIESEN IN DEINEM DAMMER WEBEN, VON ALLEM WISSENSQUALM ENTLADEN, IN DEINEM TAU GESUND MICH BADEN!WEH! STECK ICH IN DEM KERKER NOCH? VERFLUCHTES DUMPFES MAUERLOCH, WO SELBST DAS LIEBE HIMMELSLICHT TRUB DURCH GEMALTE SCHEIBEN BRICHT! BESCHRANKT MIT DIESEM BUCHERHAUF, DEN WURME NAGEN, STAUB BEDECKT, DEN BIS ANS HOHE GEWOLB HINAUF EIN ANGERAUCHT PAPIER UMSTECKT; MIT GLASERN, BUCHSEN RINGS UMSTELLT, MIT INSTRUMENTEN VOLLGEPFROPFT, URVATER HAUSRAT DREIN GESTOPFT DAS IST DEINE WELT! DAS HEISST EINE WELT!UND FRAGST DU NOCH, WARUM DEIN HERZ SICH BANG IN DEINEM BUSEN KLEMMT? WARUM EIN UNERKLARTER SCHMERZ DIR ALLE LEBENSREGUNG HEMMT? STATT DER LEBENDIGEN NATUR, DA GOTT DIE MENSCHEN SCHUF HINEIN, UMGIBT IN RAUCH UND MODER NUR DICH TIERGERIPP UND TOTENBEIN.FLIEH! AUF! HINAUS INS WEITE LAND! UND DIES GEHEIMNISVOLLE BUCH, VON NOSTRADAMUS EIGNER HAND, IST DIR ES NICHT GELEIT GENUG? ERKENNEST DANN DER STERNE LAUF, UND WENN NATUR DICH UNTERWEIST, DANN GEHT DIE SEELENKRAFT DIR AUF, WIE SPRICHT EIN GEIST ZUM ANDREN GEIST. UMSONST, DASS TROCKNES SINNEN HIER DIE HEILGEN ZEICHEN DIR ERKLART. IHR SCHWEBT, IHR GEISTER, NEBEN MIR; ANTWORTET MIR, WENN IHR MICH HORT! (ER SCHLAGT DAS BUCH AUF UND ERBLICKT DAS ZEICHEN DES MAKROKOSMUS.)HA! WELCHE WONNE FLIESST IN DIESEM BLICK AUF EINMAL MIR DURCH ALLE MEINE SINNEN! ICH FUHLE JUNGES, HEILGES LEBENSGLUCK NEUGLUHEND MIR DURCH NERV UND ADERN RINNEN. WAR ES EIN GOTT, DER DIESE ZEICHEN SCHRIEB, DIE MIR DAS INNRE TOBEN STILLEN, DAS ARME HERZ MIT FREUDE FULLEN, UND MIT GEHEIMNISVOLLEM TRIEB DIE KRAFTE DER NATUR RINGS UM MICH HER ENTHULLEN? BIN ICH EIN GOTT? MIR WIRD SO LICHT! ICH SCHAU IN DIESEN REINEN ZUGEN DIE WIRKENDE NATUR VOR MEINER SEELE LIEGEN. JETZT ERST ERKENN ICH, WAS DER WEISE SPRICHT. "DIE GEISTERWELT IST NICHT VERSCHLOSSEN; DEIN SINN IST ZU, DEIN HERZ IST TOT! AUF, BADE, SCHULER, UNVERDROSSEN DIE IRDSCHE BRUST IM MORGENROT!" (ER BESCHAUT DAS ZEICHEN.) WIE ALLES SICH ZUM GANZEN WEBT, EINS IN DEM ANDERN WIRKT UND LEBT! WIE HIMMELSKRAFTE AUF UND NIEDER STEIGEN UND SICH DIE GOLDNEN EIMER REICHEN! MIT SEGENDUFTENDEN SCHWINGEN VOM HIMMEL DURCH DIE ERDE DRINGEN, HARMONISCH ALL DAS ALL DURCHKLINGEN! WELCH SCHAUSPIEL! ABER ACH! EIN SCHAUSPIEL NUR! WO FASS ICH DICH, UNENDLICHE NATUR? EUCH BRUSTE, WO? IHR QUELLEN ALLES LEBENS, AN DENEN HIMMEL UND ERDE HANGT, DAHIN DIE WELKE BRUST SICH DRANGT IHR QUELLT, IHR TRANKT, UND SCHMACHT ICH SO VERGEBENS? (ER SCHLAGT UNWILLIG DAS BUCH UM UND ERBLICKT DAS ZEICHEN DES ERDGEISTES.) WIE ANDERS WIRKT DIES ZEICHEN AUF MICH EIN! DU, GEIST DER ERDE, BIST MIR NAHER; SCHON FUHL ICH MEINE KRAFTE HOHER, SCHON GLUH ICH WIE VON NEUEM WEIN. ICH FUHLE MUT, MICH IN DIE WELT ZU WAGEN, DER ERDE WEH, DER ERDE GLUCK ZU TRAGEN, MIT STURMEN MICH HERUMZUSCHLAGEN UND IN DES SCHIFFBRUCHS KNIRSCHEN NICHT ZU ZAGEN. ES WOLKT SICH UBER MIR DER MOND VERBIRGT SEIN LICHT DIE LAMPE SCHWINDET! ES DAMPFT! ES ZUCKEN ROTE STRAHLEN MIR UM DAS HAUPTES WEHT EIN SCHAUER VOM GEWOLB HERAB UND FASST MICH AN! ICH FUHLS, DU SCHWEBST UM MICH, ERFLEHTER GEIST ENTHULLE DICH! HA! WIES IN MEINEM HERZEN REISST! ZU NEUEN GEFUHLEN ALL MEINE SINNEN SICH ERWUHLEN! ICH FUHLE GANZ MEIN HERZ DIR HINGEGEBEN! DU MUSST! DU MUSST! UND KOSTET ES MEIN LEBEN! (ER FASST DAS BUCH UND SPRICHT DAS ZEICHEN DES GEISTES GEHEIMNISVOLL AUS. ES ZUCKT EINE ROTLICHE FLAMME, DER GEIST ERSCHEINT IN DER FLAMME.)'
Tipps allgemein
Tipp Aufgabe 1 (Teil I: Schleife)
Gehe Text Symbol für Symbol durch:
for symbol in faust:
....
Tipp Aufgabe 1 (Teil II: Korrektes Symbol?)
Überprüfe Symbol in Schleife drin
if symbol == 'E':
...
Tipp Aufgabe 1 (Teil III: Counter erhöhen)
Erhöhe Counter
counter_E = 0 # auf Startwert setzen
...
counter_E = counter_E + 1 # um 1 erhöhen
Tipp Aufgabe 2 (Teil I: Schleife)
Gehe jeden Buchstaben des Textes in Schleife durch, wie in Lsg 1
Tipp Aufgabe 2 (Teil II: Symbol in Alphabet?)
Überprüfe, ob Symbol in Alphabet vorkommt:
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
...
if symbol in alphabet:
...
Tipp Aufgabe 2 (Teil III: Counter)
Erstelle wieder Counter (wie in Lsg 1), diesmal sollen aber nicht die Anzahl 'E', sondern die Anzahl Buchstaben (Symbole, die in Alphabet vorkommen) gezählt werden. Nenne z.B. counter_buchstaben
.
Lösung
Anzahl E: 580
Anzahl Buchstaben: 3846
Häufigkeit E: 15.080603224128966%
Aufgabe C2
Führe nun selbst eine Häufigkeitsanalyse von einem Text durch. Wähle dafür eine der beiden Optionen.
Option 1: Häufigkeitsanalyse von einzelnem, bereits vorbereitetem String (einfach)
Führe eine Häufigkeitsanalyse des Textes unten (Ausschnitt aus Goethes Faust). Der Text wurde bereits vorbereitet: Kleinbuchstaben durch Grossbuchstaben ersetzt, Umlaute ersetzt, …
Text Faust
faust = 'HABE NUN, ACH! PHILOSOPHIE, JURISTEREI UND MEDIZIN, UND LEIDER AUCH THEOLOGIE DURCHAUS STUDIERT, MIT HEISSEM BEMUHN. DA STEH ICH NUN, ICH ARMER TOR! UND BIN SO KLUG ALS WIE ZUVOR; HEISSE MAGISTER, HEISSE DOKTOR GAR UND ZIEHE SCHON AN DIE ZEHEN JAHR HERAUF, HERAB UND QUER UND KRUMM MEINE SCHULER AN DER NASE HERUM UND SEHE, DASS WIR NICHTS WISSEN KONNEN! DAS WILL MIR SCHIER DAS HERZ VERBRENNEN. ZWAR BIN ICH GESCHEITER ALS ALL DIE LAFFEN, DOKTOREN, MAGISTER, SCHREIBER UND PFAFFEN; MICH PLAGEN KEINE SKRUPEL NOCH ZWEIFEL, FURCHTE MICH WEDER VOR HOLLE NOCH TEUFEL DAFUR IST MIR AUCH ALLE FREUD ENTRISSEN, BILDE MIR NICHT EIN, WAS RECHTS ZU WISSEN, BILDE MIR NICHT EIN, ICH KONNTE WAS LEHREN, DIE MENSCHEN ZU BESSERN UND ZU BEKEHREN. AUCH HAB ICH WEDER GUT NOCH GELD, NOCH EHR UND HERRLICHKEIT DER WELT; ES MOCHTE KEIN HUND SO LANGER LEBEN! DRUM HAB ICH MICH DER MAGIE ERGEBEN, OB MIR DURCH GEISTES KRAFT UND MUND NICHT MANCH GEHEIMNIS WURDE KUND; DASS ICH NICHT MEHR MIT SAUREM SCHWEISS ZU SAGEN BRAUCHE, WAS ICH NICHT WEISS; DASS ICH ERKENNE, WAS DIE WELT IM INNERSTEN ZUSAMMENHALT, SCHAU ALLE WIRKENSKRAFT UND SAMEN, UND TU NICHT MEHR IN WORTEN KRAMEN. O SAHST DU, VOLLER MONDENSCHEIN, ZUM LETZTENMAL AUF MEINE PEIN, DEN ICH SO MANCHE MITTERNACHT AN DIESEM PULT HERANGEWACHT. DANN UBER BUCHERN UND PAPIER, TRUBSELGER FREUND, ERSCHIENST DU MIR! ACH! KONNT ICH DOCH AUF BERGESHOHN IN DEINEM LIEBEN LICHTE GEHN, UM BERGESHOHLE MIT GEISTERN SCHWEBEN, AUF WIESEN IN DEINEM DAMMER WEBEN, VON ALLEM WISSENSQUALM ENTLADEN, IN DEINEM TAU GESUND MICH BADEN!WEH! STECK ICH IN DEM KERKER NOCH? VERFLUCHTES DUMPFES MAUERLOCH, WO SELBST DAS LIEBE HIMMELSLICHT TRUB DURCH GEMALTE SCHEIBEN BRICHT! BESCHRANKT MIT DIESEM BUCHERHAUF, DEN WURME NAGEN, STAUB BEDECKT, DEN BIS ANS HOHE GEWOLB HINAUF EIN ANGERAUCHT PAPIER UMSTECKT; MIT GLASERN, BUCHSEN RINGS UMSTELLT, MIT INSTRUMENTEN VOLLGEPFROPFT, URVATER HAUSRAT DREIN GESTOPFT DAS IST DEINE WELT! DAS HEISST EINE WELT!UND FRAGST DU NOCH, WARUM DEIN HERZ SICH BANG IN DEINEM BUSEN KLEMMT? WARUM EIN UNERKLARTER SCHMERZ DIR ALLE LEBENSREGUNG HEMMT? STATT DER LEBENDIGEN NATUR, DA GOTT DIE MENSCHEN SCHUF HINEIN, UMGIBT IN RAUCH UND MODER NUR DICH TIERGERIPP UND TOTENBEIN.FLIEH! AUF! HINAUS INS WEITE LAND! UND DIES GEHEIMNISVOLLE BUCH, VON NOSTRADAMUS EIGNER HAND, IST DIR ES NICHT GELEIT GENUG? ERKENNEST DANN DER STERNE LAUF, UND WENN NATUR DICH UNTERWEIST, DANN GEHT DIE SEELENKRAFT DIR AUF, WIE SPRICHT EIN GEIST ZUM ANDREN GEIST. UMSONST, DASS TROCKNES SINNEN HIER DIE HEILGEN ZEICHEN DIR ERKLART. IHR SCHWEBT, IHR GEISTER, NEBEN MIR; ANTWORTET MIR, WENN IHR MICH HORT! (ER SCHLAGT DAS BUCH AUF UND ERBLICKT DAS ZEICHEN DES MAKROKOSMUS.)HA! WELCHE WONNE FLIESST IN DIESEM BLICK AUF EINMAL MIR DURCH ALLE MEINE SINNEN! ICH FUHLE JUNGES, HEILGES LEBENSGLUCK NEUGLUHEND MIR DURCH NERV UND ADERN RINNEN. WAR ES EIN GOTT, DER DIESE ZEICHEN SCHRIEB, DIE MIR DAS INNRE TOBEN STILLEN, DAS ARME HERZ MIT FREUDE FULLEN, UND MIT GEHEIMNISVOLLEM TRIEB DIE KRAFTE DER NATUR RINGS UM MICH HER ENTHULLEN? BIN ICH EIN GOTT? MIR WIRD SO LICHT! ICH SCHAU IN DIESEN REINEN ZUGEN DIE WIRKENDE NATUR VOR MEINER SEELE LIEGEN. JETZT ERST ERKENN ICH, WAS DER WEISE SPRICHT. "DIE GEISTERWELT IST NICHT VERSCHLOSSEN; DEIN SINN IST ZU, DEIN HERZ IST TOT! AUF, BADE, SCHULER, UNVERDROSSEN DIE IRDSCHE BRUST IM MORGENROT!" (ER BESCHAUT DAS ZEICHEN.) WIE ALLES SICH ZUM GANZEN WEBT, EINS IN DEM ANDERN WIRKT UND LEBT! WIE HIMMELSKRAFTE AUF UND NIEDER STEIGEN UND SICH DIE GOLDNEN EIMER REICHEN! MIT SEGENDUFTENDEN SCHWINGEN VOM HIMMEL DURCH DIE ERDE DRINGEN, HARMONISCH ALL DAS ALL DURCHKLINGEN! WELCH SCHAUSPIEL! ABER ACH! EIN SCHAUSPIEL NUR! WO FASS ICH DICH, UNENDLICHE NATUR? EUCH BRUSTE, WO? IHR QUELLEN ALLES LEBENS, AN DENEN HIMMEL UND ERDE HANGT, DAHIN DIE WELKE BRUST SICH DRANGT IHR QUELLT, IHR TRANKT, UND SCHMACHT ICH SO VERGEBENS? (ER SCHLAGT UNWILLIG DAS BUCH UM UND ERBLICKT DAS ZEICHEN DES ERDGEISTES.) WIE ANDERS WIRKT DIES ZEICHEN AUF MICH EIN! DU, GEIST DER ERDE, BIST MIR NAHER; SCHON FUHL ICH MEINE KRAFTE HOHER, SCHON GLUH ICH WIE VON NEUEM WEIN. ICH FUHLE MUT, MICH IN DIE WELT ZU WAGEN, DER ERDE WEH, DER ERDE GLUCK ZU TRAGEN, MIT STURMEN MICH HERUMZUSCHLAGEN UND IN DES SCHIFFBRUCHS KNIRSCHEN NICHT ZU ZAGEN. ES WOLKT SICH UBER MIR DER MOND VERBIRGT SEIN LICHT DIE LAMPE SCHWINDET! ES DAMPFT! ES ZUCKEN ROTE STRAHLEN MIR UM DAS HAUPTES WEHT EIN SCHAUER VOM GEWOLB HERAB UND FASST MICH AN! ICH FUHLS, DU SCHWEBST UM MICH, ERFLEHTER GEIST ENTHULLE DICH! HA! WIES IN MEINEM HERZEN REISST! ZU NEUEN GEFUHLEN ALL MEINE SINNEN SICH ERWUHLEN! ICH FUHLE GANZ MEIN HERZ DIR HINGEGEBEN! DU MUSST! DU MUSST! UND KOSTET ES MEIN LEBEN! (ER FASST DAS BUCH UND SPRICHT DAS ZEICHEN DES GEISTES GEHEIMNISVOLL AUS. ES ZUCKT EINE ROTLICHE FLAMME, DER GEIST ERSCHEINT IN DER FLAMME.)'
Tipps
Mögliche Vorgehensweisen:
Einfach. Idee: Gehe jeden Buchstabe des Alphabets durch und ermittle, wie oft dieser im Text vorkommt.
Speichere das Alphabet in einer Liste oder einem String, z.B. alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
.
Für jeden Buchstaben musst du irgendwo dessen Anzahl speichern. Verwende dazu eine Liste: Die erste Zahl darin steht für die Anzahl „A“, die zweite für die Anzahl „B“ bis und mit „Z“ usw:
Mit text.count(buchstabe)
wird ermittelt, wie oft der Buchstabe buchstabe
im Text text
vorkommt.
Gehe jeden Buchstabe in alphabet
durch (Schleife!) und ermittle mit count
dessen Anzahl. Speichere diese dann in der count
-Liste. Nun sollte diese Liste für jeden Buchstaben die richtige Anzahl haben.
Ermittle, wie viele Buchstaben es insgesamt gibt (also Summe aller Zahlen in count
). Dividiere jede Zahl in count
durch diese Summe, um dessen Häufigkeit zu erhalten (sollte etwa $0.15$ für das „E“ sein). Um es in Prozent anzugeben, multipliziere die Zahl mit $100$.
Gib nun jeden Buchstaben und dessen Häufigkeit aus.
Standard. Idee: Gehe jedes Zeichen des Textes durch, ermittle was es für eines ist, und erhöhe dann den entsprechenden Counter um $1$.
Speichere das Alphabet in einer Liste oder einem String, z.B. alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
.
Für jeden Buchstaben musst du irgendwo dessen Anzahl speichern. Verwende dazu eine Liste: Die erste Zahl darin steht für die Anzahl „A“, die zweite für die Anzahl „B“ bis und mit „Z“ usw:
Gehe nun jeden Buchstabe des Textes durch (Schleife: for oder while, for einfacher).
Überprüfe, ob dieser Buchstabe im Alphabet vorkommt (wollen ja nur Grossbuchstaben verschlüsseln aber keine Zahlen und Sonderzeichen). Der folgende Code überprüft, ob der Buchstabe, der in
buchstabe
gespeichert ist, in
alphabet
vorkommt
if buchstabe in alphabet:
pass
Falls der Buchstabe vorkommt im Alphabet: Erhöhe den Counter an der richtigen Stelle um 1. Achtung: Position vs. Element!
Pro:
Ähnlich wie 'Standard', aber mithilfe eines Dictionaries. Falls du diese noch nicht kennst, löse es mit 'Standard'.
Lösungen
A | 4.89% |
B | 2.0% |
C | 4.34% |
D | 5.1% |
E | 15.08% |
F | 1.51% |
G | 2.37% |
H | 6.63% |
I | 8.61% |
J | 0.1% |
K | 1.35% |
L | 4.06% |
M | 3.9% |
N | 9.33% |
O | 2.18% |
P | 0.65% |
Q | 0.1% |
R | 6.71% |
S | 6.89% |
T | 5.41% |
U | 5.28% |
V | 0.55% |
W | 1.87% |
X | 0.0% |
Y | 0.0% |
Z | 1.09% |
Option 2: Häufigkeitsanalyse von einzelnem, aber originalem String (mittel)
Wie Option 1, aber mit dem Unterschied, dass der String noch nicht vorbereitet wurde sondern noch im originalen Zustand ist.
Schreibe eine Funktion, die eine Linie Text einliest und eine Häufigkeitsanalyse durchführt. Das Alphabet soll nur aus den $26$ Standardbuchstaben Bestehen. Alle Buchstaben sollen in Kleinbuchstaben umgewandet werden. Umlaute wie Ä,ä,Ö,ö,Ü,ü sollen als A,O und U, die Buchstaben É,È und À als E resp. A aufgefasst werden. Buchstaben in einem String kannst du wie folgt ersetzen: s = s.replace('É','E')
Text Faust
faust = 'Habe nun, ach! Philosophie, Juristerei und Medizin, Und leider auch Theologie Durchaus studiert, mit heissem Bemühn. Da steh ich nun, ich armer Tor! Und bin so klug als wie zuvor; Heisse Magister, heisse Doktor gar Und ziehe schon an die zehen Jahr Herauf, herab und quer und krumm Meine Schüler an der Nase herum Und sehe, dass wir nichts wissen können! Das will mir schier das Herz verbrennen. Zwar bin ich gescheiter als all die Laffen, Doktoren, Magister, Schreiber und Pfaffen; Mich plagen keine Skrupel noch Zweifel, Fürchte mich weder vor Hölle noch Teufel Dafür ist mir auch alle Freud entrissen, Bilde mir nicht ein, was Rechts zu wissen, Bilde mir nicht ein, ich könnte was lehren, Die Menschen zu bessern und zu bekehren. Auch hab ich weder Gut noch Geld, Noch Ehr und Herrlichkeit der Welt; Es möchte kein Hund so länger leben! Drum hab ich mich der Magie ergeben, Ob mir durch Geistes Kraft und Mund Nicht manch Geheimnis würde kund; Dass ich nicht mehr mit saurem Schweiss Zu sagen brauche, was ich nicht weiss; Dass ich erkenne, was die Welt Im Innersten zusammenhält, Schau alle Wirkenskraft und Samen, Und tu nicht mehr in Worten kramen. O sähst du, voller Mondenschein, Zum letztenmal auf meine Pein, Den ich so manche Mitternacht An diesem Pult herangewacht. Dann über Büchern und Papier, Trübselger Freund, erschienst du mir! Ach! könnt ich doch auf Bergeshöhn In deinem lieben Lichte gehn, Um Bergeshöhle mit Geistern schweben, Auf Wiesen in deinem Dämmer weben, Von allem Wissensqualm entladen, In deinem Tau gesund mich baden!Weh! steck ich in dem Kerker noch? Verfluchtes dumpfes Mauerloch, Wo selbst das liebe Himmelslicht Trüb durch gemalte Scheiben bricht! Beschränkt mit diesem Bücherhauf, den Würme nagen, Staub bedeckt, Den bis ans hohe Gewölb hinauf Ein angeraucht Papier umsteckt; Mit Gläsern, Büchsen rings umstellt, Mit Instrumenten vollgepfropft, Urväter Hausrat drein gestopft Das ist deine Welt! das heisst eine Welt!Und fragst du noch, warum dein Herz Sich bang in deinem Busen klemmt? Warum ein unerklärter Schmerz Dir alle Lebensregung hemmt? Statt der lebendigen Natur, Da Gott die Menschen schuf hinein, Umgibt in Rauch und Moder nur Dich Tiergeripp und Totenbein.Flieh! auf! hinaus ins weite Land! Und dies geheimnisvolle Buch, Von Nostradamus eigner Hand, Ist dir es nicht Geleit genug? Erkennest dann der Sterne Lauf, Und wenn Natur dich Unterweist, Dann geht die Seelenkraft dir auf, Wie spricht ein Geist zum andren Geist. Umsonst, dass trocknes Sinnen hier Die heilgen Zeichen dir erklärt. Ihr schwebt, ihr Geister, neben mir; Antwortet mir, wenn ihr mich hört! (Er schlägt das Buch auf und erblickt das Zeichen des Makrokosmus.)Ha! welche Wonne fliesst in diesem Blick Auf einmal mir durch alle meine Sinnen! Ich fühle junges, heilges Lebensglück Neuglühend mir durch Nerv und Adern rinnen. War es ein Gott, der diese Zeichen schrieb, Die mir das innre Toben stillen, Das arme Herz mit Freude füllen, Und mit geheimnisvollem Trieb Die Kräfte der Natur rings um mich her enthüllen? Bin ich ein Gott? Mir wird so licht! Ich schau in diesen reinen Zügen Die wirkende Natur vor meiner Seele liegen. Jetzt erst erkenn ich, was der Weise spricht. "Die Geisterwelt ist nicht verschlossen; Dein Sinn ist zu, dein Herz ist tot! Auf, bade, Schüler, unverdrossen Die irdsche Brust im Morgenrot!" (er beschaut das Zeichen.) Wie alles sich zum Ganzen webt, Eins in dem andern wirkt und lebt! Wie Himmelskräfte auf und nieder steigen Und sich die goldnen Eimer reichen! Mit segenduftenden Schwingen Vom Himmel durch die Erde dringen, Harmonisch all das All durchklingen! Welch Schauspiel! Aber ach! ein Schauspiel nur! Wo fass ich dich, unendliche Natur? Euch Brüste, wo? Ihr Quellen alles Lebens, An denen Himmel und Erde hängt, Dahin die welke Brust sich drängt Ihr quellt, ihr tränkt, und schmacht ich so vergebens? (er schlägt unwillig das Buch um und erblickt das Zeichen des Erdgeistes.) Wie anders wirkt dies Zeichen auf mich ein! Du, Geist der Erde, bist mir näher; Schon fühl ich meine Kräfte höher, Schon glüh ich wie von neuem Wein. Ich fühle Mut, mich in die Welt zu wagen, Der Erde Weh, der Erde Glück zu tragen, Mit Stürmen mich herumzuschlagen Und in des Schiffbruchs Knirschen nicht zu zagen. Es wölkt sich über mir Der Mond verbirgt sein Licht Die Lampe schwindet! Es dampft! Es zucken rote Strahlen Mir um das HauptEs weht Ein Schauer vom Gewölb herab Und fasst mich an! Ich fühls, du schwebst um mich, erflehter Geist Enthülle dich! Ha! wies in meinem Herzen reisst! Zu neuen Gefühlen All meine Sinnen sich erwühlen! Ich fühle ganz mein Herz dir hingegeben! Du musst! du musst! und kostet es mein Leben! (Er fasst das Buch und spricht das Zeichen des Geistes geheimnisvoll aus. Es zuckt eine rötliche Flamme, der Geist erscheint in der Flamme.)'
Option 3: Häufigkeitsanalyse von ganzem Buch (anspruchsvoll)
Variante 1:
Anstelle einer Häufigkeitsanalyse eines einzelnen Strings soll eine solche für ein ganzes Buch durchgeführt werden. Auf Project Gutenberg findet man über $60'000$ gratis Ebooks. Wähle dort ein Buch aus und lade dessen „Plain Text UTF-8“-Version herunter. Wandle alle Klein- in Grossbuchstaben um und ersetze Umlaute (wie in Option 2). Führe dann eine Häufigkeitsanalyse durch.
Variante 2:
Alternativ kann man auch direkt über das Web auf das Buch zugreifen (→ muss nicht herunterladen): Klicke auf der Website auf „Plain Text UTF-8“. Das Buch erscheint dann im einfachen Textformat direkt im Browser. Über den dazugehörigen Link, kannst du das Buch direkt in Python einlesen:
import urllib2
data = urllib2.urlopen(<Pfad zu File als String>)
line_first = ... # erste Zeile des Texts
line_last = ... # letzte Zeile des Texts
for line in data:
line = line.replace('\n', '').decode('utf-8') # replace(...): entfernt nervige Zeilenumbrueche, decode(): Umlaute usw richtig anzeigen
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.
Aufgabe C3 (optional)
Versuche, mithilfe einer Häufigkeitsanalyse den Text (in deutscher Sprache, nur Kleinbuchstaben) unten möglichst fest zu entschlüsseln. Aus welchem Buch ist dieser?
Verschlüsselter Text
RX JLW RXN WJXNZVC QR ZQTJNBVXIVT LJRRVX 4 ISXVL NBYZM WSXSJO, TSLM JLW TSX LYXRSZ MJ NVQL, NVHX NBYZM NYTSX. LQVRSLW ISXV SJO WQV QWVV TVUYRRVL, NQV UYLLBVL NQKH QL VQLV RVXUIJXWQTV JLW TVHVQRLQNGYZZV TVNKHQKHBV GVXNBXQKUVL, WVLL RQB NYZKHVR JLNQLL IYZZBVL NQV LQKHBN MJ BJL HSEVL. RX WJXNZVC ISX WQXVUBYX VQLVX OQXRS LSRVLN TXJLLQLTN, WQV EYHXRSNKHQLVL HVXNBVZZBV. VX ISX TXYNN JLW EJZZQT JLW HSBBV OSNB UVQLVL HSZN, WSOJX SEVX VQLVL NVHX TXYNNVL NKHLJXXESXB. RXN WJXNZVC ISX WJLL JLW EZYLW JLW EVNSNN WYDDVZB NY GQVZ HSZN, IQV LYBIVLWQT TVIVNVL ISXV, ISN SZZVXWQLTN NVHX LJBMZQKH ISX, WVLL NY UYLLBV NQV WVL HSZN JEVX WVL TSXBVLMSJL XVKUVL JLW MJ WVL LSKHESXL HQLJEVXNDSHVL. WQV WJXNZVCN HSBBVL VQLVL UZVQLVL NYHL LSRVLN WJWZVC JLW QL QHXVL SJTVL TSE VN LQXTVLWIY VQLVL DXSKHBQTVXVL FJLTVL. WQV WJXNZVCN EVNSNNVL SZZVN, ISN NQV IYZZBVL, WYKH NQV HSBBVL SJKH VQL TVHVQRLQN, JLW WSNN VN FVRSLW SJOWVKUVL UYLLBV, ISX QHXV TXYNNBV NYXTV. VQLOSKH JLVXBXSTZQKH ISXV VN, IVLL WQV NSKHV RQB WVL DYBBVXN HVXSJNUYRRVL IJXWV. RXN DYBBVX ISX WQV NKHIVNBVX GYL RXN WJXNZVC; WYKH WQV EVQWVL HSBBVL NQKH NKHYL NVQB VBZQKHVL FSHXVL LQKHB RVHX TVNVHVL. RXN WJXNZVC EVHSJDBVBV NYTSX, WSNN NQV TSX UVQLV NKHIVNBVX HSBBV, WVLL WQVNV JLW WVXVL LQKHBNLJBM GYL VQLVR RSLL ISXVL NY JLWJXNZVCHSOB, IQV RSL VN NQKH LJX WVLUVL UYLLBV. WQV WJXNZVCN NKHSJWVXBVL EVQR TVWSLUVL WSXSL, ISN WQV LSKHESXL NSTVL IJXWVL, NYZZBVL WQV DYBBVXN VQLVN BSTVN QL QHXVX NBXSNNV SJOUXVJMVL. WQV WJXNZVCN IJNNBVL, WSNN SJKH WQV DYBBVXN VQLVL UZVQLVL NYHL HSBBVL, WYKH WVL HSBBVL NQV LQV TVNVHVL. SJKH WQVNVX FJLTV ISX VQL TJBVX TXJLW, NQKH GYL WVL DYBBVXN OVXLMJHSZBVL; RQB VQLVR NYZKHVL UQLW NYZZBV QHX WJWZVC LQKHB QL EVXJHXJLT UYRRVL.
Tipps
Aufgabe C4 (optional)
Die Autokey-Verschlüsselungsmethode ist eine Weiterentwicklung der Vigenere-Verschlüsslung. Anstelle das Schlüsselwort wie bei der Vigenere-Methode wiederholt zu verwenden, wird an den Schlüssel entweder der Klartext oder der bereits verschlüsselte Text angehängt. Somit werden Wiederholungen vermieden, was diese Verschlüsselungsmethode viel sicherer macht. Implementiere die Autokey-Verschlüsselungsmethode.
Erklärung und Beispiele: https://kryptografie.de/kryptografie/chiffre/autokey.htm
Nutze den Code unten, um Nachrichten zu verschlüsseln und entschlüsseln:
Code
import unicodedata
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.,!?"
###################################
key = #TODO: HIER MUSS DER KEY FESTGELEGT WERDEN
###################################
for c in key:
if c not in ALPHABET: raise Exception("Unerlaubtes Symbol im Key!")
def encryption_vigenere(cleartext,password):
cleartext = cleartext.replace(' ','_')
cleartext = cleartext.upper()
cleartext = unicodedata.normalize('NFD', cleartext) # Ersetzt Umlaute usw.
cleartext = ''.join(c for c in cleartext if unicodedata.category(c) != 'Mn')
password = password.upper()
ciphertext = ""
for i in range(len(cleartext)):
c = cleartext[i]
if c in ALPHABET:
k = ALPHABET.index(c)
n = ALPHABET.index(password[i%len(password)]) + 1
k = (k + n) % len(ALPHABET)
ciphertext += ALPHABET[k]
else:
ciphertext += c
return ciphertext
def decryption_vigenere(cipher,password):
password = password.replace(' ','_')
password = password.upper()
pw_inv = "" # Finde inverses Passwort, also quasi das Gegenteil von password
for c in password:
i = - ALPHABET.index(c) - 2
i = i % len(ALPHABET)
pw_inv += ALPHABET[i]
return encryption_vigenere(cipher,pw_inv)
###################################
print(encryption_vigenere("Wie geht es dir?",key)) # Klartext zu Geheimtext
print(decryption_vigenere("ALMEMK0WDNYBWLZI",key)) # Geheimtext zu Klartext
Aufgabe D1
Löse von Hand (ohne Python) und mithilfe der ASCII-Tabelle:
Was bedeutet: „83 111 109 109 101 114“?
Übersetze in
ASCII-Code (mit Dezimalzahlen): „Fahrrad“
Was bedeutet (
ASCII-Code mit Binärzahlen): „1000001 1000110 1000110 1000101“?
Tipp: Bestimme zuerst die Zahl 1000000, danach sind die restlichen Zahlen ziemlich einfach.
Aufgabe D2
Beantworte mithilfe von Python. Verwende dazu die beiden folgenden Funktionen:
Aufgaben:
Welches Zeichen befindet sich an Position $42$ in der
ASCII Zeichentabelle?
An welcher Position in der
ASCII-Zeichentabelle steht die Zahl 7?
Übersetzt in
ASCII-Code: „KSR“
Welches Wort verbirgt sich hinter: „71 105 103 97 109 112 102 105“
Aufgabe D3
Welcher Text verbirgt sich hinter dem ASCII-Code:
[69, 115, 32, 103, 105, 98, 116, 32, 49, 48, 32, 65, 114, 116, 101, 110, 32, 118, 111, 110, 32, 77, 101, 110, 115, 99, 104, 101, 110, 32, 105, 110, 32, 100, 101, 114, 32, 87, 101, 108, 116, 46, 32, 68, 105, 101, 32, 101, 105, 110, 101, 110, 32, 118, 101, 114, 115, 116, 101, 104, 101, 110, 32, 100, 97, 115, 32, 66, 105, 110, 97, 101, 114, 115, 121, 115, 116, 101, 109, 32, 117, 110, 100, 32, 100, 105, 101, 32, 97, 110, 100, 101, 114, 101, 110, 32, 110, 105, 99, 104, 116, 46]
Hier soll nicht jede einzelne Zahl mit einem eigenen chr()
-Befehl entziffert werden. Stattdessen soll man wie folgt vorgehen:
In Schleife jede Zahl der Liste oben durchgeben.
Zahl entziffern, also in Buchstaben umwandeln.
Vor Schleife leeren String deklarieren.
Jeden entzifferten Buchstaben hinten anhängen, so dass der String mit jedem Durchlauf der Schleife um eine Stelle wächst.
Aufgabe D4 (optional)
In Python muss man oft Listen mit Werten befüllen, z.B. wenn man einen String in ASCII-Code übersetzen will. Typischerweise startet man mit einer leeren Liste. In einer Schleife ermittelt man dann alle Elemente und befüllt damit die Liste mit append()
. Sogenannte List-Comprehensions ermöglichen einem, das gleiche in einer einzigen Zeile Code mit einem extrem kurzen Syntax zu realisieren.
Beispiel: Liste mit Quadratzahlen
# Normaler Weg, um eine Liste zu erstellen
squares = []
for x in range(10):
squares.append(x ** 2)
# Mit List Comprehension
squares = [x ** 2 for x in range(10)]
Auftrag:
Lasse dir von einer AI erklären, was List Comprehensions in Python sind und wie man diese implementiert.
Übersetzte dann den String „List Comprehensions are great!“ in
ASCII-Code - in einer einzigen Zeile Code mit einer List Comprehension.
Löse Aufgabe D3 erneut, diesmal aber mit einer List Comprehension - wieder in einer einzigen Zeile Code. Tipp: Verwende ''.join(my_list)
, um die Symbole einer Liste zu einem String aneinanderzuhängen.