Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:daten_sca:verschluesselung [2024-05-26 19:37] – [Lösungen] sca | gf_informatik:daten_sca:verschluesselung [2026-05-11 11:55] (aktuell) – [Auftrag] sca | ||
|---|---|---|---|
| Zeile 2: | Zeile 2: | ||
| ++++Lernziele| | ++++Lernziele| | ||
| + | |||
| + | <nodisp 2> | ||
| + | TO ADD nach Prüfung 2024: | ||
| + | |||
| + | * alle Logikoperatoren | ||
| + | |||
| + | </ | ||
| Prüfungsrelevant ist alles, was in den Lektionen und Übungen behandelt wurde. Die Lernziele unten dienen als Gradmesser und sind nicht unbedingt komplett. | Prüfungsrelevant ist alles, was in den Lektionen und Übungen behandelt wurde. Die Lernziele unten dienen als Gradmesser und sind nicht unbedingt komplett. | ||
| Zeile 190: | Zeile 197: | ||
| Die Nachricht " | Die Nachricht " | ||
| + | |||
| + | Der Code kann ganz einfach gehalten werden, es muss z.B. keine Funktion geschrieben werden. | ||
| ++++Tipps| | ++++Tipps| | ||
| Zeile 213: | Zeile 222: | ||
| === Zusatzaufgaben === | === Zusatzaufgaben === | ||
| + | |||
| + | == Monoalphabetische Verschlüsselung == | ||
| + | |||
| + | 1. Programmiere eine Funktion `random_key()`, | ||
| + | 1. Schreibe eine Funktionen `monoalphabetic_encryption(cleartext, | ||
| + | |||
| == Morsen == | == Morsen == | ||
| Zeile 447: | Zeile 462: | ||
| Mögliche Vorgehensweisen: | Mögliche Vorgehensweisen: | ||
| - | 1. **Einfach.** Idee: Gehe jeden Buchstabe des Alphabets durch und ermittle, wie oft dieser im Text vorkommt. | + | 1. **Einfach.** Idee: Gehe jeden Buchstabe des Alphabets |
| 1. Speichere das Alphabet in einer Liste oder einem String, z.B. `alphabet = " | 1. Speichere das Alphabet in einer Liste oder einem String, z.B. `alphabet = " | ||
| 1. Für jeden Buchstaben musst du irgendwo dessen Anzahl speichern. Verwende dazu eine Liste: Die erste Zahl darin steht für die Anzahl " | 1. Für jeden Buchstaben musst du irgendwo dessen Anzahl speichern. Verwende dazu eine Liste: Die erste Zahl darin steht für die Anzahl " | ||
| Zeile 453: | Zeile 468: | ||
| count = [0, | count = [0, | ||
| </ | </ | ||
| - | 1. Mit `text.count(buchstabe)` wird ermittelt, wie oft der Buchstabe `buchstabe` im Text `text` vorkommt. | + | |
| + | | ||
| 1. Gehe jeden Buchstabe in `alphabet` durch (Schleife!) und ermittle mit `count` dessen Anzahl. Speichere diese dann in der `count`-Liste. Nun sollte diese Liste für jeden Buchstaben die richtige Anzahl haben. | 1. Gehe jeden Buchstabe in `alphabet` durch (Schleife!) und ermittle mit `count` dessen Anzahl. Speichere diese dann in der `count`-Liste. Nun sollte diese Liste für jeden Buchstaben die richtige Anzahl haben. | ||
| 1. Ermittle, wie viele Buchstaben es insgesamt gibt (also Summe aller Zahlen in `count`). Dividiere jede Zahl in `count` durch diese Summe, um dessen Häufigkeit zu erhalten (sollte etwa $0.15$ für das " | 1. Ermittle, wie viele Buchstaben es insgesamt gibt (also Summe aller Zahlen in `count`). Dividiere jede Zahl in `count` durch diese Summe, um dessen Häufigkeit zu erhalten (sollte etwa $0.15$ für das " | ||
| 1. Gib nun jeden Buchstaben und dessen Häufigkeit aus.\\ \\ | 1. Gib nun jeden Buchstaben und dessen Häufigkeit aus.\\ \\ | ||
| - | 1. **Standard.** Idee: Gehe jedes Zeichen des Textes durch, | + | 1. **Standard.** Idee: Gehe jedes Zeichen des Textes durch. Ermittle zuerst, um welches Zeichen sich handelt (Position im Alphabet). Erhöhe |
| 1. Speichere das Alphabet in einer Liste oder einem String, z.B. `alphabet = " | 1. Speichere das Alphabet in einer Liste oder einem String, z.B. `alphabet = " | ||
| 1. Für jeden Buchstaben musst du irgendwo dessen Anzahl speichern. Verwende dazu eine Liste: Die erste Zahl darin steht für die Anzahl " | 1. Für jeden Buchstaben musst du irgendwo dessen Anzahl speichern. Verwende dazu eine Liste: Die erste Zahl darin steht für die Anzahl " | ||
| Zeile 574: | Zeile 590: | ||
| <code python> | <code python> | ||
| import unicodedata | import unicodedata | ||
| + | import hashlib | ||
| + | |||
| ALPHABET = " | ALPHABET = " | ||
| ################################### | ################################### | ||
| + | |||
| key = #TODO: HIER MUSS DER KEY FESTGELEGT WERDEN | key = #TODO: HIER MUSS DER KEY FESTGELEGT WERDEN | ||
| ################################### | ################################### | ||
| + | |||
| + | # key check using hashes | ||
| + | keys_hashed = [' | ||
| + | if not hashlib.sha256(key.encode()).hexdigest() in keys_hashed: | ||
| + | raise Exception(' | ||
| for c in key: | for c in key: | ||
| if c not in ALPHABET: raise Exception(" | if c not in ALPHABET: raise Exception(" | ||
| + | |||
| def encryption_vigenere(cleartext, | def encryption_vigenere(cleartext, | ||
| cleartext = cleartext.replace(' | cleartext = cleartext.replace(' | ||
| Zeile 619: | Zeile 642: | ||
| </ | </ | ||
| ++++ | ++++ | ||
| + | |||
| + | <nodisp 2> | ||
| + | |||
| + | ++++LEHRER INFO WICHTIG!| | ||
| + | |||
| + | Die hashed PW müssen jeweils angepasst werden! | ||
| + | |||
| + | Code dafür: | ||
| + | |||
| + | <code python> | ||
| + | import hashlib | ||
| + | |||
| + | text = " | ||
| + | |||
| + | pws = [' | ||
| + | |||
| + | for text in pws: | ||
| + | hashed = hashlib.sha256(text.encode()).hexdigest() | ||
| + | print(hashed) | ||
| + | </ | ||
| + | |||
| + | ++++ | ||
| + | |||
| + | </ | ||
| + | |||
| + | === Auftrag === | ||
| + | |||
| + | ++++Vorbereitung LP| | ||
| + | |||
| + | 1. keys ausdenken, immer 1 key pro 4-5 SuS | ||
| + | 1. auf Zetteli schreiben | ||
| + | 1. hashes in Code anpassen (überprüft, | ||
| + | 1. Teams-Chat erstellen | ||
| + | |||
| + | ++++ | ||
| + | |||
| + | |||
| + | Vorbereitung SuS: | ||
| + | |||
| + | 1. Schotte dich ab: Einzeln sitzen, Kopfhörer | ||
| + | 1. Kopiere Vigenere-Code von oben in Browser. | ||
| + | 1. Jede Person kriegt von LP einen geheimen key. Keep it private! | ||
| + | 1. Tippe key in Code: `key = ...`. Führe Code aus. Falls kein Fehler, ist key korrekt! | ||
| + | |||
| + | |||
| + | Durchführung | ||
| + | |||
| + | Ziele: | ||
| + | |||
| + | * Jeweils 4-5 Personen bilden eine Gruppe und haben das gleiche Passwort. | ||
| + | * Schreibe verschlüsselte Nachrichten im Chat. | ||
| + | * Finde alle Gruppenmitglieder. | ||
| + | * Dann löst Rätsel (-> Slides) | ||
| + | * Dann plaudert in der Gruppe miteinander: | ||
| + | * Witz erzählen! | ||
| + | * Ferienpläne diskutieren. | ||
| + | * ... | ||
| + | |||
| + | |||
| + | Regeln: | ||
| + | |||
| + | * NUR VERSCHLÜSSELT KOMMUNIZIEREN! | ||
| ===== - Zeichencodierung ===== | ===== - Zeichencodierung ===== | ||
| Zeile 784: | Zeile 869: | ||
| ++++Tipps| | ++++Tipps| | ||
| - | 1. Entferne die Leerschläge in einem String `s` mit `s = s.replace(' | ||
| 1. Erstelle einen leeren String, dem du Stelle um Stelle die verschlüsselte Nachricht hinzufügst. | 1. Erstelle einen leeren String, dem du Stelle um Stelle die verschlüsselte Nachricht hinzufügst. | ||
| - | | + | 1. Gehe die Positionen des Binärcodes durch. An jeder Stelle bestimmst du den XOR-Wert mit der zugehörigen Ziffer im Schlüssel. Füge das Resultat dem String für die verschlüsselte Nachricht hinzu. |
| + | 1. Achtung: Die Leerschläge sollen natürlich *nicht* verschlüsselt werden. Am einfachsten überprüft man zuerst, ob das Zeichen an der aktuellen Position ein Leerschlag ist oder nicht. Falls ja, wird einfach wieder ein Leerschlag eingefügt, falls nicht, wird das Zeichen verschlüsselt. | ||
| ++++ | ++++ | ||
| Zeile 909: | Zeile 994: | ||
| 01010010 01001111 01001101 01000001 01001110 01010011 01001000 01001111 01010010 01001110 | 01010010 01001111 01001101 01000001 01001110 01010011 01001000 01001111 01010010 01001110 | ||
| </ | </ | ||
| - | Anstelle betrachtet man gerne die zugehörigen Darstellung im **Hexadezimalsystem** (Zahlensystem mit Basis $16$, Nennwerte $0, | + | Anstelle betrachtet man gerne die zugehörigen Darstellung im **Hexadezimalsystem** (Zahlensystem mit Basis $16$, Nennwerte $0, |
| Betrachten wir dazu das zweite Byte von oben: `01001111`. Die ersten vier Bits `0100` stehen für die Dezimalzahl $4$, was im Hexadezimalsystem ebenfalls $4$ ist. Die zweiten vier Bits `1111` stehen für $15$, im Hexadezimalsystem ist das `F`. Somit gilt: $$01001111_2 = 4F_{16}$$ | Betrachten wir dazu das zweite Byte von oben: `01001111`. Die ersten vier Bits `0100` stehen für die Dezimalzahl $4$, was im Hexadezimalsystem ebenfalls $4$ ist. Die zweiten vier Bits `1111` stehen für $15$, im Hexadezimalsystem ist das `F`. Somit gilt: $$01001111_2 = 4F_{16}$$ | ||
| Zeile 926: | Zeile 1011: | ||
| === Aufgabe F4 === | === Aufgabe F4 === | ||
| + | |||
| + | Ziele: Mit dem Online-Tool [[https:// | ||
| 1. Schreibe einen Code (einfach!), der dir einen 16 Byte (128 Bit) langen Zufallsstring mit Hexadezimalzahlen erstellt in der Form `e9 50 33 f9 99 81 a1 b8 6c 47 82 3d 84 59 9a bc`. Tipp: Mit `hex(132)[2: | 1. Schreibe einen Code (einfach!), der dir einen 16 Byte (128 Bit) langen Zufallsstring mit Hexadezimalzahlen erstellt in der Form `e9 50 33 f9 99 81 a1 b8 6c 47 82 3d 84 59 9a bc`. Tipp: Mit `hex(132)[2: | ||
| Zeile 974: | Zeile 1061: | ||
| ===== Lösungen ===== | ===== Lösungen ===== | ||
| - | < | + | < |
| ++++Lösungen A| | ++++Lösungen A| | ||