Differences
This shows you the differences between two versions of the page.
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, | Idee: Ein Text wird verschleiert, | ||
- | ===== Pseudocode ===== | + | Es gibt also nur 25 mögliche Schlüssel, was die Entschlüsselung auch von Hand trivial macht. |
+ | |||
+ | ===== Pseudocode | ||
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=$"" | * $r=$"" | ||
* 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 | + | * Wenn $b$ ein Grossbuchstabe ist, sei $b$ der entsprechende |
* Wenn $b$ ein Kleinbuchstabe ist: | * Wenn $b$ ein Kleinbuchstabe ist: | ||
- | * Verschiebe $b$ um $k$ Position | + | * Verschiebe $b$ um $k$ Positionen |
* 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=$" | Was kommt als Resultat mit dem Input $t=$" | ||
+ | |||
+ | ==== Pseudocode allgemein ==== | ||
+ | Pseudocode ist eine Beschreibung eines Algorithmus (Rechenvorschrift, | ||
+ | |||
+ | 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**, | ||
+ | * **Wiederholungen** ganzer Programmteile | ||
+ | * Bedingte **Verzweigungen** (wenn das, dann das, sonst jenes) | ||
+ | * **Anweisungen**, | ||
+ | * 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 '' | + | * Die Funktion '' |
- | * Z.B. lieft '' | + | * Z.B. liefert |
* Die Funktion '' | * Die Funktion '' | ||
- | * Z.B. liefert '' | + | * Z.B. liefert '' |
- | * In Python (und fast allen Programmiersprachen) werden Texte und Zahlen streng unterschieden. So ist '' | + | * In Python (und fast allen Programmiersprachen) werden Texte und Zahlen streng unterschieden. So ist '' |
<code python caesar1.py> | <code python caesar1.py> | ||
Line 49: | Line 67: | ||
</ | </ | ||
+ | <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 | ||
+ | </ | ||
+ | Wenn der Code dann kopiert und gespeichert ist, kann er wie folgt ausgeführt werden: | ||
+ | <code bash> | ||
+ | python caesar.py | ||
+ | </ | ||
+ | </ | ||
==== 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(' | parser.add_argument(' | ||
parser.add_argument(' | parser.add_argument(' | ||
- | parser.add_argument(' | + | parser.add_argument(' |
# Auswerten | # Auswerten | ||
Line 161: | Line 190: | ||
<WRAP todo> | <WRAP todo> | ||
Probieren Sie das Programm auf alle Varianten aus (mit/ohne Input-Datei, | Probieren Sie das Programm auf alle Varianten aus (mit/ohne Input-Datei, | ||
+ | </ | ||
+ | |||
+ | <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 todo> | ||
+ | Knacken Sie folgenden Text: | ||
+ | <code txt> | ||
+ | bliqvkvokvfyevrsjkrveuvjzeujtynzvizxviqlviirkve | ||
+ | </ | ||
+ | <hidden Lösung auf der Kommandozeile> | ||
+ | In diesem Beispiel ist der verschlüsselte Text in der Datei '' | ||
+ | <code bash> | ||
+ | for a in `seq 1 25`; do echo $a; python caesar3.py -k $a -i humpfdidumpf.txt; | ||
+ | </ | ||
+ | </ | ||
</ | </ | ||
Line 167: | Line 213: | ||
Die hier programmierte Verschleierungsmethode ist insofern unschön, dass beim Entschlüsseln nicht unbedingt wieder der Originaltext herauskommt, | Die hier programmierte Verschleierungsmethode ist insofern unschön, dass beim Entschlüsseln nicht unbedingt wieder der Originaltext herauskommt, | ||
- | Erweitern Sie das Programm so, dass Grossbuchstaben auch in Grossbuchstaben verschleiert werden. Dazu müssen Sie die 2 Fälle gross/klein separat verschleiern. | + | Erweitern Sie das Programm so, dass Grossbuchstaben auch in Grossbuchstaben verschleiert werden. Dazu müssen Sie die 2 Fälle gross/klein separat verschleiern. |
</ | </ | ||
+ | <WRAP todo> | ||
+ | **Sehr anspruchsvolle Aufgabe** | ||
+ | |||
+ | Entwerfen Sie eine Methode (erst mal als Pseudocode), | ||
+ | |||
+ | <hidden Hilfe> | ||
+ | * https:// | ||
+ | * http:// | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Entschlüsseln ==== | ||
+ | Laden Sie beide Dateien herunter: {{lehrkraefte: | ||
+ | |||
+ | Verwenden Sie das Programm wie folgt: | ||
+ | <code bash> | ||
+ | python decryptor.py secret.txt | ||
+ | </ | ||
+ | Wobei der zu entschlüsselnde Text in der Datei '' |