Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| gf_informatik:verschluesselung:codierung [2025-03-24 09:04] – [Aufgabe 1: ASCII-Tabelle erzeugen] hof | gf_informatik:verschluesselung:codierung [2026-03-23 10:36] (aktuell) – [Aufgabe 2: XOR Anwenden] hof | ||
|---|---|---|---|
| Zeile 8: | Zeile 8: | ||
| [[https:// | [[https:// | ||
| - | |||
| ### Python | ### Python | ||
| - | In Python können wir einen Buchstaben mit der `ord()` Funktion in die entsprechende ASCII-Zahl verwandeln, und mit `chr()` wieder zurück: | + | In Python können wir einen Buchstaben mit der `ord()` Funktion in die entsprechende ASCII-Zahl verwandeln. `ord` steht für _ordinal value_, also die Ordnungszahl eines Buchstabens in der ASCII-Textcodierung. |
| < | < | ||
| Zeile 17: | Zeile 16: | ||
| print(ord(letter))</ | print(ord(letter))</ | ||
| + | Mit `chr()` kann ein Zahlencode wieder in den codierten Buchstaben zurückverwandelt werden. `chr` steht für _character_. | ||
| < | < | ||
| - | |||
| - | Um die Zahl im Binärformat auszugeben, können wir die `format()` Funktion wie folgt verwenden: | ||
| - | |||
| - | < | ||
| #### String Formatierung | #### String Formatierung | ||
| Zeile 42: | Zeile 38: | ||
| ### Aufgabe 1: ASCII-Tabelle erzeugen | ### Aufgabe 1: ASCII-Tabelle erzeugen | ||
| Drucke eine ASCII-Tabelle aus mit folgenden Einträgen: Buchstaben `a-z`, `A-Z`, Zifferen `0-9`, Leerzeichen ` `, Punkt `.` Für jeden Eintrag soll der Buchstabe sowie seine ASCII-Codierung in Dezimal- und im Binärformat enthalten sein. Das Binärformat soll 8 bits (=1 byte) enthalten und vorne mit Nullen aufgefüllt werden. | Drucke eine ASCII-Tabelle aus mit folgenden Einträgen: Buchstaben `a-z`, `A-Z`, Zifferen `0-9`, Leerzeichen ` `, Punkt `.` Für jeden Eintrag soll der Buchstabe sowie seine ASCII-Codierung in Dezimal- und im Binärformat enthalten sein. Das Binärformat soll 8 bits (=1 byte) enthalten und vorne mit Nullen aufgefüllt werden. | ||
| + | |||
| + | Die Ausgabe soll ungefähr so aussehen: | ||
| ``` | ``` | ||
| Zeile 54: | Zeile 52: | ||
| ++++Lösung: | ++++Lösung: | ||
| < | < | ||
| - | print(f" | + | print(f" |
| def printTable(): | def printTable(): | ||
| Zeile 90: | Zeile 88: | ||
| `01010011 01110101 01100111` | `01010011 01110101 01100111` | ||
| - | < | + | < |
| ++++Lösung: | ++++Lösung: | ||
| `00111011 00010100 00001011` | `00111011 00010100 00001011` | ||
| Zeile 126: | Zeile 124: | ||
| Mit diesen Informationen solltest du ein Programm schreiben können, das den folgenden Text entschlüsselt. | Mit diesen Informationen solltest du ein Programm schreiben können, das den folgenden Text entschlüsselt. | ||
| - | | + | |
| - | * die Buchstaben des Schlüssels werden alle 10 Buchstaben wieder | + | Hinweise: |
| - | * mit `split()` kann ein String in einzelne Wörter geteilt werden: `for word in "eins zwei drei" | + | |
| + | * Wandle den Schlüssel in eine Folge von ASCII-codierten Zahlen um: `[82, 79, 77, ...]`! | ||
| + | * Mit `split()` kann ein String in einzelne Wörter geteilt werden: `for word in "eins zwei drei" | ||
| + | * Wandle das Chiffrat in eine Liste von Zahlen um: `[22, 38, 40, ...]`! | ||
| + | * XOR-kombiniere nun immer eine Zahl aus dem Chiffrat mit einer Zahl aus dem Schlüssel! | ||
| + | * Die Buchstaben des Schlüssels werden alle 10 Buchstaben wieder von vorne verwendet. | ||
| + | * Wandle die resultierende Zahl mit `chr()` in Buchstaben um! | ||
| ``` | ``` | ||
| Zeile 164: | Zeile 168: | ||
| ++++ | ++++ | ||
| </ | </ | ||
| + | |||
| ### Aufgabe 5 (optional) | ### Aufgabe 5 (optional) | ||
| Zeile 196: | Zeile 201: | ||
| * `string.encode()` und `bytes.decode()` ([[https:// | * `string.encode()` und `bytes.decode()` ([[https:// | ||
| - | <code python block_coder.py> | + | <HTML>< |
| - | def textToBytes(text): | + | |
| """ | """ | ||
| numbers = [] | numbers = [] | ||
| Zeile 272: | Zeile 276: | ||
| 00111010 00100001 01101110 00100001 00100110 00100011 00100101 | 00111010 00100001 01101110 00100001 00100110 00100011 00100101 | ||
| 01101110 00110010 00100100 00100011 00110111 01101111""" | 01101110 00110010 00100100 00100011 00110111 01101111""" | ||
| - | print(decrypt(ciphertext, | + | print(decrypt(ciphertext, |
| + | ++++ | ||
| + | </ | ||
| + | |||
| + | <nodisp 2> | ||
| + | ++++ Lösung| | ||
| + | <code python> | ||
| + | import cv2 as cv | ||
| + | import numpy as np | ||
| + | import math | ||
| + | |||
| + | key = " | ||
| + | |||
| + | img = cv.imread(' | ||
| + | # Note that the key length (in bits) is not byte-aligned (not a multiple of 8). | ||
| + | print(img.size) | ||
| + | print(len(key)) | ||
| + | |||
| + | # Repeat the key as often as necessary to match the image length. | ||
| + | key = key * math.ceil(img.size*8 / len(key)) | ||
| + | key_offset = 0 | ||
| + | |||
| + | # Process each pixel | ||
| + | for x in range(img.shape[0]): | ||
| + | for y in range(img.shape[1]): | ||
| + | # each pixel is three bytes (24 bits), one each per color | ||
| + | b, g, r = img[x, y] | ||
| + | # fetch 24 bits of key material | ||
| + | key_bits = key[key_offset: | ||
| + | # encryption is XOR | ||
| + | b = int(b) ^ int(key_bits[0: | ||
| + | g = int(g) ^ int(key_bits[8: | ||
| + | r = int(r) ^ int(key_bits[16: | ||
| + | # replace the pixel values | ||
| + | img[x,y] = b, g, r | ||
| + | key_offset = key_offset + 24 | ||
| + | |||
| + | cv.imshow(' | ||
| + | cv.waitKey() | ||
| </ | </ | ||
| ++++ | ++++ | ||
| </ | </ | ||
| + | |||