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:59] – [Symmetrische Verschlüsselung] gragf_informatik:encryption2 [2026-04-09 09:43] (aktuell) – [Aufgabe 4A – Vigenère-Funktion schreiben] gra
Zeile 29: 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 112: 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 122: 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 152: 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 229: 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 245: 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 261: 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 279: Zeile 279:
 ++++ ++++
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung:| ++++Lösung:|
 <code python> <code python>
Zeile 306: 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 424: 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 434: 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 469: 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.1714132799.txt.gz
  • Zuletzt geändert: 2024-04-26 11:59
  • von gra