lehrkraefte:blc:informatik:glf22:caesar

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:glf22:caesar [2022/08/31 08:12]
Ivo Blöchliger [Flexiblere Variante mit Kommandozeilenargumenten]
lehrkraefte:blc:informatik:glf22:caesar [2022/11/04 09:10] (current)
Ivo Blöchliger [Entschlüsseln]
Line 2: Line 2:
 Idee: Ein Text wird verschleiert, indem jeder Buchstabe $k$ Positionen weiter im Alphabet geschoben wird (wobei nach 'Z' wieder 'A' folgt). Idee: Ein Text wird verschleiert, indem jeder Buchstabe $k$ Positionen weiter im Alphabet geschoben wird (wobei nach 'Z' wieder 'A' folgt).
  
-===== Pseudocode =====+Es gibt also nur 25 mögliche Schlüssel, was die Entschlüsselung auch von Hand trivial macht. 
 + 
 +===== Pseudocode für die Verschleierung =====
 Im Pseudocode verwenden wir **Variablen**. Diese können im Laufe des Programms Ihre **Werte wechseln** (was in der Mathematik unüblich ist). Z.B. wird der Buchstabe $b$ u.U. mehrmals geändert, bevor er dem Resultat $r$ hinzugefügt wird (das sich auch in jeder Wiederholung ändert). Im Pseudocode verwenden wir **Variablen**. Diese können im Laufe des Programms Ihre **Werte wechseln** (was in der Mathematik unüblich ist). Z.B. wird der Buchstabe $b$ u.U. mehrmals geändert, bevor er dem Resultat $r$ hinzugefügt wird (das sich auch in jeder Wiederholung ändert).
  
Line 9: Line 11:
   * $r=$"" (leerer Text)   * $r=$"" (leerer Text)
   * Für jeden Buchstaben $b$ im Text $t$:   * Für jeden Buchstaben $b$ im Text $t$:
-    * Wenn $b$ ein Grossbuchstabe ist, sei $b$ der entsprechende Kleinbuchstaben+    * Wenn $b$ ein Grossbuchstabe ist, sei $b$ der entsprechende Kleinbuchstabe
     * Wenn $b$ ein Kleinbuchstabe ist:     * Wenn $b$ ein Kleinbuchstabe ist:
-      * Verschiebe $b$ um $k$ Position im Alphabet+      * Verschiebe $b$ um $k$ Positionen im Alphabet
     * Hänge $b$ hinten an $r$ an.     * Hänge $b$ hinten an $r$ an.
   * Das Resultat ist $r$.   * Das Resultat ist $r$.
Line 17: Line 19:
 Was kommt als Resultat mit dem Input $t=$"Hey You!" und $k=3$ heraus? Was kommt als Resultat mit dem Input $t=$"Hey You!" und $k=3$ heraus?
  
 +
 +==== Pseudocode allgemein ====
 +Pseudocode ist eine Beschreibung eines Algorithmus (Rechenvorschrift, z.B. ein Computerprogramm), die von Menschen gelesen werden soll. Ein Pseudocode richtet sich an ein bestimmtes Publikum und kann mehr oder weniger viele Elemente aus einer bestimmten Programmiersprache enthalten.
 +
 +Für das Zielpublikum müssen alle Anweisungen unmissverständlich klar sein und alle müssen für den gleichen Input das gleiche Resultat produzieren (von Flüchtigkeitsfehlern mal absgesehen).
 +
 +Zwingende Elemente sind:
 +  * Genaue Beschreibung vom **Input** (Art und womöglich Umfang).
 +  * Genaue Beschreibung vom **Output** (Art und womöglich Umfang).
 +  * Eigentlicher **Algorithmus**
 +Typische Elemente sind:
 +  * **Variablen**, um beliebige Dinge zu speichern (meist Zahlen oder Text). Variablen können ihren Inhalt im Laufe des Programms mehrmals ändern.
 +  * **Wiederholungen** ganzer Programmteile
 +  * Bedingte **Verzweigungen** (wenn das, dann das, sonst jenes)
 +  * **Anweisungen**, was mit welchen Variablen zu tun ist.
 +  * Evtl. Unterprogramme und/oder Funktionen, um einen Algorithmus in mehrere Algorithmen zu zerlegen.
 ===== Python-Code ===== ===== Python-Code =====
 ==== Einfachste Version ==== ==== Einfachste Version ====
 Der Text und der Schlüssel werden direkt im Programm festgelegt. Die Ausgabe erfolgt auf der Konsole. Der Text und der Schlüssel werden direkt im Programm festgelegt. Die Ausgabe erfolgt auf der Konsole.
  
-  * Die Funktion ''ord'' liefert den ASCII-Code (eine Zahl) für ein gegebenes Symbol (Buchstabe), d.h. die dem Symbol zugordnete Nummer. +  * Die Funktion ''ord'' liefert den ASCII-Code (eine Zahl) für ein gegebenes Symbol (Buchstabe), d.h. die dem Symbol zuordnete Nummer. 
-    * Z.B. lieft ''ord('A')'' die Zahl 65, oder ''ord(' ')'' Die Zahl 32 (Code vom Leerschlag).+    * Z.B. liefert ''ord('A')'' die Zahl 65, oder ''ord(' ')'' Die Zahl 32 (Code vom Leerschlag).
   * Die Funktion ''chr'' liefert das Symbol (als Text) für den gegebenen ASCII-Code (Zahl).   * Die Funktion ''chr'' liefert das Symbol (als Text) für den gegebenen ASCII-Code (Zahl).
-    * Z.B. liefert ''chr(65)'' den Text ''"A"'', ''chr(97)'' den Text ''"a"''+    * Z.B. liefert ''chr(65)'' den Text '' 'A'', ''chr(97)'' den Text '' 'a''
-  * In Python (und fast allen Programmiersprachen) werden Texte und Zahlen streng unterschieden. So ist ''3'' und ''"3"'' nicht das Gleiche. ''3'' steht für die Zahl 3 (womit auch gerechnet werden kann) und ''"3"'' steht für das Symbol (mit ASCII Code 51).+  * In Python (und fast allen Programmiersprachen) werden Texte und Zahlen streng unterschieden. So ist ''3'' und '' '3'' nicht das Gleiche. ''3'' steht für die Zahl 3 (womit auch gerechnet werden kann) und '' '3'' steht für das Symbol (mit ASCII Code 51).
  
 <code python caesar1.py> <code python caesar1.py>
Line 49: Line 67:
 </code> </code>
  
 +<WRAP todo> 
 +Gehen Sie in ein geeignetes Verzeichnis (eventuell neu anlegen) und öffnen Sie eine neue Datei in VSCode: 
 +<code bash> 
 +mkdir caesar 
 +cd caesar 
 +code caesar.py 
 +</code> 
 +Wenn der Code dann kopiert und gespeichert ist, kann er wie folgt ausgeführt werden: 
 +<code bash> 
 +python caesar.py 
 +</code> 
 +</WRAP>
 ==== In- und Output mit Dateien ==== ==== In- und Output mit Dateien ====
 Es werden direkt im Programmcode zwei Dateien und der Schlüssel festgelegt: Es werden direkt im Programmcode zwei Dateien und der Schlüssel festgelegt:
Line 107: Line 136:
 parser.add_argument('-i', '--infile', type=str, help="Optional: Datei, wovon gelesen werden soll.") parser.add_argument('-i', '--infile', type=str, help="Optional: Datei, wovon gelesen werden soll.")
 parser.add_argument('-o', '--outfile', type=str, help="Optional: Datei, wohin das Resultat geschrieben werden soll.") parser.add_argument('-o', '--outfile', type=str, help="Optional: Datei, wohin das Resultat geschrieben werden soll.")
-parser.add_argument('-f', '--force', action="store_true", help="Output-Datei wird überschreiben, falls sie schon existiert");+parser.add_argument('-f', '--force', action="store_true", help="Output-Datei wird überschrieben, falls sie schon existiert");
  
 # Auswerten # Auswerten
Line 161: Line 190:
 <WRAP todo> <WRAP todo>
 Probieren Sie das Programm auf alle Varianten aus (mit/ohne Input-Datei, mit/ohne Output-Datei). Probieren Sie das Programm auf alle Varianten aus (mit/ohne Input-Datei, mit/ohne Output-Datei).
 +</WRAP>
 +
 +<WRAP todo>
 +Verschleiern Sie einen kleinen Text mit einem «geheimen» Schlüssel. Tauschen Sie die Text-Dateien (kein Word bitte!) mit Ihrem Banknachbar aus. Entschleiern Sie dann den Text. Können Sie den richtigen Schlüssel auf Anhieb erraten?
 +</WRAP>
 +
 +<WRAP todo>
 +Knacken Sie folgenden Text:
 +<code txt>
 +bliqvkvokvfyevrsjkrveuvjzeujtynzvizxviqlviirkve
 +</code>
 +<hidden Lösung auf der Kommandozeile>\
 +In diesem Beispiel ist der verschlüsselte Text in der Datei ''humpfdidumpf.txt'' gespeichert.
 +<code bash>
 +for a in `seq 1 25`; do  echo $a; python caesar3.py -k $a -i humpfdidumpf.txt; done
 +</code>
 +</hidden>
 </WRAP> </WRAP>
  
Line 167: Line 213:
  
 Die hier programmierte Verschleierungsmethode ist insofern unschön, dass beim Entschlüsseln nicht unbedingt wieder der Originaltext herauskommt, weil Grossbuchstaben zu Kleinbuchstaben konvertiert werden. Die hier programmierte Verschleierungsmethode ist insofern unschön, dass beim Entschlüsseln nicht unbedingt wieder der Originaltext herauskommt, weil Grossbuchstaben zu Kleinbuchstaben konvertiert werden.
-Erweitern Sie das Programm so, dass Grossbuchstaben auch in Grossbuchstaben verschleiert werden. Dazu müssen Sie die 2 Fälle gross/klein separat verschleiern. Bauen Sie dazu weitere ''if'' und ''else'' Blöcke ein.+Erweitern Sie das Programm so, dass Grossbuchstaben auch in Grossbuchstaben verschleiert werden. Dazu müssen Sie die 2 Fälle gross/klein separat verschleiern. Ersetzen Sie dazu den ''if''-Block, wo Gross- zu Kleinbuchstaben ersetzt werden mit einem entsprechenden Block, der die Verschleierung von Grossbuchstaben vornimmt (analog zur Verschleierung der Kleinbuchstaben).
 </WRAP> </WRAP>
  
 +<WRAP todo>
 +**Sehr anspruchsvolle Aufgabe**
 +
 +Entwerfen Sie eine Methode (erst mal als Pseudocode), das beliebige deutsche verschleierte Texte automatisch entschlüsselt (bzw. den wahrscheinlichsten Schlüssel findet).
 +
 +<hidden Hilfe>
 + * https://de.wikipedia.org/wiki/Buchstabenh%C3%A4ufigkeit
 + * http://www.mathe.tu-freiberg.de/~hebisch/cafe/kryptographie/bigramme.html
 +</hidden>
 +</WRAP>
 +
 +
 +==== Entschlüsseln ====
 +Laden Sie beide Dateien herunter: {{lehrkraefte:blc:informatik:glf22:decryptor.py}} {{lehrkraefte:blc:informatik:glf22:bigramme.py}}
 +
 +Verwenden Sie das Programm wie folgt:
 +<code bash>
 +python decryptor.py secret.txt
 +</code>
 +Wobei der zu entschlüsselnde Text in der Datei ''secret.txt'' gespeichert ist (kann natürlich auch anders heissen).
  • lehrkraefte/blc/informatik/glf22/caesar.1661926336.txt.gz
  • Last modified: 2022/08/31 08:12
  • by Ivo Blöchliger