| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung |
| gf_informatik:encryption2 [2024-05-02 20:29] – [Aufgabe 8 – Funktion cryptXOR testen] gra | gf_informatik:encryption2 [2026-04-09 09:43] (aktuell) – [Aufgabe 4A – Vigenère-Funktion schreiben] gra |
|---|
| * <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: |
| </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. |
| - 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> |
| - 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> |
| 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. |
| \\ | \\ |
| |
| - 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. |
| * ''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.)) |
| ++++ | ++++ |
| |
| ++++ | ++++ |
| |
| <nodisp 2> | <nodisp 1> |
| ++++Lösung:| | ++++Lösung:| |
| <code python> | <code python> |
| * 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> |
| * 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> | </code> |
| ++++ | ++++ |
| | </nodisp> |
| \\ | \\ |
| === Aufgabe 8 – Funktion cryptXOR testen === | === Aufgabe 8 – Funktion cryptXOR testen === |