Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:verschluesselung:codierung [2025-03-16 19:11] hofgf_informatik:verschluesselung:codierung [2025-04-01 14:30] (aktuell) hof
Zeile 8: Zeile 8:
  
 [[https://cryptii.com/pipes/PbRHzQ|Probier es aus]]! [[https://cryptii.com/pipes/PbRHzQ|Probier es aus]]!
 +
 ### 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:
 +<HTML><script type="module" src="https://bottom.ch/ksr/ed/bottom-editor.js"></script></HTML>
 + 
 +<HTML><bottom-editor>letter = 'A'  # Muss ein einzelner Buchstabe sein!
 +print(ord(letter))</bottom-editor></HTML>
  
-<code python> +<HTML><bottom-editor>print(chr(65))</bottom-editor></HTML>
-letter = 'A'  # Muss ein einzelner Buchstabe sein! +
-print(ord(letter))+
  
->>> 65 
- 
-print(chr(65)) 
- 
->>> A 
-</code> 
  
 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><bottom-editor>print(format(65, "b"))</bottom-editor></HTML>
-print(format(65, "b")) +
- +
->>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><bottom-editor>name = "Papa Moll"
-name = "Papa Moll"+
 age = 42 age = 42
-print(f"Ich heisse {name} und bin {age*365} Tage alt.") +print(f"Ich heisse {name} und bin {age*365} Tage alt.")</bottom-editor></HTML>
-</code>+
  
 Um das Ausgabeformat des Arguments zu kontrollieren, fügen wir im entsprechenden Platzhalter eine _[[https://docs.python.org/3/library/string.html#format-specification-mini-language|Format Specification]]_ ein: nach der Variablen wird nach einem Doppelpunkt das Ausgabeformat eingeben, in Beispiel unten `07b`. Das `b` bedeutet wie oben die Ausgabe als Binärzahl; die vorangestellte `7` gibt die Breite (_width_) an, also, dass mindestens sieben Zeichen verwendet werden sollen; die `0` gibt an, mit welchem Zeichen wir die Zahl auffüllen wollen, wenn die Breite nicht erreicht wird: Um das Ausgabeformat des Arguments zu kontrollieren, fügen wir im entsprechenden Platzhalter eine _[[https://docs.python.org/3/library/string.html#format-specification-mini-language|Format Specification]]_ ein: nach der Variablen wird nach einem Doppelpunkt das Ausgabeformat eingeben, in Beispiel unten `07b`. Das `b` bedeutet wie oben die Ausgabe als Binärzahl; die vorangestellte `7` gibt die Breite (_width_) an, also, dass mindestens sieben Zeichen verwendet werden sollen; die `0` gibt an, mit welchem Zeichen wir die Zahl auffüllen wollen, wenn die Breite nicht erreicht wird:
  
-<code python> +<HTML><bottom-editor># Die gleiche Zahl wird zweimal ausgegeben
-# Die gleiche Zahl wird zweimal ausgegebeneinmal 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 werden.+# einmal als Binärzahl (b) 
 +#  - mit einer Breite von mindestens 7 Stellen 
 +#  - vorne mit Nullen (0) aufgefüllt.
 number = 42 number = 42
-print(f"Die Binärform von {number} ist {number:07b}") +print(f"Die Binärform von {number} ist {number:07b}")</bottom-editor></HTML>
-</code>+
 ### Aufgabe 1: ASCII-Tabelle erzeugen ### Aufgabe 1: ASCII-Tabelle erzeugen
-Drucke eine ASCII-Tabelle aus mit folgendem 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.
  
 ``` ```
Zeile 61: Zeile 51:
 ``` ```
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung:| ++++Lösung:|
-<code python ascii_table.py> +<HTML><bottom-editor>def printEntry(code): 
-def printEntry(code): +    print(f"{chr(code):2} | {code:7d} | {code:08b}"
-    print(f"{chr(code):2} | {code:7d} | {code:08b}")+
  
 def printTable(): def printTable():
Zeile 71: Zeile 60:
     printEntry(ord(' '))     printEntry(ord(' '))
     printEntry(ord('.'))     printEntry(ord('.'))
-    for code in range(ord('0'),ord('9')):+    for code in range(ord('0'),ord('9')+1):
         printEntry(code)         printEntry(code)
-    for code in range(ord('A'),ord('Z')):+    for code in range(ord('A'),ord('Z')+1):
         printEntry(code)         printEntry(code)
-    for code in range(ord('a'),ord('z')):+    for code in range(ord('a'),ord('z')+1):
         printEntry(code)         printEntry(code)
                  
-printTable() +printTable()</bottom-editor></HTML>
-</code>+
 ++++ ++++
 </nodisp> </nodisp>
Zeile 102: Zeile 90:
 `01010011 01110101 01100111` `01010011 01110101 01100111`
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung:| ++++Lösung:|
 `00111011 00010100 00001011` `00111011 00010100 00001011`
Zeile 120: Zeile 108:
 ++++ ++++
 </nodisp> </nodisp>
- 
- 
 ### 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><bottom-editor>print(int('101010', 2))</bottom-editor></HTML>
-print(int('101010', 2)) +
-</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><bottom-editor>one = '11110000'
-one = '11110000'+
 two = '01010101' two = '01010101'
  
Zeile 140: Zeile 123:
  
 xor = one_number ^ two_number xor = one_number ^ two_number
-print("{0} XOR {1} = {2:08b}".format(one, two, xor)+print(f"{one} XOR {two} = {xor:08b}")</bottom-editor></HTML>
-</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 "ROMANSHORN".+  * der Schlüssel lautet "ROMANSHORN", wobei immer der ASCII-Code jedes Buchstabens verwendet wird.
   * 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".split():`   * mit `split()` kann ein String in einzelne Wörter geteilt werden: `for word in "eins zwei drei".split():`
Zeile 154: Zeile 136:
 ``` ```
  
-<nodisp 2>+<nodisp 1>
 ++++Lösung:| ++++Lösung:|
 <code python decrypt.py> <code python decrypt.py>
Zeile 182: Zeile 164:
 ++++ ++++
 </nodisp> </nodisp>
 +
 +
 ### Aufgabe 5 (optional) ### Aufgabe 5 (optional)
  
-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*. Den verwendeten Schlüssel findest du unten.
  
 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://docs.python.org/3/library/stdtypes.html#str.encode|Python Dokumentation]])   * `string.encode()` und `bytes.decode()` ([[https://docs.python.org/3/library/stdtypes.html#str.encode|Python Dokumentation]])
  
-<code python block_coder.py> +<HTML><bottom-editor>def textToBytes(text):
-def textToBytes(text):+
     """Converts a string into a list of ASCII codes."""     """Converts a string into a list of ASCII codes."""
     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, key))+print(decrypt(ciphertext, key))</bottom-editor></HTML> 
 +++++ 
 +</nodisp> 
 + 
 +<nodisp 1> 
 +++++ Lösung| 
 +<code python> 
 +import cv2 as cv 
 +import numpy as np 
 +import math 
 +  
 +key = "11110000011001101100010000110101110010111001100100010110000111110001100101000101101110111111000000000011000000111110010111101010111110001110101010101000001111001010110110100111000000000011111111010001111100110111101001111010000001011101010000101111110101001100010101001011011101110101011001110100100001101110110011000110100100111100010011001100100111000000000011011110000100010010001110101100111101010100111100010001010100101100111101101011100110110000000000101000000010100111110010000011101000111001100000101011110000000100110011000001000101001000011101000100100100100010100111110011101011010101010110001011010001001010000111000100100010111001111100011100001000011001100011100110101101111001000110001001111010111111100001111111111111011101100101111100000101000101100101011111111110001010111000101010110011011010111111101111110100000100100101001000100101100111100010101011111111001001101000011001101111000111111110101100001100110110000101100000000010111110001011011010010010000111010010011001101010010100000011101111110100101001111110011010000101001111001111000000010101111001000101100110010111101111001000010110111101000110110101000101110001001011100111110010111001011111111010000010011000011101100110111001001000110001110110011011000011001010001111000101100100001010110011000001011100001011010011010001110101010001111000000111111101110011000010010000111010111000111000110" 
 + 
 +img = cv.imread('encryption/bild_raetsel_xor_1373.png'
 +# 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:key_offset + 24] 
 +        # encryption is XOR 
 +        b = int(b) ^ int(key_bits[0:8], 2) 
 +        g = int(g) ^ int(key_bits[8:16], 2) 
 +        r = int(r) ^ int(key_bits[16:24], 2) 
 +        # replace the pixel values 
 +        img[x,y] = b, g, r 
 +        key_offset = key_offset + 24 
 + 
 +cv.imshow('image',img) 
 +cv.waitKey()
 </code> </code>
 ++++ ++++
 </nodisp> </nodisp>
 +
  • gf_informatik/verschluesselung/codierung.1742152306.txt.gz
  • Zuletzt geändert: 2025-03-16 19:11
  • von hof