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:encryption2 [2024-04-26 11:54] – [Symmetrische Verschlüsselung] gragf_informatik:encryption2 [2026-04-09 09:43] (aktuell) – [Aufgabe 4A – Vigenère-Funktion schreiben] gra
Zeile 1: Zeile 1:
 ====== Symmetrische Verschlüsselung ====== ====== Symmetrische Verschlüsselung ======
 <nodisp 2> <nodisp 2>
-++++HIDDEN – Wie können wir das Thema besser vermitteln:|  +++++HIDDEN – Verbesserungsvorschläge:|  
-  * Schüler:innen kommen grösstenteils nicht von selbst auf Vigenere-Funktion: Trotz vieler Tipps und ausgehend von der zuvor sehr genau betrachteten Caesar-Funktion, scheinen die meisten keine Ahnung zu haben, wie sie die Aufgabe angehen könnten. Auch eine vorgängige gemeinsame Besprechung und Zusammentragung der nötigen Änderungen gegenüber Ceasar half bei den meisten nur wenig. Sind die Tipps und anleitende Hilfestellungen eher verwirrend? Folgende Ideen+  * **Problem:** Schüler:innen kommen grösstenteils nicht von selbst auf Vigenere- oder XOR-Funktion: Trotz vieler Tipps und ausgehend von der zuvor sehr genau betrachteten Caesar-Funktion, scheinen die meisten nicht die geringste Ahnung zu haben, wie sie die Aufgabe angehen könnten. Auch eine vorgängige gemeinsame Besprechung und Zusammentragung der nötigen Änderungen gegenüber Ceasar half bei den meisten nur wenig. Sind die Tipps und anleitende Hilfestellungen eher verwirrend? 
-    * Möglichst viele Übungsaufgaben vor und zwischen den Aufgaben einfügen: For-Schleifen üben, Veränderungen von Zeichenketten üben, evtl. eine Funktion für die zufällige monoalphabetische Sub. analog Caesar, zwei Zeichenketten parallell durchgehen üben etc.+  * **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 //verstanden// werden. Selbst programmieren können müssen sie die Übungen, welche die einzelnen Teile dieser Funktionen vertiefen.     * Evtl. Lernziel ändern: Funktionen Vigenere, XOR und Caesar müssen am Ende nur //verstanden// werden. Selbst programmieren können müssen sie die Übungen, welche die einzelnen Teile dieser Funktionen vertiefen.
     * Das gemeinsam besprochene Vorgehen (erst Schritte in normaler Sprache (als Kommentare) notieren, dann diese in Code wandeln) muss ebenfalls früh geübt werden.     * Das gemeinsam besprochene Vorgehen (erst Schritte in normaler Sprache (als Kommentare) notieren, dann diese in Code wandeln) muss ebenfalls früh geübt werden.
Zeile 28: Zeile 29:
     * <color #00a2e8>Kryptographie:</color> Geheimschriften, Finden von sicheren Verschlüsselungsverfahren     * <color #00a2e8>Kryptographie:</color> Geheimschriften, Finden von sicheren Verschlüsselungsverfahren
     * <color #00a2e8>Kryptoanalyse:</color> Verschlüsselungen analysieren und “knacken”     * <color #00a2e8>Kryptoanalyse:</color> Verschlüsselungen analysieren und “knacken”
-  * <color #00a2e8> Klartext</color> – cleartext, plaintext+  * <color #00a2e8>Klartext</color> – cleartext, plaintext
   * <color #00a2e8>Chiffrat</color> – Geheimtext, ciphertex, verschlüsselter Text    * <color #00a2e8>Chiffrat</color> – Geheimtext, ciphertex, verschlüsselter Text 
-  * <color #00a2e8>Schlüssel</color> – key+  * <color #00a2e8>Schlüssel</color> – key: Zum Beispiel ein Text oder ein Wert, mit dem der Klartext in das Chiffrat und das Chirffat wieder in den Klartext gewandelt werden kann. Der Schlüssel alleine reicht noch nicht aus, um einen verschlüsselten Text zu entschlüsseln: Es braucht auch das richtige Verfahren.
   * <color #00a2e8>Verschlüsselungsverfahren</color>, auch <color #00a2e8>Chiffre</color>: Wandelt den Klartext in das Chiffrat und umgekehrt.   * <color #00a2e8>Verschlüsselungsverfahren</color>, auch <color #00a2e8>Chiffre</color>: Wandelt den Klartext in das Chiffrat und umgekehrt.
   * <color #00a2e8>Schlüsselraum</color> – Anzahl möglicher Schlüssel bei einem Verschlüsselungsverfahren:   * <color #00a2e8>Schlüsselraum</color> – Anzahl möglicher Schlüssel bei einem Verschlüsselungsverfahren:
Zeile 111: Zeile 112:
 </code> </code>
 **Beachte Folgendes:** **Beachte Folgendes:**
-  *  Die Funktion ''uppper()'' macht aus jedem Buchstaben in ''plainText'' einen Grossbuchstaben. Dadurch enthält die Variable ''letter'' immer einen Grossbuchstaben – egal, ob der Buchstabe in ''plainText'' gross oder klein war. Das ist wichtig, denn in der Zeichenkette ''ascii_uppercase'' befinden sich nur Grossbuchstaben und die Funktion ''find()'' würde darin nichts finden, wenn ''letter'' einen Kleinbuchstaben enthielte.+  *  Die Funktion ''upper()'' macht aus jedem Buchstaben in ''plainText'' einen Grossbuchstaben. Dadurch enthält die Variable ''letter'' immer einen Grossbuchstaben – egal, ob der Buchstabe in ''plainText'' gross oder klein war. Das ist wichtig, denn in der Zeichenkette ''ascii_uppercase'' befinden sich nur Grossbuchstaben und die Funktion ''find()'' würde darin nichts finden, wenn ''letter'' einen Kleinbuchstaben enthielte.
   * Damit ''index'' nicht grösser als 25 wird, wird die Addition index + key mit dem Modulo-Operator ergänzt: x modulo 26 (x % 26) gibt den Rest der Division x / 26 zurück: Für alle Werte grösser 26 gibt diese Operation also an, um //wieviel// grösser der Wert ist. Für index = 22 (Buchstabe 'W') und key = 5 ergäbe sich der Rest 1. Der neue Buchstabe wäre dann 'B' ('A' ist an Position 0).   * Damit ''index'' nicht grösser als 25 wird, wird die Addition index + key mit dem Modulo-Operator ergänzt: x modulo 26 (x % 26) gibt den Rest der Division x / 26 zurück: Für alle Werte grösser 26 gibt diese Operation also an, um //wieviel// grösser der Wert ist. Für index = 22 (Buchstabe 'W') und key = 5 ergäbe sich der Rest 1. Der neue Buchstabe wäre dann 'B' ('A' ist an Position 0).
   * In der letzten Zeile in der for-Schleife wird jeweils der neue Buchstabe zu der ''Zeichenkette'' cipherText hinzugefügt.   * In der letzten Zeile in der for-Schleife wird jeweils der neue Buchstabe zu der ''Zeichenkette'' cipherText hinzugefügt.
Zeile 121: 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.
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung:| ++++Lösung:|
 <code python caesar_01.py> <code python caesar_01.py>
Zeile 151: 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.
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung:| ++++Lösung:|
 <code python> <code python>
Zeile 228: Zeile 229:
 Als nicht-knackbar gilt das [[https://de.wikipedia.org/wiki/One-Time-Pad|one-time-pad (OTP)]], eine Einmalverschlüsselung, bei der das Schlüsselwort mindestens so lange wie der Klartext selbst und die eben nur ein einziges mal verwendet wird. Als nicht-knackbar gilt das [[https://de.wikipedia.org/wiki/One-Time-Pad|one-time-pad (OTP)]], eine Einmalverschlüsselung, bei der das Schlüsselwort mindestens so lange wie der Klartext selbst und die eben nur ein einziges mal verwendet wird.
  
-**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 244: 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.
  
-<nodisp 2>+<nodisp 1>
 ++++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 260: Zeile 261:
   * ''key\_count'' zählt durch das Schlüsselwort. Wäre das Schlüsselwort "BOB", so wäre key\_count erst 0, dann 1, dann 2, dann wieder 0 etc. Du musst also schauen, dass key\_count bei jedem Durchgang erhöht wird – aber nicht höher als die Länge des Schlüsselworts. ((Die Länge einer Zeichenkette ermittelst du mit der Funktion ''len(Zeichenkette)''.))   * ''key\_count'' zählt durch das Schlüsselwort. Wäre das Schlüsselwort "BOB", so wäre key\_count erst 0, dann 1, dann 2, dann wieder 0 etc. Du musst also schauen, dass key\_count bei jedem Durchgang erhöht wird – aber nicht höher als die Länge des Schlüsselworts. ((Die Länge einer Zeichenkette ermittelst du mit der Funktion ''len(Zeichenkette)''.))
   * ''shift\_letter'' ist der aktuelle Buchstaben aus dem Schlüsselwort. Wäre das Schlüsselwort "BOB", so wäre shift\_letter erst 'B', dann 'O', dann 'B' etc. Verwende folgende Code-Zeile: ''shift\_letter = key\_word[key\_count].upper()''. Damit ist shift\_letter immer ein Grossbuchstabe.   * ''shift\_letter'' ist der aktuelle Buchstaben aus dem Schlüsselwort. Wäre das Schlüsselwort "BOB", so wäre shift\_letter erst 'B', dann 'O', dann 'B' etc. Verwende folgende Code-Zeile: ''shift\_letter = key\_word[key\_count].upper()''. Damit ist shift\_letter immer ein Grossbuchstabe.
-  * ''shift'' ist der aktuelle Verschiebewert. Wäre das Schlüsselwort "BOB", so wäre ''shift'' erst 1, dann 14, dann 1, dann wieder 1 etc. Um shift zu ermitteln, benötigst du den shift\_letter und die Zeichenkette ''string.ascii\_uppercase''.((Du könntest auf die Variable shift\_letter auch verzichten und shift direkt in einer etwas komplizierteren Codezeile ermitteln. Schritt füt Schritt ist aber einfacher nachvollziehbar.))+  * ''shift'' ist der aktuelle Verschiebewert. Wäre das Schlüsselwort "BOB", so wäre ''shift'' erst 1, dann 14, dann 1, dann wieder 1 etc. Um shift zu ermitteln, benötigst du den shift\_letter und die Zeichenkette ''string.ascii\_uppercase''.((Du könntest auf die Variable shift\_letter auch verzichten und shift direkt in einer etwas komplizierteren Codezeile ermitteln. Schritt für Schritt ist aber einfacher nachvollziehbar.))
 ++++ ++++
  
-++++Test:|+++++Testcode:|
 Teste die Vigenere-Funktion mit folgendem Code: Teste die Vigenere-Funktion mit folgendem Code:
  
Zeile 278: Zeile 279:
 ++++ ++++
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung:| ++++Lösung:|
 <code python> <code python>
Zeile 305: Zeile 306:
   * Hierzu könnte ''encrypt'' einfach als Faktor verwendet werden, dann bräuchte es keine if-Abfrage.   * Hierzu könnte ''encrypt'' einfach als Faktor verwendet werden, dann bräuchte es keine if-Abfrage.
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung:| ++++Lösung:|
 <code python> <code python>
Zeile 423: Zeile 424:
 \\ \\
 === Aufgabe 7 – XOR-Verschlüsselung in python programmieren === === Aufgabe 7 – XOR-Verschlüsselung in python programmieren ===
-Schreibe eine Funktion ''cryptXOR(plainTextkeyWord)'': +Schreibe eine Funktion ''crypt\_xor(message\_inkey\_word)'': 
-  * Der Funktion übergibt man die Nachricht (Klartext) und das Schlüsselwort.+  * 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 433: Zeile 434:
   * Der XOR-Operator in python ist ein ''^'' (auf deiner Tastatur rechts neben dem Fragezeichen):   * Der XOR-Operator in python ist ein ''^'' (auf deiner Tastatur rechts neben dem Fragezeichen):
  
 +<nodisp 1>
 ++++Lösung:| ++++Lösung:|
 **Ausführliche Version:** **Ausführliche Version:**
 <code python> <code python>
-def cryptXOR(plainTextkeyWord): +def crypt_xor(message_inkey_word): 
-    kCount 0 +    message_out "" 
-    cipherText "" +    key_count 0 
-    for letter in plainText+    for letter in message_in
-        asciiClear = ord(letter) # ASCII-Code vom Klartextbuchstaben ermitteln  +        code_message_in = ord(letter) 
-        asciiKey = ord(keyWord[kCount]) # ASCII-Code vom Schlüsselwort-Buchstaben ermitteln +        code_key = ord(key_word[key_count]) 
-        asciiResult asciiClear asciiKey # Beide Codes verXORen +        code_message_out code_message_in code_key 
-        letter = chr(asciiResult# Zeichen zu diesem neuen ASCII-Code ermitteln +        letter = chr(code_message_out
-        kCount = (kCount + 1) % len(keyWord) +        message_out = message_out + letter 
-        cipherText = cipherText + letter +        key_count = (key_count + 1) % len(key_word
-    return cipherText+    return message_out
 </code> </code>
  
 **Kompakte Version:** **Kompakte Version:**
 <code python> <code python>
-def cryptXOR(plainTextkeyWord): +def crypt_xor(message_inkey_word): 
-    kCount 0 +    message_out "" 
-    cipherText "" +    key_count 0 
-    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])) 
-        kCount = (kCount + 1) % len(keyWord) +        message_out = message_out + letter 
-        cipherText = cipherText + letter +        key_count = (key_count + 1) % len(key_word
-    return cipherText+    return message_out
 </code> </code>
 ++++ ++++
 +</nodisp>
 \\ \\
 === Aufgabe 8 – Funktion cryptXOR testen === === Aufgabe 8 – Funktion cryptXOR testen ===
Zeile 468: Zeile 470:
 <code python> <code python>
 key = "WOLF" key = "WOLF"
-cipher = cryptXOR("Nur ein garstiges Aschenputtel ist noch da. Das sitzt unten in der Asche, dem kann der Pantoffel nicht passen!", key)+cipher = crypt_xor("Nur ein garstiges Aschenputtel ist noch da. Das sitzt unten in der Asche, dem kann der Pantoffel nicht passen!", key)
 print(cipher) print(cipher)
-print(cryptXOR(cipher, key))+print(crypt_xor(cipher, key))
 </code> </code>
  
  • gf_informatik/encryption2.1714132476.txt.gz
  • Zuletzt geändert: 2024-04-26 11:54
  • von gra