Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
gf_informatik:encryption2 [2024-04-25 06:24] – [Aufgabe 4A – Vigenère-Funktion schreiben] gra | gf_informatik:encryption2 [2024-06-06 11:38] (aktuell) – gra | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Symmetrische Verschlüsselung ====== | ====== Symmetrische Verschlüsselung ====== | ||
+ | <nodisp 2> | ||
+ | ++++HIDDEN – Verbesserungsvorschläge: | ||
+ | * **Problem: | ||
+ | * **Lösungen: | ||
+ | * Möglichst viele Übungsaufgaben vor und zwischen den Aufgaben einfügen: For-Schleifen üben, Veränderungen von Zeichenketten (mit eckigen Klammern) üben, evtl. eine Funktion für die zufällige monoalphabetische Sub. analog Caesar, zwei Zeichenketten parallell durchgehen üben etc. Sie müssen die nötigen Elemente sehr gut kennen. | ||
+ | * Evtl. Lernziel ändern: Funktionen Vigenere, XOR und Caesar müssen am Ende nur // | ||
+ | * Das gemeinsam besprochene Vorgehen (erst Schritte in normaler Sprache (als Kommentare) notieren, dann diese in Code wandeln) muss ebenfalls früh geübt werden. | ||
+ | * Möglichst viel auf einzelne Schüler: | ||
+ | ++++ | ||
+ | </ | ||
+ | |||
===== Übersicht ===== | ===== Übersicht ===== | ||
Das Ver- und Entschlüsseln von Nachrichten wird schon seit der Antike betrieben. | Das Ver- und Entschlüsseln von Nachrichten wird schon seit der Antike betrieben. | ||
Zeile 10: | Zeile 21: | ||
* die **Vigenère-Chiffre** als Beispiel einer // | * die **Vigenère-Chiffre** als Beispiel einer // | ||
* Ausserdem betrachten wir die **XOR-Verschlüsselung** als Beispiel einer modernen symmetrischen Verschlüsselung. Modern ist sie insofern, als sie mit Einsen und Nullen operiert und damit auf sämtliche Daten in digitaler Form anwendbar ist. | * Ausserdem betrachten wir die **XOR-Verschlüsselung** als Beispiel einer modernen symmetrischen Verschlüsselung. Modern ist sie insofern, als sie mit Einsen und Nullen operiert und damit auf sämtliche Daten in digitaler Form anwendbar ist. | ||
+ | |||
+ | \\ | ||
===== Begriffe ===== | ===== Begriffe ===== | ||
Zeile 24: | Zeile 37: | ||
* Der Schlüsselraum für die Caesar-Verschlüsselung ist 25, also knapp 5 Bit. | * Der Schlüsselraum für die Caesar-Verschlüsselung ist 25, also knapp 5 Bit. | ||
* <color # | * <color # | ||
+ | |||
+ | \\ | ||
===== Caesar-Verschlüsselung (monoalphabetische Substitution) ===== | ===== Caesar-Verschlüsselung (monoalphabetische Substitution) ===== | ||
Die Caesar-Verschlüsselung ist eine sehr einfache Form der **monoalphabetischen Substitution**. Bei der Substitution werden Buchstaben durch andere Buchstaben **ersetzt** (lat. // | Die Caesar-Verschlüsselung ist eine sehr einfache Form der **monoalphabetischen Substitution**. Bei der Substitution werden Buchstaben durch andere Buchstaben **ersetzt** (lat. // | ||
Zeile 31: | Zeile 46: | ||
Der Name der Caesar-Verschlüsselung geht auf den römischen Feldherrn Gaius Julius Caesar zurück, der diese Methode zur Verschlüsselung vertaulicher Botschaften benutzte. Sicher ist die Methode heute keineswegs: Am Geheimtext lässt sich anhand von Mustern leicht erkennen, dass es sich um ein Substitutions-Verfahren mit Verschiebung des Alphabets handelt. Und es sind nur 25 verschiedene Schlüssel (Verschiebewerte) möglich. So geht es sehr schnell, diese durchzuprobieren und auf den richtigen Schlüssel zu kommen. | Der Name der Caesar-Verschlüsselung geht auf den römischen Feldherrn Gaius Julius Caesar zurück, der diese Methode zur Verschlüsselung vertaulicher Botschaften benutzte. Sicher ist die Methode heute keineswegs: Am Geheimtext lässt sich anhand von Mustern leicht erkennen, dass es sich um ein Substitutions-Verfahren mit Verschiebung des Alphabets handelt. Und es sind nur 25 verschiedene Schlüssel (Verschiebewerte) möglich. So geht es sehr schnell, diese durchzuprobieren und auf den richtigen Schlüssel zu kommen. | ||
+ | \\ | ||
==== Caesar-Verschlüsselung mit python programmieren ==== | ==== Caesar-Verschlüsselung mit python programmieren ==== | ||
Programmiere einen Verschlüsselsungs-Algorithmus mit python! | Programmiere einen Verschlüsselsungs-Algorithmus mit python! | ||
Zeile 106: | Zeile 122: | ||
- Verbessere das Programm so, dass Leerschläge nicht verschoben werden, sodass das Chiffrat an den gleichen Stellen Leerschläge enthält wie der Klartext. Dein Programm soll erst den Klartext, dann das Chiffrat ausgeben. | - Verbessere das Programm so, dass Leerschläge nicht verschoben werden, sodass das Chiffrat an den gleichen Stellen Leerschläge enthält wie der Klartext. Dein Programm soll erst den Klartext, dann das Chiffrat ausgeben. | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
<code python caesar_01.py> | <code python caesar_01.py> | ||
Zeile 136: | Zeile 152: | ||
- Nutze die Funktion caesar(), um aus dem Chifrat wieder den Klartext zu generieren. Ergänze dein Programm, sodass es auch noch den dechiffrierten Klartext ausgibt. | - Nutze die Funktion caesar(), um aus dem Chifrat wieder den Klartext zu generieren. Ergänze dein Programm, sodass es auch noch den dechiffrierten Klartext ausgibt. | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
<code python> | <code python> | ||
Zeile 186: | Zeile 202: | ||
Du kannst diese Entschlüsselungsmethode [[https:// | Du kannst diese Entschlüsselungsmethode [[https:// | ||
* Wähle oben links unter Message '' | * Wähle oben links unter Message '' | ||
+ | |||
+ | \\ | ||
+ | |||
===== Vigenère-Verschlüsselung (polyalphabetische Substitution) ===== | ===== Vigenère-Verschlüsselung (polyalphabetische Substitution) ===== | ||
Die Vigenère-Chiffre funktioniert ähnlich wie die Caesar-Verschlüsselung; | Die Vigenère-Chiffre funktioniert ähnlich wie die Caesar-Verschlüsselung; | ||
Zeile 211: | Zeile 230: | ||
**Auch das Vigenère-Verfahren (mit wiederholt verwendeten Schlüsselwörtern) gilt angesichts heutiger Entschlüsselungsmethoden als unsicher**. | **Auch das Vigenère-Verfahren (mit wiederholt verwendeten Schlüsselwörtern) gilt angesichts heutiger Entschlüsselungsmethoden als unsicher**. | ||
+ | \\ | ||
+ | |||
\\ | \\ | ||
Zeile 224: | Zeile 245: | ||
- Welche Änderungen bzw. Ergänzungen musst du an der Caesar-Funktion vornehmen, damit sie zur Vigenere-Funktion wird und obige Anforderungen erfüllt? Notiere deine Ideen als Kommentare im Code. | - Welche Änderungen bzw. Ergänzungen musst du an der Caesar-Funktion vornehmen, damit sie zur Vigenere-Funktion wird und obige Anforderungen erfüllt? Notiere deine Ideen als Kommentare im Code. | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
- Der Name der Funktion und die Namen der Argumente ändern sich. | - Der Name der Funktion und die Namen der Argumente ändern sich. | ||
Zeile 243: | Zeile 264: | ||
++++ | ++++ | ||
- | ++++Test:| | + | ++++Testcode:| |
Teste die Vigenere-Funktion mit folgendem Code: | Teste die Vigenere-Funktion mit folgendem Code: | ||
Zeile 258: | Zeile 279: | ||
++++ | ++++ | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
<code python> | <code python> | ||
Zeile 284: | Zeile 305: | ||
* Wenn '' | * Wenn '' | ||
* Hierzu könnte '' | * Hierzu könnte '' | ||
+ | |||
+ | <nodisp 1> | ||
+ | ++++Lösung: | ||
+ | <code python> | ||
+ | import string | ||
+ | |||
+ | def vigenere(message, | ||
+ | ciphertext = "" | ||
+ | key_count = 0 | ||
+ | for letter in message.upper(): | ||
+ | index = string.ascii_uppercase.find(letter) | ||
+ | shift_letter = key_word[key_count].upper() | ||
+ | shift = string.ascii_uppercase.find(shift_letter) | ||
+ | if index != -1: # -1 means not found | ||
+ | index = (index + shift * encrypt) % 26 | ||
+ | letter = string.ascii_uppercase[index] | ||
+ | key_count = (key_count + 1) % len(key_word) | ||
+ | ciphertext = ciphertext + letter | ||
+ | return ciphertext | ||
+ | </ | ||
+ | ++++ | ||
+ | </ | ||
=== Aufgabe 5 – Vigenère-Funktion testen === | === Aufgabe 5 – Vigenère-Funktion testen === | ||
Teste deine (erweiterte) Vigenere-Funktion mit folgendem Code: | Teste deine (erweiterte) Vigenere-Funktion mit folgendem Code: | ||
Zeile 381: | Zeile 424: | ||
\\ | \\ | ||
=== Aufgabe 7 – XOR-Verschlüsselung in python programmieren === | === Aufgabe 7 – XOR-Verschlüsselung in python programmieren === | ||
- | Schreibe eine Funktion '' | + | Schreibe eine Funktion '' |
- | * Der Funktion übergibt man die Nachricht | + | * Der Funktion übergibt man die Nachricht und das Schlüsselwort. |
* Die Funktion gibt den ver- bzw. entschlüsselten Text zurück. | * Die Funktion gibt den ver- bzw. entschlüsselten Text zurück. | ||
* Auch Satzzeichen und Leerschläge werden verschlüsselt. | * Auch Satzzeichen und Leerschläge werden verschlüsselt. | ||
Zeile 391: | Zeile 434: | ||
* Der XOR-Operator in python ist ein '' | * Der XOR-Operator in python ist ein '' | ||
+ | <nodisp 1> | ||
++++Lösung: | ++++Lösung: | ||
**Ausführliche Version:** | **Ausführliche Version:** | ||
<code python> | <code python> | ||
- | def cryptXOR(plainText, keyWord): | + | def crypt_xor(message_in, key_word): |
- | | + | |
- | | + | |
- | for letter in plainText: | + | for letter in message_in: |
- | | + | |
- | | + | |
- | | + | |
- | letter = chr(asciiResult) # Zeichen zu diesem neuen ASCII-Code ermitteln | + | letter = chr(code_message_out) |
- | | + | |
- | cipherText = cipherText + letter | + | key_count |
- | return | + | return |
</ | </ | ||
**Kompakte Version:** | **Kompakte Version:** | ||
<code python> | <code python> | ||
- | def cryptXOR(plainText, keyWord): | + | def crypt_xor(message_in, key_word): |
- | | + | |
- | | + | |
- | for letter in plainText: | + | for letter in message_in: |
- | letter = chr(ord(letter) ^ ord(keyWord[kCount])) | + | letter = chr(ord(letter) ^ ord(key_word[key_count])) |
- | | + | |
- | cipherText = cipherText + letter | + | key_count |
- | return | + | return |
</ | </ | ||
++++ | ++++ | ||
+ | </ | ||
\\ | \\ | ||
=== Aufgabe 8 – Funktion cryptXOR testen === | === Aufgabe 8 – Funktion cryptXOR testen === | ||
Zeile 426: | Zeile 470: | ||
<code python> | <code python> | ||
key = " | key = " | ||
- | cipher = cryptXOR("Nur ein garstiges Aschenputtel ist noch da. Das sitzt unten in der Asche, dem kann der Pantoffel nicht passen!", | + | cipher = crypt_xor("Nur ein garstiges Aschenputtel ist noch da. Das sitzt unten in der Asche, dem kann der Pantoffel nicht passen!", |
print(cipher) | print(cipher) | ||
- | print(cryptXOR(cipher, key)) | + | print(crypt_xor(cipher, key)) |
</ | </ | ||