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-16 19:11] – hof | gf_informatik:verschluesselung:codierung [2025-04-01 14:30] (aktuell) – 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, und mit `chr()` wieder zurück: | ||
+ | < | ||
+ | |||
+ | < | ||
+ | print(ord(letter))</ | ||
- | <code python> | + | <HTML>< |
- | letter = ' | + | |
- | print(ord(letter)) | + | |
- | >>> | ||
- | |||
- | print(chr(65)) | ||
- | |||
- | >>> | ||
- | </ | ||
Um die Zahl im Binärformat auszugeben, können wir die `format()` Funktion wie folgt verwenden: | Um die Zahl im Binärformat auszugeben, können wir die `format()` Funktion wie folgt verwenden: | ||
- | <code python> | + | <HTML>< |
- | print(format(65, | + | |
- | + | ||
- | >>> 1000001 | + | |
- | </code> | + | |
- | + | ||
#### String Formatierung | #### String Formatierung | ||
Oft möchten wir einen längeren Text ausgeben, wobei nur einzelne Teile an der richtigen Stelle eingefügt werden sollen. Dafür verwenden wir einen f-String, d.h. vor dem ersten Anführungszeichen steht der Buchstabe `f`. Im String können mit geschweiften Klammern Python-Ausdrücke (z.B. Variablen) in die Ausgabe eingefügt werden: | Oft möchten wir einen längeren Text ausgeben, wobei nur einzelne Teile an der richtigen Stelle eingefügt werden sollen. Dafür verwenden wir einen f-String, d.h. vor dem ersten Anführungszeichen steht der Buchstabe `f`. Im String können mit geschweiften Klammern Python-Ausdrücke (z.B. Variablen) in die Ausgabe eingefügt werden: | ||
- | <code python> | + | <HTML>< |
- | name = "Papa Moll" | + | |
age = 42 | age = 42 | ||
- | print(f" | + | print(f" |
- | </code> | + | |
Um das Ausgabeformat des Arguments zu kontrollieren, | Um das Ausgabeformat des Arguments zu kontrollieren, | ||
- | <code python> | + | <HTML>< |
- | # Die gleiche Zahl wird zweimal ausgegeben, einmal im normalen Dezimalformat, | + | # einmal im normalen Dezimalformat, |
- | # einmal als Binärzahl (b) mit einer Breite von mindestens 7 Stellen, die vorne mit Nullen (0) aufgefüllt | + | # einmal als Binärzahl (b) |
+ | # - mit einer Breite von mindestens 7 Stellen | ||
+ | # - vorne mit Nullen (0) aufgefüllt. | ||
number = 42 | number = 42 | ||
- | print(f" | + | print(f" |
- | </code> | + | |
### Aufgabe 1: ASCII-Tabelle erzeugen | ### Aufgabe 1: ASCII-Tabelle erzeugen | ||
- | Drucke eine ASCII-Tabelle aus mit folgendem | + | Drucke eine ASCII-Tabelle aus mit folgenden |
``` | ``` | ||
Zeile 61: | Zeile 51: | ||
``` | ``` | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
- | <code python ascii_table.py> | + | <HTML>< |
- | def printEntry(code): | + | print(f" |
- | print(f" | + | |
def printTable(): | def printTable(): | ||
Zeile 71: | Zeile 60: | ||
printEntry(ord(' | printEntry(ord(' | ||
printEntry(ord(' | printEntry(ord(' | ||
- | for code in range(ord(' | + | for code in range(ord(' |
printEntry(code) | printEntry(code) | ||
- | for code in range(ord(' | + | for code in range(ord(' |
printEntry(code) | printEntry(code) | ||
- | for code in range(ord(' | + | for code in range(ord(' |
printEntry(code) | printEntry(code) | ||
| | ||
- | printTable() | + | printTable()</ |
- | </code> | + | |
++++ | ++++ | ||
</ | </ | ||
Zeile 102: | Zeile 90: | ||
`01010011 01110101 01100111` | `01010011 01110101 01100111` | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
`00111011 00010100 00001011` | `00111011 00010100 00001011` | ||
Zeile 120: | Zeile 108: | ||
++++ | ++++ | ||
</ | </ | ||
- | |||
- | |||
### Aufgabe 4: XOR Verschlüsselung mit Python | ### Aufgabe 4: XOR Verschlüsselung mit Python | ||
In Python können wir einen String, der eine Binärzahl codiert, mit der `int()` Funktion in eine richtige Zahl verwandeln, indem wir die Basis `2` angeben: | In Python können wir einen String, der eine Binärzahl codiert, mit der `int()` Funktion in eine richtige Zahl verwandeln, indem wir die Basis `2` angeben: | ||
- | <code python> | + | <HTML>< |
- | print(int(' | + | |
- | </code> | + | |
Die binäre XOR-Operation wird in Python mit dem `^` Operator ausgeführt: | Die binäre XOR-Operation wird in Python mit dem `^` Operator ausgeführt: | ||
- | <code python> | + | <HTML>< |
- | one = ' | + | |
two = ' | two = ' | ||
Zeile 140: | Zeile 123: | ||
xor = one_number ^ two_number | xor = one_number ^ two_number | ||
- | print(" | + | print(f"{one} XOR {two} = {xor: |
- | </code> | + | |
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. | ||
- | * der Schlüssel lautet " | + | * der Schlüssel lautet " |
* die Buchstaben des Schlüssels werden alle 10 Buchstaben wieder von vorne verwendet. | * die Buchstaben des Schlüssels werden alle 10 Buchstaben wieder von vorne verwendet. | ||
* mit `split()` kann ein String in einzelne Wörter geteilt werden: `for word in "eins zwei drei" | * mit `split()` kann ein String in einzelne Wörter geteilt werden: `for word in "eins zwei drei" | ||
Zeile 154: | Zeile 136: | ||
``` | ``` | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
<code python decrypt.py> | <code python decrypt.py> | ||
Zeile 182: | Zeile 164: | ||
++++ | ++++ | ||
</ | </ | ||
+ | |||
+ | |||
### Aufgabe 5 (optional) | ### Aufgabe 5 (optional) | ||
- | Entschlüssle das folgende Bild mit einem *eigenen Code*. | + | Entschlüssle das folgende Bild mit einem *eigenen Code*. |
Klicke auf das Bild und lade es dann herunter. | Klicke auf das Bild und lade es dann herunter. | ||
Zeile 213: | Zeile 197: | ||
* `string.encode()` und `bytes.decode()` ([[https:// | * `string.encode()` und `bytes.decode()` ([[https:// | ||
- | <code python block_coder.py> | + | <HTML>< |
- | def textToBytes(text): | + | |
""" | """ | ||
numbers = [] | numbers = [] | ||
Zeile 289: | Zeile 272: | ||
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 1> | ||
+ | ++++ 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() | ||
</ | </ | ||
++++ | ++++ | ||
</ | </ | ||
+ |