Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:umgang_inet_sca:verschluesselung [2024-03-10 13:18] scagf_informatik:umgang_inet_sca:verschluesselung [2024-03-10 18:41] (aktuell) – gelöscht sca
Zeile 1: Zeile 1:
-====== - Verschlüsselung ====== 
  
-Slides: {{ :gf_informatik:umgang_inet_sca:2022_umgang_inet_04_verschluesselung.pdf |}} 
- 
- 
- 
-++++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:** 
-   * Erkläre die Funktionsweisen der drei **klassischen Verschlüsselungsmethoden**: 
-     * **Caesar**-Verschlüsselungsmethode 
-     * allgemeine **monoalphabetische** Verschlüsselungsmethode 
-     * **Vigenère** Verschlüsselungsmethode 
-   * **Implementiere** die ersten beiden Verschlüsselungsmethoden in Python (entschlüsseln und verschlüsseln). 
-   * **Verschlüssle/Entschlüssle von Hand** Nachrichten, die mit diesen verschlüsselt wurden. Wir folgen der Konvention, dass 'A','B',... im Schlüssel einen Buchstaben um 1,2,... Stellen verschieben. 
-   * Analysiere die **Sicherheit** dieser Verschlüsselungsmethoden. Vergleiche sie untereinander. 
-   * Entscheide, ob eine gegebene Verschlüsselungsmethode monoalphabetisch ist oder nicht.\\ \\ 
-   * Erkläre das Grundprinzip einer **Häufigkeitsanalyse**. Erkläre, wann diese (keinen) Sinn machen. 
-   * Erkläre, was der Kasiski-Test ist, und wie man eine mit Vigenère verschlüsselte Nachricht knacken kann. 
-   * **Implementiere** in Python eine Häufigkeitsanalyse für einen langen String. 
-   * Erkläre Grundidee und Notwendigkeit von **Zeichencodierungen / Zeichentabelle**. 
-   * Beschreibe die wichtigsten Eigenschaften der ASCII-Zeichentabelle. 
-   * Wandle ohne Hilfsmittel um: Grossbuchstaben <-> Zahl 
-   * Erkläre was **Unicode** ist, was die Idee dahinter ist und ... 
-   * ... wie Unicode-Zeichen als Binärzahlen gespeichert werden. 
-   * Vergleiche ASCII mit Unicode. 
-   * Erkläre, was ein **präfixfreier Code** ist und mache (Gegen)Beispiele.\\ \\ 
-   * Erkläre den **XOR-Logikoperator** anhand seiner Wahrheitstabelle. Mache konkrete Real-Life Beispiele dazu. 
-   * Erkläre die **XOR-**Verschlüsselungsmethode: 
-     * Wie funktioniert sie? 
-     * Wo kommt sie zum Einsatz? 
-     * Warum wählt man dazu genau XOR? 
-     * Was sind ihre Schwächen? Wie kann man sie umgehen?\\ \\ 
-   * Erkläre, was **AES** bedeutet und wie es dazu kam. 
-   * Erkläre die beiden Versionen von AES (ECB und CBC) und in groben Zügen deren Funktionsweisen. Verwende dazu die zugehörigen Fachbegriffe. 
-   * Analysiere dessen Sicherheit. 
-   * Entschlüssle/Verschlüssle eine Nachricht mit AES mithilfe von Online-Tools. 
-   * Erkläre, was das **Hexadezimalsystem** ist, und wie dessen Zahlen aussehen. 
-   * Wandle um: Binärsystem <-> Hexadezimalsystem\\ \\ 
-   * Einfache **Programme** schreiben, die ähnliche Skills verlangen wie die Codes zum aktuellen Thema. 
- 
- 
-**Wichtigste Programmierskills:** 
-   * Verstehen, was Funktionen sind und wie man sie programmiert. Begriffe wie 'Argument/Parameter', 'Rückgabewert' und 'Funktionsaufruf' erklären können. 
-   * Durch Elemente von Listen und Strings iterieren können. 
-   * Die Grundbefehle für Listen und Strings kennen wie: 
-     * Element an bestimmter Position auslesen, ändern 
-     * Position von Element ermitteln 
-   * Unterschied zwischen Element und Index/Position in Bezug auf Listen und Strings kennen. 
-   * Umrechnungen: 
-     * ASCII <-> Zahl 
-     * Dezimalzahl, Binärzahl, Hexadezimalzahl 
- 
-++++ 
-===== - Caesar-Verschlüsselung ===== 
- 
-Bei der **Caesar-Verschlüsselung** werden alle Buchstaben um eine Anzahl Stellen verrückt: 
- 
-{{ :gf_informatik:caesar.png?nolink&400 |}} 
- 
-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: 
- 
-{{ :gf_informatik:cipherdiskcaesar2000sm.jpg?nolink&300 |}} 
- 
-==== Aufgaben A ==== 
- 
-=== 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 verschoben. 
- 
-Hier ein paar Tipps: 
-   * Arbeite nur mit Grossbuchstaben. Wandle den Klartext mit `upper()` in Grossbuchstaben um. 
-   * Wir brauchen eine Liste oder einen String, der alle Zeichen beinhaltet. Wähle dazu eine beiden Möglichkeiten unten (siehe Code-Beispiel unten) - je nach dem, ob du lieber mit Listen oder Strings arbeitest. 
-   * Zeichen, die nicht in der Liste vorkommen (Kleinbuchstaben, Zahlen, Leerschlag, Sonderzeichen, ...), sollen *unverschlüsselt* angezeigt werden. 
-   * Verwende Modulo-Operator `%`. Damit kannst du verhindern, dass du auf Element von Liste/String zugreifen möchtest, welches nicht darin liegt. 
-   * Die Liste resp. der String, der alle relevanten Buchstaben beinhaltet wird hier `ALPHABET` genannt. Es ist eine Python-Konvention, dass Konstanten, also Variablen, die sich im Verlaufe des Programms nicht verändern, mit lauter Grossbuchstaben geschrieben werden. 
-   * Theorie zu [[gf_informatik:programmieren_ii_sca#funktionen|Funktionen]] 
- 
-<code python> 
-# 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] # Symbol 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. 
-</code> 
- 
-++++Tipps| 
-Versuche, die Aufgabe möglichst ohne diese Schritt-für-Schritt Tipps zu lösen. 
- 
-   1. Erstelle einen leeren String für das verschlüsselte Wort, nenne diesen z.B. `cipher` oder `ciphertext` 
-   1. Gehe Liste/String Symbol-für-Symbol durch 
-   1. Finde heraus, an welcher Stelle in der Liste/im String dieses vorkommt 
-   1. Addiere die Zahl $n$ hinzu. 
-   1. Stelle sicher, dass diese Zahl nicht zu gross ist. Stichwort: Modulo-Operator 
-   1. Finde das Symbol an dieser Stelle ... 
-   1. ... und füge es dem verschlüsselten Wort hinzu. 
-   1. Gebe dieses zurück. 
-   1. 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 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. 
- 
- 
-===== - Weiter einfache Verschlüsselungsverfahren ===== 
- 
-Die Caesar-Verschlüsselung von oben ist ein sehr unsicheres Verfahren. Eine damit verschlüsselte Nachricht kann mit einem Computer innerhalb eines Sekundenbruchteils geknackt werden. Gewissermassen eine Weiterentwicklung von diesem Verfahren ist die **Vigenère-Verschlüsslung** (Details in den Aufgaben). 
- 
-==== Aufgaben B ==== 
- 
-=== Aufgabe B1 === 
- 
-In der Caesar-Verschlüsselung wird jeder Buchstabe um eine bestimmte Anzahl Stellen verschoben. Auch in der Vigenère-Verschlüsselung werden die Buchstaben verschoben. Allerdings nicht um eine feste Anzahl Stellen, sondern mithilfe eines **Schlüsselworts**. 
- 
-   1. Stelle eine **Vermutung** auf, wie die Vigenère-Verschlüsselung funktionieren könnte. Studiere nachher die Erklärung am Ende der Aufgabe. 
-   1. Verschlüssle *von Hand* das Wort "INFORMATIK" mit dem Passwort "KSR". Verwende als Alphabet wieder alle Grossbuchstaben ohne irgendwelche Sonderzeichen: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
-   1. Analysiere die **Sicherheit** dieser Verschlüsselungsmethode: 
-      1. Wie geht man vor, um eine so verschlüsselte Nachricht zu entschlüsseln? 
-      1. Unter welchen Bedingungen ist sie (praktisch nicht) entschlüsselbar? 
- 
-++++Vigenère-Verschlüsselung| 
-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 | 
-++++ 
- 
-=== Aufgabe B2: Vigenère Programmieren === 
- 
-MittelImplementiere die **Vigenère-Verschlüsslung** in der Funktion `encryption_vigenere(cleartext,password)`. 
-=== Aufgabe B3: Morse-Alphabet === 
- 
-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| 
-<code python> 
-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 = ['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..', '-.--.', '-.--.-', '-....-', '.-.-.-', '-..-.', '-----', '.----', '..---', '...--', '....-', '--..--', '.....', '-....', '--...', '---..', '----.', '..--..'] 
-</code> 
- 
-Tipps: 
- 
-   * Um die einzelnen Morse-Symbole unterscheiden zu können, kann man z.B. immer einen Leerschlag nach einem Morse-Symbol einfügen. 
-   * Für die Umkehrung Morsecode zu Klartext kann man dann den Morsecode z.B. in eine Liste umwandeln: `morsecode.split(" ")` teilt den String `morsecode` immer dort, wo ein Leerschlag `" "` vorkommt und erstellt eine Liste. 
- 
-++++ 
- 
-=== Aufgabe B4: Zusatzaufgaben ==== 
- 
-   * Stelle das Morse-Nachrichten schön dar, z.B. mit TigerJython, PyQT, PyGame, ... 
-   * Wie oben, einfach für das **Freimaurer-Alphabet**: https://de.wikipedia.org/wiki/Freimaurer-Alphabet#Freimaurer-Code 
- 
-===== - Monoalphabetische Verschlüsslung ===== 
- 
-Die Vigenere-Verschlüsselung ist gewissermassen eine Weiterentwicklung der Caesar-Verschlüsslung. Eine alternative mögliche 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 
-"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. Diese Art der Verschlüsselung nennt man eine **monoalphabetische Verschlüsselung**. 
- 
- 
-==== Aufgaben C ==== 
- 
-=== Aufgabe C1 === 
- 
-   1. Ist die Caesar-Verschlüsselung auch eine monoalphabetische Verschlüsselung? 
-   1. 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. 
-   1. Wie viele Möglichkeiten gibt es für die monoalphabtische Verschlüsselung? (wieder mit $26$ Buchstaben). 
-   1. Wie schätzt du die Sicherheit der monoalphabtischen Verschlüsselung ein? Welche Möglichkeiten gibt es, um eine damit verschlüsselte Nachricht zu entziffern? 
-   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, eine solche zu entziffern? 
- 
-=== Aufgabe C2 === 
- 
-Die Nachricht "RYDDUYKFXUKEBKFBBKKBQXBPVBJF" wurde mit dem Schlüssel "UELXBICNYAZJSQORTPKFMGVHWD" verschlüsselt. Schreibe ein Programm, mit welchem du die Nachricht im Klartext ermitteln kannst. 
- 
-++++Tipps| 
- 
-   1. Gehe Buchstaben um Buchstaben durch die Nachricht. 
-   1. Ermittle die Position von diesem Buchstaben im durchmischten Alphabet (Schlüssel). 
-   1. Dieser Buchstabe gehört zum Buchstaben im normalen Alphabet an dieser Stelle. 
- 
-++++ 
- 
-=== Aufgabe C3 === 
- 
-Ist die verschlüsselte Nachricht lange genug, kann man eine **Häufigkeitsanalyse** durchführen. In der deutschen Sprache kommt der Buchstabe "E" mit gut $15\%$ 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: [[https://de.wikipedia.org/wiki/Liste_der_häufigsten_Wörter_der_deutschen_Sprache|Liste der häufigsten Wörter der deutschen Sprache]] 
- 
-Wähle eine der beiden Optionen: 
- 
-=== Option 1: Häufigkeitsanalyse von einzelnem String (einfach) === 
- 
-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 ae,oe und ue, die Buchstaben é,è und à als e und a aufgefasst werden. Buchstaben in einem String kannst du wie folgt ersetzen: `s = s.replace('é','e')`  
- 
-Wende deine Funktion auf den folgenden Ausschnitt von Goethe's Faust an und vergleiche deine Resultate mit den Musterlösungen: 
- 
-++++Text Faust| 
-<code python> 
-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.)' 
-</code> 
-++++ 
- 
-++++Tipps| 
-Für jeden Buchstaben musst du irgendwo dessen Anzahl speichern. Eine Möglichkeit ist, eine Liste mit Zahlen zu verwenden. Die erste Zahl steht für die Anzahl "A", die zweite für die Anzahl "B" usw.  
-++++ 
- 
-++++Lösungen| 
- 
-   * a: $4.81\%$ 
-   * b: $1.97\%$ 
-   * c: $4.27\%$ 
-   * d: $5.02\%$ 
-   * e: $16.43\%$ 
-   * f: $1.48\%$ 
-   * g: $2.33\%$ 
-   * h: $6.53\%$ 
-   * i: $8.47\%$ 
-   * j: $0.1\%$ 
-   * k: $1.33\%$ 
-   * l: $3.99\%$ 
-   * m: $3.84\%$ 
-   * n: $9.19\%$ 
-   * o: $2.15\%$ 
-   * p: $0.64\%$ 
-   * q: $0.1\%$ 
-   * r: $6.6\%$ 
-   * s: $6.78\%$ 
-   * t: $5.32\%$ 
-   * u: $5.19\%$ 
-   * v: $0.54\%$ 
-   * w: $1.84\%$ 
-   * x: $0.0\%$ 
-   * y: $0.0\%$ 
-   * z: $1.07\%$ 
- 
-++++ 
- 
- 
- 
-=== Option 2: Häufigkeitsanalyse von ganzem Buch (anspruchsvoll) === 
- 
-Wie in Option 1, nur soll anstelle eines einzelnen Strings ein ganzes Buch eingelesen und analysiert werden. Auf [[https://www.gutenberg.org|Project Gutenberg]] findest du über $60'000$ gratis Ebooks. Wähle ein Buch aus und klicke dann 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: 
- 
-<code python> 
-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 
-</code> 
-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 C4 (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? 
- 
-Die Buchstaben in der folgenden Liste ist entsprechend ihrer typischen Häufigkeit in der deutschen Sprache geordnet: 
-<code python> 
-['e', 'n', 's', 'r', 'i', 'a', 't', 'd', 'h', 'u', 'l', 'c', 'g', 'm', 'o', 'b', 'w', 'f', 'k', 'z', 'p', 'v', 'j', 'y', 'x', 'q'] 
-</code> 
- 
-++++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. 
- 
-++++ 
- 
-=== Aufgabe C5 (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]] 
- 
-===== - Vigenère-Game ===== 
- 
-Nutze den Code unten, um Nachrichten zu verschlüsseln und entschlüsseln: 
- 
-++++Code| 
-<code python> 
-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', '_', '.', ',', '!', '?'] 
-################################### 
- 
-key = "SCHIFF" 
- 
-################################### 
- 
-def encryption_vigenere(cleartext,password): 
-    cleartext = cleartext.replace(' ','_') 
-    cleartext = upper(cleartext) 
-    password = upper(password) 
-    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 = upper(password) 
-    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 gehts dir?",key)) # Klartext zu Geheimtext 
-print(decryption_vigenere("ALMEMK0W0EJO C",key)) # Geheimtext zu Klartext 
-</code> 
-++++ 
- 
-===== - Zeichencodierung ===== 
- 
-Theorie zu Zeichencodierung, ASCII & Unicode: 
- 
-Siehe Slides {{ :gf_informatik:umgang_inet_sca:2022_umgang_inet_04_verschluesselung.pdf |}} 
- 
-==== Aufgaben D ==== 
- 
-=== Aufgabe D1 === 
- 
-Beantworte mithilfe von Python. 
- 
-   1. Welches ist das 42. Zeichen in ASCII? 
-   1. An welcher Position in der ASCII-Zeichentabelle steht die Zahl 7? 
-   1. Welches Wort verbirgt sich hinter "82 111 109 97 110 115 104 111 114 110"? 
- 
-=== Aufgabe D2 === 
- 
-Wie viele Symbole kann man mit Unicode (1 bis 4 Bytes) darstellen? 
- 
-*Tipp:* Siehe Tabelle in Slides. 
- 
-=== Aufgabe D3 === 
- 
-Studiere das Video und beantworte die Fragen unten: 
- 
-{{youtube>MijmeoH9LT4?}} 
- 
-Fragen: 
- 
-   1. Welches Problem hat das Aufkommen des Internets im Bezug auf die Kodierung von Zeichen mit sich gebracht? Wie hat man es gelöst? 
-   1. ASCII verwendet 7 Bit pro Zeichen. Man könnte jedes Unicode-Zeichen mit vier Bytes darstellen, was aber sehr ineffizient wäre. Wie umgeht man dies? 
-   1. Warum darf in einem mit Unicode dargestellten Text kein `0000 0000`-Byte vorkommen? Wie wird dies verhindert? 
-   1. Wie werden die Buchstaben 'K' und 'e' in ASCII dargestellt? Wie in Unicode? Finde es selber heraus, schaue nicht in einer Tabelle nach. 
-   1. Das wievielte Zeichen der Unicode-Zeichentabelle wird durch die Binärzahl "11000101 10011110" ausgedrückt? 
-    
- 
- 
-=== Aufgabe D4 (optional, einfache-mittlere Programmierübung) === 
- 
-Unicode-Zeichen werden in 1-4 Byte-Binärzahlen gespeichert. Schreibe eine Funktion `unicode_symbol_number(b)`, die für eine solche Binärzahl bestimmt, das wievielte Unicode-Zeichen es darstellt. 
- 
-Einfache Variante: nur für 1-Byte Zahlen 
- 
-Beispiele: 
- 
-   * "01000001" -> 65 
-   * "11000010 10000100" -> 132 
- 
-Tipp: Um eine Binärzahl ins Dezimalsystem umzuwandeln kannst du entweder eine eigene Funktion schreiben (btw: hast du bereits einmal programmiert) oder `int("01010101",2)` verwenden. 
- 
-===== - XOR-Verschlüsselung ===== 
- 
-Aus dem letzten Kapitel wissen wir, wie wir mithilfe von Zeichentabellen Zeichen in Binärzahlen umwandeln können. Doch wie können wir nun auf der Ebene von Binärzahlen eine Nachricht verschlüsseln? Eine monoalphabetische Verschlüsselung, wie wir sie oben kennengelernt haben, macht auf jeden Fall keinen Sinn mehr, da unser 'Alphabet' nur noch aus zwei Zeichen besteht: 0 und 1. 
- 
-Eine einfache Operation auf Bits ist die **XOR (_eXclusive OR_) Operation**. Wie der Name andeutet, werden bei der XOR-Operation zwei Bits so verknüpft, dass das Resultat genau dann $1$ ist, wenn der eine oder der andere der Operanden $1$ ist, aber nicht beide. Die folgende Wahrheitstabelle zeigt, wie je ein Bit des Plaintext ($p$) mit einem Bit des Key ($k$) zum Ciphertext ($c$) verknüpft werden. 
- 
-**Verschlüsselung:** 
- 
-^ $p$ ^ $k$ ^ $c = p \,\text{XOR}\, k$ ^ 
-|0|0|0| 
-|0|1|1| 
-|1|0|1| 
-|1|1|0| 
- 
-**Entschlüsselung:** 
- 
-^ $c$ ^ $k$ ^ $p = c \,\text{XOR}\, k$ ^ 
-|0|0|0| 
-|0|1|1| 
-|1|0|1| 
-|1|1|0| 
- 
-Die Entschlüsselung funktioniert gleich wie die Verschlüsselung, weil `(p XOR k) XOR k = p` gilt. 
- 
-Da wir mir Binärzahlen arbeiten, können wir nun nicht nur Text sondern **beliebige Informationen verschlüsseln**, wie zum Beispiel Bilder. 
- 
- 
-==== Aufgaben E ==== 
- 
-=== Aufgabe E1 === 
- 
-   1. Verschlüssle den Binärcode `01101000 01100001 01101100` mit diesem Schlüssel `01010011 01110101 01100111` von Hand. 
-   1. Schreibe nun einen Code der dieses macht. Falls du Hilfe brauchst, siehe Tipps unten. 
- 
- 
-++++Tipps| 
- 
-   1. Entferne die Leerschläge in einem String `s` mit `s = s.replace(' ','')` 
-   1. Erstelle einen leeren String, dem du Stelle um Stelle die verschlüsselte Nachricht hinzufügst. 
-    1. Gehe die Positionen des Binärcodes durch. An jeder Stelle bestimmst du den XOR-Wert mit der zugehörigen Ziffer im Schlüssel. Füge das Resultat dem String für die verschlüsselte Nachricht hinzu. 
- 
-++++ 
- 
- 
-=== Aufgabe E2 === 
- 
-Ziel dieser Aufgabe ist, deinen Code aus der letzten Aufgabe zu verallgemeinern und eine Funktion für die XOR-Verschlüsselung zu schreiben. 
- 
-Schreibe eine Funktion `encryption_xor_binary(plaintext_bin,key_bin)` der du den Plaintext (Cleartext) und den Key als Binärstrings übergibst. Die Funktion nimmt dann die Verschlüsselung vor und gibt den verschlüsselten Binärstring zurück. 
- 
-++++Tipps| 
- 
-   1. Vieles kannst du vom Code der letzten Aufgabe übernehmen. 
-   1. Eine 'Problem' hier ist, dass der key kürzer sein kann als der Plaintext. Um die richtige Position aus dem Key auszulesen, kannst du mit dem Modulo-Operator arbeiten. Eine einfachere Alternative wäre: füge dem key solange sich selbst hinzu, bis er mindestens die Länge des Plaintexts hat. Aus dem Key "KsR" würde dann z.B. "KsRKsRKsRKsRKsRKsRKsRKsR". 
- 
-++++ 
- 
-=== Aufgabe E3 (optional) === 
- 
-   1. Schreibe eine Funktion `encryption_xor(plaintext,key)`, die einen Klartext `plaintext` mit dem Schlüssel `key` mit XOR verschlüsselt. Die Funktion gibt den verschlüsselten Text als Binärstring zurück. 
-   1. Schreibe eine Funktion `decryption_xor(ciphertext_bin,key)`, die einen verschlüsselten Binärstring `ciphertext_bin` und den Schlüssel `key` (Text, nicht binär) entgegennimmt und den verschlüsstelten Text entschlüsselt und als normalen Text zurückgibt. 
-   1. Teste deine Funktionen mithilfe des folgenden Codes: 
- 
-<code python> 
-# deine Funktionen oben 
- 
-msg = "Kanti Romanshorn, die innovative Schule im Grünen." 
-key = "Romanshorn" 
-cipher_bin = encryption_xor(msg,key) 
-decripted = decryption_xor(cipher_bin,key) 
-print(decripted) # muss ausgeben: "Kanti Romanshorn, die innovative Schule im Grünen." 
-</code> 
- 
-**Tipps:** 
- 
-   * Verwende von Anfang an **sinnvolle Variablennamen**, sonst wird der Code sehr schnell unübersichtlich. 
-   * Einen Binärstring `b` kannst du wie folgt in eine Dezimalzahl umwandeln: `int(b,2)` 
-   * Eine Dezimalzahl `d` kannst du wie folgt in eine Binärzahl umwandeln: `bin(d)` 
-   * Beachte, dass damit umgewandelte Binärzahlen das Präxif `0b` haben, welches entfernt werden sollte. 
-   * Beachte weiter, dass die resultierende Binärzahl 7 oder 8 Bits haben kann, was zu Problemen führen kann. Tipp: Stelle sicher, dass jede Binärzahl 8 Bits hat. Hänge also wenn nötig noch Nullen an. 
- 
-=== Aufgabe E4 (optional) === 
- 
-Entschlüssle das folgende Bild mit einem *eigenen Code*. Der verwendete Schlüsselt findest du unten. 
- 
-Klicke auf das Bild und lade es dann herunter. 
-{{ :gf_informatik:umgang_inet_sca:bild_raetsel_xor_1373.png?200 |}} 
- 
-++++Schlüssel| 
-<code python> 
-key = "11110000011001101100010000110101110010111001100100010110000111110001100101000101101110111111000000000011000000111110010111101010111110001110101010101000001111001010110110100111000000000011111111010001111100110111101001111010000001011101010000101111110101001100010101001011011101110101011001110100100001101110110011000110100100111100010011001100100111000000000011011110000100010010001110101100111101010100111100010001010100101100111101101011100110110000000000101000000010100111110010000011101000111001100000101011110000000100110011000001000101001000011101000100100100100010100111110011101011010101010110001011010001001010000111000100100010111001111100011100001000011001100011100110101101111001000110001001111010111111100001111111111111011101100101111100000101000101100101011111111110001010111000101010110011011010111111101111110100000100100101001000100101100111100010101011111111001001101000011001101111000111111110101100001100110110000101100000000010111110001011011010010010000111010010011001101010010100000011101111110100101001111110011010000101001111001111000000010101111001000101100110010111101111001000010110111101000110110101000101110001001011100111110010111001011111111010000010011000011101100110111001001000110001110110011011000011001010001111000101100100001010110011000001011100001011010011010001110101010001111000000111111101110011000010010000111010111000111000110" 
-</code> 
-++++ 
- 
-++++Tipps| 
- 
-   1. Arbeite nicht mit TigerJython sondern mit 'richtigem' Python (z.B. in Visual Studio Code) 
-   1. Arbeite mit der cv2 Library (`pip install pip install opencv-python`) 
-   1. Jedes Pixel besteht aus drei Bytes (je eines für Rot, Grün, Blau). 
-   1. Wandle diese Bytes in 8-Bit Binärzahlen um (wichtig: mit 0 auffüllen, damit immer 8 Bit) ... 
-   1. ... und hänge sie aneinander. 
-   1. Diesen langen Binärstring kannst du nun entschlüsseln. 
- 
-++++ 
- 
-===== - Advanced Encryption System (AES) ===== 
- 
-Advanced Encryption System (AES) ist ein symmetrisches Verschlüsselungsverfahren, welches eines der am weitesten verbreiteten modernen Verschlüsselungsverfahren ist. Es gilt (zumindest bis heute) als nicht knackbar. Siehe Slides für Details. 
- 
-Spannendes Video zu Verschlüsselung, Quanten Computern und SNDL (Store Now, Decrypt Later):  
- 
-{{youtube>-UrdExQW0cs?}} 
- 
- 
-==== Aufgaben F ==== 
- 
-=== Aufgabe F1 === 
- 
-Die folgende Nachricht wurde mit AES-128 CBC verschlüsselt und im Hexadezimalsystem (mehr dazu in Aufgabe unten) dargestellt: 
- 
-<code>34 02 b9 2d f2 b8 6a c1 bd 77 49 b0 47 61 a7 c6 b3 cf 43 41 09 82 95 01 85 74 95 a7 91 4a 6e 67 4d 4a 28 22 97 22 b6 27 e8 75 b2 ea cd 29 19 bf eb d5 35 00 ea 0f e7 68 aa 3e 21 b6 14 46 20 c6</code> 
- 
-Die verwendeten Schlüssel sind: 
-   * Key: `33 06 1c 1e fc 66 07 b6 b5 21 58 e2 34 75 0d ed` 
-   * Initialization Vector: `d1 f7 37 76 68 27 24 47 cb 60 2b bf 60 f6 87 64` 
- 
-Entschlüssle die verschlüsselten Nachricht mithilfe eines Online-Tools (z.B. [[https://cryptii.com/pipes/aes-encryption]]) oder mithilfe Python (für Fortgeschrittene, siehe Tipps). 
- 
-++++AES mit Python| 
-<code python> 
-""" 
-Installation: pip3 install pycryptodome 
- 
-Tipp: Verwende den AES.MODE_CBC Modus 
-""" 
-from Crypto.Cipher import AES 
-... 
-</code> 
-++++ 
- 
-=== Aufgabe F2 === 
- 
-   1. Was ist der Unterschied zwischen symmetrischen und asymmetrischen Verschlüsselungsverfahren? 
-   1. Wie unterscheiden sich Block- und Key-Längen bei AES-128 und AES-256? 
-   1. Wie unterscheiden sich ECB und CBC? 
-   1. Schreibe eine kurze Zusammenfassung von AES in eigenen Worten. 
-    
- 
- 
- 
-=== Aufgabe F3 === 
- 
-In der Aufgabe oben hast du viele Zahlen im **Hexadezimalsystem** angetroffen. Studiere nun die Theorie dazu: 
- 
-Der Computer arbeitet bekanntlich im Binärsystem. In diesem werden aber selbst kürzeste Nachrichten sehr lange. 
- 
-Beispiel: Wandelt man das Wort "ROMANSHORN" in 8bit-Unicode/ASCII um, erhält man: 
-<code> 
-01010010 01001111 01001101 01000001 01001110 01010011 01001000 01001111 01010010 01001110  
-</code> 
-Anstelle betrachtet man gerne die zugehörigen Darstellung im **Hexadezimalsystem** (Zahlensystem mit Basis $16$, Nennwerte $0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f"), denn eine Umrechnung zwischen den beiden ist sehr einfach: 
- 
-Betrachten wir dazu das zweite Byte von oben: `01001111`. Die ersten vier Bits `0100` stehen für die Dezimalzahl $4$, was im Hexadezimalsystem ebenfalls $4$ ist. Die zweiten vier Bits `1111` stehen für $15$, im Hexadezimalsystem ist das `F`. Somit gilt: $$01001111_2 = 4F_{16}$$ 
- 
-Jetzt können wir die Binärdarstellung von "ROMANSHORN" ganz einfach ins Hexadezimalsystem umrechnen: 
-<code> 
-52 4f 4d 41 4e 53 48 4f 52 4e 
-</code> 
- 
-Aufgaben: 
- 
-   1. Wandle die Binärzahl `01000001 01000011 01000100 01000011` von Hand ins Hexadezimalsystem um. 
-   1. Der Binärcode der letzten Teilaufgabe ist der ASCII-Code von welchem Wort (nur Grossbuchstaben)? Löse ohne Hilfsmittel. Tipp: Welche Binärdarstellung hat der Buchstabe 'A' in ASCII? 
-   1. Wandlie die Hexzahl `4b 53 52` von Hand ins Binärsystem um. Welchem Wort entspricht dies? 
- 
- 
-=== Aufgabe F4 === 
- 
-   1. Schreibe einen Code (einfach!), der dir einen 16 Byte (128 Bit) langen Zufallsstring mit Hexadezimalzahlen erstellt in der Form `e9 50 33 f9 99 81 a1 b8 6c 47 82 3d 84 59 9a bc`. Tipp: Mit `hex(132)[2:]` wandelst du eine Dezimalzahl ins Hexadezimalsystem um und entfernst den Präfix. 
-   1. Erstelle mit deinem Code von 1. einen Zufälligen 128 bit Schlüssel (Key) und einen 128 bit Initialization Vector (IV). 
-   1. Verschlüssele mit diesen auf [[https://cryptii.com/pipes/aes-encryption]] eine geheime Nachricht, die du deiner Sitznachbar:in schicken möchtest (Keine Idee? Wie wäre es mit einem Flachwitz?). Schicke ihr/ihm die verschlüsselte Nachricht, Key und IV. 
-   1. Entschlüssele die Nachricht, die du von deiner Sitznachbar:in erhältst. 
- 
-=== Aufgabe F5 (einfache Programmieraufgaben, optional) === 
- 
-Programmiere folgende Funktionen: 
-   * `bin_to_hex(binary)`: übersetzt String mit 8-Bit Binärzahlen (mit Leerschlag getrennt) in Hexadezimalzahlen. 
-   * `hex_to_bin(hexa)`: umgekehrt 
-   * `string_to_bin(text)`: übersetzt Text in 8-Bit Binärzahlen 
-   * `string_to_hex(text)`: übersetzt Text in 8-Bit Hexzahlen 
- 
-===== - Weitere Aufgaben ===== 
- 
-Für alle Aufgaben zu den klassischen Verschlüsselungsmethoden verwenden wir ausschliesslich das Alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ" (26 Grossbuchstaben). 
- 
-=== Aufgabe W1 === 
- 
-Verschlüssle "XYLOPHON" von Hand mit Caesar, in dem du um 7 Stellen verschiebst. 
- 
-=== Aufgabe W2 === 
- 
-Entschlüssle die Nachricht "OSMVAEJVPNRENJFYWNN" von Hand. Sie wurde mit dem folgenden monoalphabetischen Verfahren verschlüsselt (Alphabet & Schlüssel): 
- 
-<code> 
-ABCDEFGHIJKLMNOPQRSTUVWXYZ # Alphabet 
-SOGVNPKWEFLMUJDHZRAIYTBXCQ # Schlüssel 
-</code> 
- 
-=== Aufgabe W3 === 
- 
-Das wievielte Zeichen der Unicode-Tabelle wird gespeichert in der Zahl `11011001 10110111`? 
- 
-=== Aufgabe W4 === 
- 
-Wandle ohne Hilfsmittel um: 
- 
-   1. Hex `18 9b b7 e3` -> Dez 
-   1. Welches Wort steckt dahinter? `01101000 01100001 01101100 01101100 01101111` 
-   1. Vergleiche die beiden ASCII-Zeichen: 
-     1. `01001000 01000001 01001100 01001100 01001111` 
-     1. `01101000 01100001 01101100 01101100 01101111` 
- 
- 
-===== Lösungen ===== 
- 
-<nodisp 2> 
- 
-++++Lösungen A| 
- 
-=== Aufgabe A1 === 
- 
-<code python> 
-### Code funktioniert für ALPHABET als String oder Liste 
-ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
-#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'] 
- 
-def encryption_caesar(cleartext,n): 
-    cleartext = cleartext.upper() # wandle Klartext in Grossbuchstaben um 
-    cipher = "" 
-    for c in cleartext: # alle Buchstaben des Klartextes durchgehen 
-        if c in ALPHABET: # überprüft, ob Buchstabe in ALPHABET vorkommt 
-            index = ALPHABET.index(c) + n # finde Index vom neuen Buchstaben, wende hier Caesar-Verschiebung an 
-            index = index % len(ALPHABET) # stelle sicher, dass Index nicht ausserhalb liegt 
-            cipher = cipher + ALPHABET[index] # füge neuen Buchstaben hinzu 
-        else: # falls nicht vorkommt, füge Buchstaben unverschlüsselt hinzu 
-            cipher = cipher + c 
-    return cipher 
- 
-print(encryption_caesar("I LIKE PIZZA!",3)) 
-</code> 
- 
-Um Code zu überprüfen, kann man einen Klartext mit $n$ verschlüsseln und den verschlüsselten Text mit $-n$ wieder entschlüsseln. Kommt wieder der ursprüngliche Text (in Grossbuchstaben) heraus, sollte die Funktion richtig sein: 
-<code python> 
-cipher = encryption_caesar("I LIKE PIZZA!",3) 
-print(encryption_caesar(cipher,-3)) 
-</code> 
- 
-=== Aufgabe A2 === 
- 
-== a) == 
- 
-"INFORMATIK IST SUPER" 
- 
-== b) == 
- 
-<code python> 
-cipher = "VLYET CZXLYDSZCY, OTP TYYZGLETGP DNSFWP TX RCFPYPY." 
-for n in range(len(ALPHABET)): 
-    print(n,encryption_caesar(cipher,-n)) 
- 
-# KANTI ROMANSHORN, DIE INNOVATIVE SCHULE IM GRUENEN. 
-</code> 
- 
-++++ 
- 
-++++Lösungen B| 
- 
-=== Aufgabe B1 === 
- 
-   1.  
-   1. TGXZKELMAV 
-   1.  
- 
-=== Aufgabe B2 === 
- 
-**Option 1:** 
- 
-<code python> 
-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', ' ', '.', ',', '!', '?'] 
- 
-def encryption_vigenere(cleartext,password): 
-    cleartext = upper(cleartext) 
-    password = upper(password) 
-    ciphertext = "" 
-    for i in range(len(cleartext)): 
-        c = cleartext[i] # symbol 
-        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             
- 
-print(encryption_vigenere("INFORMATIK","KSR")) 
-</code> 
- 
-**Option 2:** 
-<code python> 
-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 = ['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..', '-.--.', '-.--.-', '-....-', '.-.-.-', '-..-.', '-----', '.----', '..---', '...--', '....-', '--..--', '.....', '-....', '--...', '---..', '----.', '..--..'] 
- 
-def cleartext_to_morsecode(cleartext): 
-    cleartext = upper(cleartext) 
-    morsecode = "" 
-    for c in cleartext: 
-        if c in ALPHABET: 
-            i = ALPHABET.index(c) 
-            morsecode = morsecode + MORSE[i] + " " 
-    return morsecode 
- 
- 
-def morsecode_to_cleartext(morsecode): 
-    morsecode = morsecode.split(" ") 
-    cleartext = "" 
-    for m in morsecode: 
-        if m in MORSE: 
-            i = MORSE.index(m) 
-            cleartext = cleartext + ALPHABET[i] 
-    return cleartext 
-             
- 
-print(cleartext_to_morsecode("INFORMATIK")) 
-print(morsecode_to_cleartext(".. -. ..-. --- .-. -- .- - .. -.- ")) 
-</code> 
- 
-Da die beiden Funktionen fast identisch sind, kann man diese gewissermassen 'zusammenlegen': 
-<code python> 
-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 = ['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..', '-.--.', '-.--.-', '-....-', '.-.-.-', '-..-.', '-----', '.----', '..---', '...--', '....-', '--..--', '.....', '-....', '--...', '---..', '----.', '..--..'] 
- 
-def translate(message,alphabet_1,alphabet_2): 
-    """translate from one alphabet into the other""" 
-    translation = "" 
-    for c in message: 
-        if c in alphabet_1: 
-            i = alphabet_1.index(c) 
-            translation = translation + alphabet_2[i] + " " 
-    return translation 
-             
-def cleartext_to_morsecode(cleartext): 
-    return translate(upper(cleartext),ALPHABET,MORSE) 
- 
-def morsecode_to_cleartext(morsecode): 
-    return translate(morsecode.split(" "),MORSE,ALPHABET) 
- 
-print(cleartext_to_morsecode("INFORMATIK")) 
-print(morsecode_to_cleartext(".. -. ..-. --- .-. -- .- - .. -.- ")) 
-</code> 
- 
-++++ 
- 
- 
-++++Lösungen C| 
-=== Aufgabe C1 === 
- 
-   1. Ja, ist ein Sonderfall davon 
-   1. $26$ 
-   1. $26! = 403291461126605635584000000$, eine sehr grosse Zahl also 
-   1. Scheint auf den ersten Blick extrem sicher, ist sie aber nicht (siehe nächster Punkt). 
-   1. Brute Force nicht zielführend, da viel zu lange dauert. Stattdessen führt man eine **Häufigkeitsanalyse** durch. Man schaut, welche Buchstaben und Wörter in einer Sprache am häufigsten vorkommt und nutzt dies (siehe Aufgabe weiter unten). 
- 
- 
-=== Aufgabe C2 === 
- 
-PIZZAISTDASBESTEESSENDERWELT 
- 
-=== Aufgabe C3 === 
- 
-== Option 1: Version 1 == 
- 
-<code python> 
-def find_relative_frequency_single_line(line,alphabet): 
-    alph_cnt = [0 for i in range(len(ALPHABET))] 
-    line = lower(line) 
-    line = line.replace('ö','oe').replace('ü','ue').replace('ä','ae') 
-    line = line.replace('Ö','oe').replace('Ü','ue').replace('Ä','ae') 
-    line = line.replace('é','e').replace('è','e').replace('à','a') 
-    line = line.replace('ß','ss') 
-    for c in line: 
-        if c in alphabet: 
-            i = alphabet.index(c) 
-            alph_cnt[i] = alph_cnt[i] + 1 
-    return alph_cnt 
- 
-def display_relative_frequency(alphabet,alph_cnt): 
-    for i in range(len(alphabet)): 
-        print(alphabet[i] + ": " + str(round(alph_cnt[i]/sum(alph_cnt)*100,2)) + "%") 
- 
-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'] #, 'ü', 'ö', 'ä', 'è', 'é', 'à','ß','Ü','Ö','Ä'] 
-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.)' 
-count = find_relative_frequency_single_line(faust,ALPHABET) 
-display_relative_frequency(ALPHABET,count) 
-</code> 
- 
-== Option 1: Version 2 == 
- 
-<code python> 
-def replace_chars(line): 
-    line = lower(line) 
-    line = line.replace('ö','oe').replace('ü','ue').replace('ä','ae') 
-    line = line.replace('Ö','oe').replace('Ü','ue').replace('Ä','ae') 
-    line = line.replace('é','e').replace('è','e').replace('à','a') 
-    line = line.replace('ß','ss') 
-#    line = line.replace(' ','') 
-#    line = line.replace(',','') 
-#    line = line.replace('.','') 
-    return line 
- 
-def char_count_single_line(line,alphabet): 
-    alph_cnt = [0 for i in range(len(ALPHABET))] 
-    line = replace_chars(line) 
-    for c in line: 
-        if c in alphabet: 
-            i = alphabet.index(c) 
-            alph_cnt[i] = alph_cnt[i] + 1 
-    return alph_cnt 
-  
-def char_count_single_line_dict(line): 
-    alph_cnt = {} 
-    line = replace_chars(line) 
-    for c in line: 
-        if c.isalpha(): # check ob ist Buchstabe 
-            if c in alph_cnt: alph_cnt[c] += 1 # falls Eintrag nicht existiert in dict, erstelle diesen 
-            else: alph_cnt[c] = 1 
-    return alph_cnt 
- 
-def display_relative_frequency_list(alphabet,alph_cnt): 
-    for i in range(len(alphabet)): 
-        print(alphabet[i] + ": " + str(round(alph_cnt[i]/sum(alph_cnt)*100,2)) + "%") 
- 
-def display_relative_frequency_dict(alph_cnt): 
-    for key, value in alph_cnt.items(): 
-        print(key + ": " + str(round(value/sum(alph_cnt.values())*100,2)) + "%") 
- 
-### 
-faust = 'Habe nun, ach! Philosophie, ...' # Rest fehlt 
-### MIT LISTEN 
-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'] #, 'ü', 'ö', 'ä', 'è', 'é', 'à','ß','Ü','Ö','Ä'] 
-count = char_count_single_line(faust,ALPHABET) 
-display_relative_frequency_list(ALPHABET,count) 
-print() 
-### MIT DICT 
-count = char_count_single_line_dict(faust) 
-display_relative_frequency_dict(count) 
-</code> 
- 
-== Option 2 == 
- 
-<code python> 
-import urllib2 
- 
-def replace_umlaute(line): 
-    line = line.replace('ö','oe').replace('ü','ue').replace('ä','ae') 
-    line = line.replace('Ö','oe').replace('Ü','ue').replace('Ä','ae') 
-    line = line.replace('é','e').replace('è','e').replace('à','a') 
-    line = line.replace('ß','ss') 
-    return line 
- 
-def find_relative_frequency(alphabet,data,line_start,line_end,verbose=False): 
-    count = 0 
-    alph_cnt = [0 for i in range(len(ALPHABET))] 
-    for line in data: 
-        line = line.replace('\n', '').decode('utf-8') 
-        if line_start <= count <= line_end: 
-            if verbose: 
-                if count == line_start: print("first line: " + line) 
-                elif count == line_end: print("last line:  " + line) 
-            for c in replace_umlaute(line): 
-                if c.isalpha(): 
-                    c = lower(c) 
-                    try: 
-                        i = ALPHABET.index(c) 
-                        alph_cnt[i] = alph_cnt[i] + 1 
-                    except: 
-                        print("Can't find char in ALPHABET: " + c) 
-        count = count + 1 
-    return alph_cnt 
- 
-def display_relative_frequency(alphabet,alph_cnt): 
-    for i in range(len(alphabet)): 
-        print(alphabet[i] + ": " + str(round(alph_cnt[i]/sum(alph_cnt)*100,2)) + "%") 
- 
-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'] #, 'ü', 'ö', 'ä', 'è', 'é', 'à','ß','Ü','Ö','Ä'] 
- 
-alph_cnt = find_relative_frequency(ALPHABET,urllib2.urlopen("https://www.gutenberg.org/files/2229/2229-0.txt"),28,7183,True) # Faust 
-display_relative_frequency(ALPHABET,alph_cnt) 
-</code> 
- 
-=== Aufgabe C4 === 
- 
-Erste Paragraphen vom ersten Band von Harry Potter. 
- 
-++++ 
- 
-++++Lösungen D| 
- 
-=== Aufgabe D1 === 
- 
-   1. `*` 
-   1. 55 
-   1. "Romanshorn" 
- 
-=== Aufgabe D2 === 
- 
-Anzahl Zeichen mit x-Bytes: 
- 
-   1. $128$ 
-   1. $2048$ 
-   1. $65536$ 
-   1. $2097152$ 
- 
-Total also: $2164864$ 
- 
-=== Aufgabe D3 === 
- 
-Alle Fragen werden im Video beantwortet ausser diejenige wo man selbst rechnen muss. Antwort: $350$ 
- 
-=== Aufgabe D4 === 
- 
-<code python> 
-def unicode_symbol_number(b): 
-    b = b.replace(' ','') 
-    if len(b) == 8: 
-        return int(b[1:],2) 
-    elif len(b) == 16: 
-        byte_1 = b[:8] 
-        byte_2 = b[8:16] 
-        return int(byte_1[3:] + byte_2[2:],2) 
-    elif len(b) == 24: 
-        byte_1 = b[:8] 
-        byte_2 = b[8:16] 
-        return int(byte_1[4:] + byte_2[2:] + byte_3[2:],2) 
-    elif len(b) == 32: 
-        byte_1 = b[:8] 
-        byte_2 = b[8:16] 
-        byte_3 = b[16:24] 
-        byte_4 = b[24:32] 
-        return int(byte_1[5:] + byte_2[2:] + byte_3[2:] + byte_4[2:],2) 
-    else: 
-        raise Exception 
- 
-print(unicode_symbol_number("01000001")) 
-print(unicode_symbol_number("11000010 10000100")) 
-print(unicode_symbol_number("11000101 10011110")) 
-</code> 
- 
-++++ 
- 
-++++Lösungen E| 
- 
-==== Aufgabe E1 ==== 
- 
-`00111011 00010100 00001011` 
- 
-==== Aufgabe E2 ==== 
- 
-<code python> 
-def insert_blanks(b,n): 
-    for i in reversed(range(len(b)//n)): 
-        i = i + 1 
-        b = b[:i*n] + " " + b[i*n:] 
-    if b[-1] == " ": 
-        b = b[:-1] 
-    return b 
-     
-def encryption_xor_binary(plaintext,key,blanks=True): 
-    plaintext = plaintext.replace(' ','') 
-    key  = key.replace(' ','') 
-    cipher = "" 
-    # key verlaengern 
-    while len(key) < len(plaintext): 
-        key = key + key 
-    # xor 
-    for i in range(len(key)): 
-        a = int(plaintext[i]) 
-        b = int(key[i]) 
-        cipher = cipher + str(a^b) 
-    # immer nach 8 Stellen Leerschlag einfuegen (optional) 
-    if blanks: 
-        cipher = insert_blanks(cipher,8) 
-    return cipher 
-     
-print(encryption_xor_binary("01101000 01100001 01101100","01010011 01110101 01100111")) 
-</code> 
- 
-=== Aufgabe E3 === 
- 
-<code python> 
-def insert_blanks(b,n): 
-    for i in reversed(range(len(b)//n)): 
-        i = i + 1 
-        b = b[:i*n] + " " + b[i*n:] 
-    if b[-1] == " ": 
-        b = b[:-1] 
-    return b 
-     
-def encryption_xor_binary(plaintext_binary,key_binary,blanks=True): 
-    plaintext_binary = plaintext_binary.replace(' ','') 
-    key_binary = key_binary.replace(' ','') 
-    cipher_binary = "" 
-    # key verlaengern 
-    while len(key_binary) < len(plaintext_binary): 
-        key_binary = key_binary + key_binary 
-    # xor 
-    for i in range(len(plaintext_binary)): 
-        a = int(plaintext_binary[i]) 
-        b = int(key_binary[i]) 
-        cipher_binary = cipher_binary + str(a^b) 
-    # immer nach 8 Stellen Leerschlag einfuegen (optional) 
-    if blanks: 
-        cipher_binary = insert_blanks(cipher_binary,8) 
-    return cipher_binary 
- 
-def text_to_binary(text): 
-    binary = "" 
-    for c in text: 
-        # buchstaben in 8bit Binaerzahl umwandeln 
-        b = bin(ord(c))[2:] 
-        while len(b) < 8: # stellt sicher, dass 8 Stellen hat 
-            b = '0' + b 
-        # und hinzufuegen 
-        binary += " " + b  
-    return binary[1:] 
- 
-def binary_to_text(binary): 
-    binary = binary.split() 
-    text = "" 
-    for c in binary: 
-        text += chr(int(c,2)) 
-    return text 
-     
-def encryption_xor(plaintext,key): 
-    plaintext_binary = text_to_binary(plaintext) 
-    key_binary = text_to_binary(key) 
-    return encryption_xor_binary(plaintext_binary,key_binary) 
- 
-def decryption_xor(ciphertext_binary,key): 
-    key_binary = text_to_binary(key) 
-    decripted = encryption_xor_binary(ciphertext_binary,key_binary) 
-    return binary_to_text(decripted) 
- 
-msg = "Kanti Romanshorn, die innovative Schule im Grünen." 
-key = "Romanshorn" 
-cipher_bin = encryption_xor(msg,key) 
-decripted = decryption_xor(cipher_bin,key) 
-print(cipher_bin) 
-print(decripted) 
-</code> 
- 
-++++ 
- 
-++++Lösungen F| 
- 
-=== Aufgabe F1 === 
- 
-keine Lösung notwendig 
- 
-=== Aufgabe F2 === 
- 
-   1. `41 43 44 43` 
-   2. "ACDC" 
-   3. "KSR" 
- 
-=== Aufgabe F3 === 
- 
-keine Lösung 
- 
-++++ 
- 
-++++Aufgaben W| 
- 
-=== Aufgabe W1 === 
- 
-EFSVWOVU 
- 
-=== Aufgabe W2 === 
- 
-BALDSINDFERIENJUHEE 
- 
-=== Aufgabe W3 === 
- 
-1655 
- 
-=== Aufgabe W4 === 
- 
-   1.  
-   1. "HALLO" 
-   1. Gleicher Inhalt einfach einmal Grossbuchstsaben (`010.....`) und einmal Kleinbuchstaben (`011.....`) 
- 
-++++ 
- 
-</nodisp> 
  • gf_informatik/umgang_inet_sca/verschluesselung.1710076689.txt.gz
  • Zuletzt geändert: 2024-03-10 13:18
  • von sca