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-05 12:28] – [Aufgabe D2] sca | gf_informatik:daten_sca:verschluesselung [2024-06-08 11:22] (aktuell) – 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 623: | Zeile 630: | ||
Theorie zu Zeichencodierung, | Theorie zu Zeichencodierung, | ||
- | |||
- | Siehe Slides {{ : | ||
==== Aufgaben D ==== | ==== Aufgaben D ==== | ||
+ | |||
+ | {{: | ||
=== Aufgabe D1 === | === Aufgabe D1 === | ||
Zeile 653: | Zeile 660: | ||
=== Aufgabe D3 === | === Aufgabe D3 === | ||
- | Welcher Text verbirgt sich hinter | + | Welcher Text verbirgt sich hinter |
+ | < | ||
+ | [69, 115, 32, 103, 105, 98, 116, 32, 49, 48, 32, 65, 114, 116, 101, 110, 32, 118, 111, 110, 32, 77, 101, 110, 115, 99, 104, 101, 110, 32, 105, 110, 32, 100, 101, 114, 32, 87, 101, 108, 116, 46, 32, 68, 105, 101, 32, 101, 105, 110, 101, 110, 32, 118, 101, 114, 115, 116, 101, 104, 101, 110, 32, 100, 97, 115, 32, 66, 105, 110, 97, 101, 114, 115, 121, 115, 116, 101, 109, 32, 117, 110, 100, 32, 100, 105, 101, 32, 97, 110, 100, 101, 114, 101, 110, 32, 110, 105, 99, 104, 116, 46] | ||
+ | </ | ||
+ | Hier soll *nicht* jede einzelne Zahl mit einem eigenen `chr()`-Befehl entziffert werden. Stattdessen soll man wie folgt vorgehen: | ||
- | <nodisp 2> | + | 1. In Schleife jede Zahl der Liste oben durchgeben. |
+ | 1. Zahl entziffern, also in Buchstaben umwandeln. | ||
+ | 1. Vor Schleife leeren String deklarieren. | ||
+ | 1. Jeden entzifferten Buchstaben hinten anhängen, so dass der String mit jedem Durchlauf der Schleife um eine Stelle wächst. | ||
- | ++++Lösungen D| | + | === Aufgabe D4 (optional) === |
- | D1: | + | In Python muss man oft Listen mit Werten befüllen, z.B. wenn man einen String in ASCII-Code übersetzen will. Typischerweise startet man mit einer leeren Liste. In einer Schleife ermittelt man dann alle Elemente und befüllt damit die Liste mit `append()`. Sogenannte **List-Comprehensions** ermöglichen einem, das gleiche in einer einzigen Zeile Code mit einem extrem kurzen Syntax zu realisieren. |
- | 1. Sommer | + | Beispiel: Liste mit Quadratzahlen |
- | 1. 70 97 104 114 114 97 100 | + | <code python> |
- | 1. Affe | + | # Normaler Weg, um eine Liste zu erstellen |
+ | squares = [] | ||
+ | for x in range(10): | ||
+ | squares.append(x ** 2) | ||
- | D2: | + | # Mit List Comprehension |
+ | squares = [x ** 2 for x in range(10)] | ||
+ | </ | ||
- | 1. * | + | Auftrag: |
- | 1. 55 | + | |
- | 1. 75 83 82 | + | |
- | 1. Gigampfi | + | |
- | ++++ | + | 1. Lasse dir von einer AI erklären, was List Comprehensions in Python sind und wie man diese implementiert. |
+ | 1. Übersetzte dann den String "List Comprehensions are great!" | ||
+ | 1. Löse Aufgabe D3 erneut, diesmal aber mit einer List Comprehension - wieder in einer einzigen Zeile Code. Tipp: Verwende `'' | ||
- | </ | ||
- | ==== Aufgaben D OLD ==== | + | === Aufgabe |
- | + | ||
- | + | ||
- | === Aufgabe | + | |
- | + | ||
- | Beantworte mithilfe von Python. | + | |
- | + | ||
- | 1. Welches Wort verbirgt sich hinter "82 111 109 97 110 115 104 111 114 110"? | + | |
- | + | ||
- | === Aufgabe D2 === | + | |
Wie viele Symbole kann man mit Unicode (1 bis 4 Bytes) darstellen? | Wie viele Symbole kann man mit Unicode (1 bis 4 Bytes) darstellen? | ||
Zeile 692: | Zeile 700: | ||
*Tipp:* Siehe Tabelle in Slides. | *Tipp:* Siehe Tabelle in Slides. | ||
- | === Aufgabe | + | === Aufgabe |
Studiere das Video und beantworte die Fragen unten: | Studiere das Video und beantworte die Fragen unten: | ||
Zeile 705: | Zeile 713: | ||
1. Wie werden die Buchstaben ' | 1. Wie werden die Buchstaben ' | ||
1. Das wievielte Zeichen der Unicode-Zeichentabelle wird durch die Binärzahl " | 1. Das wievielte Zeichen der Unicode-Zeichentabelle wird durch die Binärzahl " | ||
- | |||
- | === Aufgabe | + | === Aufgabe |
Unicode-Zeichen werden in 1-4 Byte-Binärzahlen gespeichert. Schreibe eine Funktion `unicode_symbol_number(b)`, | Unicode-Zeichen werden in 1-4 Byte-Binärzahlen gespeichert. Schreibe eine Funktion `unicode_symbol_number(b)`, | ||
Zeile 752: | Zeile 759: | ||
=== Aufgabe E1 === | === Aufgabe E1 === | ||
- | 1. Verschlüssle den Binärcode `01101000 01100001 01101100` mit diesem | + | Berechne *von Hand*, gib Resultate im gleichen Zahlenformat an wie die Zahlen in der Aufgabenstellung: |
+ | - $1011_2 \,^\wedge\, 1110_2=$ | ||
+ | - $101010_2 \,^\wedge\, 100110_2=$ | ||
+ | - $11 \,^\wedge\, 9=$ | ||
+ | - $27 \,^\wedge\, 21=$ | ||
+ | - $132 \,^\wedge\, 15=$ | ||
+ | |||
+ | === Aufgabe E2 === | ||
+ | |||
+ | Löse nun die Aufgaben von E1 mithilfe von Python. | ||
+ | |||
+ | Tipps: | ||
+ | * XOR Operator in Python ist `^` | ||
+ | * Binärzahl -> Dezimalzahl: | ||
+ | * Dezimalzahl -> Binärzahl: `bin(42)` | ||
+ | * Wandelt man Zahl in Binärzahl um mit `bin()`, so hat der Binärstring die Form `' | ||
+ | |||
+ | <code python> | ||
+ | s = bin(42) | ||
+ | print(s) # -> ' | ||
+ | s = s[2:] | ||
+ | print(s) # -> ' | ||
+ | </ | ||
+ | |||
+ | === Aufgabe E3 === | ||
+ | |||
+ | 1. Verschlüssle den Binärcode `01101000 01100001 01101100` mit XOR mit dem Schlüssel `01010011 01110101 01100111` | ||
1. Schreibe nun einen Code der dieses macht. Falls du Hilfe brauchst, siehe Tipps unten. | 1. Schreibe nun einen Code der dieses macht. Falls du Hilfe brauchst, siehe Tipps unten. | ||
Zeile 758: | Zeile 791: | ||
++++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. | ||
++++ | ++++ | ||
- | === Aufgabe | + | === Aufgabe |
Ziel dieser Aufgabe ist, deinen Code aus der letzten Aufgabe zu verallgemeinern und eine Funktion für die XOR-Verschlüsselung zu schreiben. | Ziel dieser Aufgabe ist, deinen Code aus der letzten Aufgabe zu verallgemeinern und eine Funktion für die XOR-Verschlüsselung zu schreiben. | ||
Zeile 778: | Zeile 811: | ||
++++ | ++++ | ||
- | === Aufgabe | + | === Aufgabe |
1. Schreibe eine Funktion `encryption_xor(plaintext, | 1. Schreibe eine Funktion `encryption_xor(plaintext, | ||
Zeile 802: | Zeile 835: | ||
* Beachte weiter, dass die resultierende Binärzahl 7 oder 8 Bits haben kann, was zu Problemen führen kann. Tipp: Stelle sicher, dass jede Binärzahl 8 Bits hat. Hänge also wenn nötig noch Nullen an. | * Beachte weiter, dass die resultierende Binärzahl 7 oder 8 Bits haben kann, was zu Problemen führen kann. Tipp: Stelle sicher, dass jede Binärzahl 8 Bits hat. Hänge also wenn nötig noch Nullen an. | ||
- | === Aufgabe | + | === Aufgabe |
Entschlüssle das folgende Bild mit einem *eigenen Code*. Der verwendete Schlüsselt findest du unten. | Entschlüssle das folgende Bild mit einem *eigenen Code*. Der verwendete Schlüsselt findest du unten. | ||
Zeile 825: | Zeile 858: | ||
++++ | ++++ | ||
+ | |||
+ | |||
===== - Advanced Encryption System (AES) ===== | ===== - Advanced Encryption System (AES) ===== | ||
Zeile 881: | Zeile 916: | ||
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 898: | Zeile 933: | ||
=== 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 1248: | Zeile 1285: | ||
=== Aufgabe D1 === | === Aufgabe D1 === | ||
- | | + | |
- | | + | |
- | | + | |
=== Aufgabe D2 === | === Aufgabe D2 === | ||
+ | |||
+ | 1. * | ||
+ | 1. 55 | ||
+ | 1. 75 83 82 | ||
+ | 1. Gigampfi | ||
+ | |||
+ | === Aufgabe D3 === | ||
+ | |||
+ | === Aufgabe D4 === | ||
+ | |||
+ | === Aufgabe D5 === | ||
Anzahl Zeichen mit x-Bytes: | Anzahl Zeichen mit x-Bytes: | ||
Zeile 1263: | Zeile 1311: | ||
Total also: $2164864$ | Total also: $2164864$ | ||
- | === Aufgabe | + | === Aufgabe |
Alle Fragen werden im Video beantwortet ausser diejenige wo man selbst rechnen muss. Antwort: $350$ | Alle Fragen werden im Video beantwortet ausser diejenige wo man selbst rechnen muss. Antwort: $350$ | ||
- | === Aufgabe | + | === Aufgabe |
<code python> | <code python> | ||
Zeile 1299: | Zeile 1347: | ||
++++Lösungen E| | ++++Lösungen E| | ||
+ | |||
==== Aufgabe E1 ==== | ==== Aufgabe E1 ==== | ||
- | `00111011 00010100 00001011` | + | Lösungen: |
+ | - $101_2$ | ||
+ | - $1100_2$ | ||
+ | - $2$ | ||
+ | - $14$ | ||
+ | - $139$ | ||
==== Aufgabe E2 ==== | ==== Aufgabe E2 ==== | ||
+ | |||
+ | siehe E1 | ||
+ | |||
+ | ==== Aufgabe E3 ==== | ||
+ | |||
+ | `00111011 00010100 00001011` | ||
+ | |||
+ | ==== Aufgabe E4 ==== | ||
<code python> | <code python> | ||
Zeile 1335: | Zeile 1397: | ||
</ | </ | ||
- | === Aufgabe | + | === Aufgabe |
<code python> | <code python> |