Bei der Caesar-Verschlüsselung werden alle Buchstaben um eine Anzahl Stellen verrückt. Im folgenden Beispiel wird jeder Buchstabe um drei Stellen nach hinten gerückt ($n=3$):
Der römische Feldherr Gaius Julius Caesar soll diese Art der Verschlüsselung für militärische Kommunikation verwendet haben. Um von Hand eine solche Nachricht zu entziffern, kann man eine Chiffrierscheibe verwenden:
Schreibe eine Funktion encryption_caesar(cleartext,n)
, die einen Klartext (cleartext) mithilfe der Caesar-Verschlüsselung in einen Geheimtext (ciphertext) umwandelt. Alle Buchstaben werden um $n$ Stellen im Alphabet nach hinten verschoben.
Hier ein paar Tipps:
s
kann man mit s = s.upper()
in Grossbuchstaben umwandeln.%
. Damit kannst du verhindern, dass du auf Element von Liste/String zugreifen möchtest, welches nicht darin liegt.ALPHABET
genannt. Es ist eine Python-Konvention, dass Konstanten, also Variablen, die sich im Verlaufe des Programms nicht verändern, mit lauter Grossbuchstaben geschrieben werden.# Option 1: Liste ALPHABET = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] ALPHABET.index('T') # finde Position von Symbol ALPHABET[12] # Element an angegebener Position # Option 2: String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ALPHABET.index('Z') # finde Position von Symbol ALPHABET.find('Z') # finde Position von Symbol ALPHABET[12] # Symbol an angegebener Position # beachte: Für Strings kann man index oder find verwenden. Unterschied: Sucht man nach einem Zeichen, welches nicht in ALPHABET vorkommen, gibt find -1 zurück und index gibt einen Fehler aus.
Die folgende Nachricht ist mit der Caesar-Verschlüsslung verschlüsselt, indem alle Buchstaben um $17$ Stellen nach hinten verschoben wurden: „ZEWFIDRKZB ZJK JLGVI!“
Was bedeutet die Nachricht?
Nutze deinen Code, um die folgende Nachricht zu knacken: „VLYET CZXLYDSZCY, OTP TYYZGLETGP DNSFWP TX RCFPYPY.“
Die Caesar-Verschlüsselung ist nicht sehr sicher. Überlege dir selbst (ohne googlen oder im Wiki weiter unten nachzusehen) eine besser Verschlüsslungsmethode. Bespreche deine Idee mit deiner Lehrperson und setze diese in einem Code um.
Bei der Caesar-Verschlüsselung werden alle Buchstaben des Klartextes um die gleiche Anzahl Stellen $n$ verschoben. Eine so verschlüsselte Nachricht ist extrem zu entschlüsseln, auch wenn man den Schlüssel (sprich die Zahl $n$) nicht kennt. Daher gibt es 'Weiterentwicklungen', der Caesar-Verschlüsselung. Die Buchstaben des Klartextes werden nach wie vor verschoben, aber nicht immer um die gleiche Anzahl Stellen:
Verwendung eines Schlüsselwortes, wessen Buchstaben angeben, um wie viele Stellen verschoben werden soll: Jeder Buchstabe im Passwort steht für eine Verschiebung. Beispiel: Klartext „INFORMATIK“ wird mit Passwort „ABED“ verschlüsselt:
Klartext | Verschiebung | Geheimtext |
---|---|---|
I | 1 (A) | J |
N | 2 (B) | P |
F | 5 (E) | K |
O | 4 (D) | S |
R | 1 (A) | S |
M | 2 (B) | O |
A | 5 (E) | F |
T | 4 (D) | X |
I | 1 (A) | J |
K | 2 (B) | M |
Bei der monoalphabetischen Verschlüsselung wird das das gesamte Alphabet durchmischt. Aus „ABCDEFGHIJKLMNOPQRSTUVWXYZ“ wird dann zum Beispiel „UELXBICNYAZJSQORTPKFMGVHWD“ oder „VSEIYHJTBUPANRCOQDLXFWKMZG“. Diese neu sortierte Version dient als Schlüssel und wird benötigt, um die Nachricht zu entziffern. Man muss also darauf achten, dass dieser nicht in feindliche Hände gelangt.
Für mehr Info, siehe Slides (am Anfang der Seite).
Tipp: Falls du die Aufgaben mit der Tastatur auf OneNote lösen möchtest, lohnt es sich, eine Monospace-Schriftart zu wählen, also eine, bei der alle Buchstaben genau gleich breit sind. Dies ist v.a. dann sehr nützlich, wenn man Wörter direkt untereinander schreiben will. Verwende dazu eine der beiden Schriftarten Courier oder Courier New.
Verschlüssle von Hand:
Entschlüssle nun von Hand. Hier muss man bedenken, dass man den Verschlüsselungsprozess umkehren muss.
Die Nachricht „RYDDUYKFXUKEBKFBBKKBQXBPVBJF“ wurde mit dem Schlüssel „UELXBICNYAZJSQORTPKFMGVHWD“ verschlüsselt. Schreibe ein Programm, mit welchem du die Nachricht im Klartext ermitteln kannst.
Wie sicher ist die Vigenère-Verschlüsselung? Wie kann man versuchen, eine mit Vigenère verschlüsselte Nachricht zu entschlüsseln, ohne dass man den Schlüssel kennt? Unter welchen Bedingungen ist dies möglich, unter welchen nicht?
Implementiere die Vigenère-Verschlüsslung:
cleartext
die Nachricht im Klartext. Speichere in einer Variablen key
das Schlüsselwort. Bestimme nun den zugehörigen Geheimtext (→ ciphertext
).encryption_vigenere(cleartext,key)
, die den Klartext und den Key entgegen nimmt und den entsprechenden Geheimtext zurückgibt. Verwende dazu deinen Code aus 1.
Geheimschriften sind auch eine Art der Verschlüsselung. Schreibe ein Programm, welches eine Klartext-Nachricht ins Morse-Alphabet übersetzt und umgekehrt: cleartext_to_morsecode(cleartext)
und morsecode_to_cleartext(morsecode)
. Die zu Nachrichten cleartext
und morsecode
sollen jeweils als String (und nicht Liste) der Funktion übergeben werden. Es kann aber durchaus Sinn machen, den String in der Funktion drin in eine Liste umzuwandeln (siehe falls nötig Tipps unten).
Tipps:
morsecode.split(" ")
teilt den String morsecode
immer dort, wo ein Leerschlag " "
vorkommt und erstellt eine Liste.Schreibe ein Code, mit welchem man Nachrichten ins Freimaurer-Alphabet übersetzen kann und umgekehrt. https://de.wikipedia.org/wiki/Freimaurer-Alphabet#Freimaurer-Code
Ist die verschlüsselte Nachricht lange genug, kann man eine Häufigkeitsanalyse durchführen. In der deutschen Sprache kommt der Buchstabe „E“ mit gut $16\%$ eindeutig am häufigsten vor. Kommt also in der verschlüsselten Nachricht der Buchstabe „Q“ am häufigsten vor, können wir davon ausgehen, dass es sich bei diesem eigentlich um ein „E“ handelt. Mit dieser Methode kann man zumindest einmal die häufigsten paar Buchstaben richtig bestimmen. Bei den weniger häufigen Buchstaben wird die Reihenfolge dann wohl nicht mehr ganz stimmen. Mit ein paar cleveren Vermutungen, kann man dies aber relativ einfach korrigieren. Kommt zum Beispiel im verschlüsselten Text häufig das Wort „HIE“ vor, dürfte es sich beim „H“ um wohl um ein „D“ handeln. Ein „S“ wäre auch eine Möglichkeit, aber da „S“ der dritthäufigste Buchstabe ist, wurde dieser wohl bereits korrekt erkannt. Dabei hilft es zu wissen, welche Wörter besonders oft vorkommen: Liste der häufigsten Wörter der deutschen Sprache
Häufigkeitsanalyse Buchstaben in der deutschen Sprache:
Buchstaben | Häufigkeit |
---|---|
E | 16.93% |
N | 10.53% |
I | 8.02% |
R | 6.89% |
S | 6.79% |
A | 6.12% |
T | 5.79% |
D | 4.98% |
H | 4.98% |
U | 4.48% |
L | 3.6% |
C | 3.16% |
G | 3.02% |
M | 2.55% |
O | 2.54% |
B | 1.96% |
W | 1.78% |
F | 1.49% |
K | 1.32% |
Z | 1.21% |
V | 0.84% |
P | 0.67% |
J | 0.24% |
X | 0.05% |
Y | 0.05% |
Q | 0.02% |
Beachte: Je nach Quelle variieren die genauen Werte. Die Analyse hängt natürlich davon ab, welche Texte man für die Analyse verwendet. Die grobe Reihenfolge ist aber immer gleich.
Der folgende Geheimtext wurde mit einer monoalphabetischen Verschlüsselung verschlüsselt ($26$ Grossbuchstaben, Zahlen und Sonderzeichen wurden unverschlüsselt übernommen):
Geheimtext:
QULSHLYYKXOET DHJULYXHDL. ETPSIPER. ZDUUJITE. RUY ETPSIPER FHDJOEPTDS RPT BTYTLSEPKXTL VDOLRBTDST RTY NOYUJJTLETITLY OLR RTY VTJTPLYUJTL UDITPSTLY. TY VPIS OLY HDPTLSPTDOLV OLR TPLTL ITNOVYDUXJTL FOD RTL YKXOEUEESUV. RUY ETPSIPER PYS HFFTL FOD GTDULRTDOLVTL OLR YKXOEPYKXT TLSBPKQEOLVTL. 1. JTLYKXTLIPER. BPD IPERTL TPLT YKXOEVTJTPLYKXUFS, UL RTD BPD YTEIYS VTDLT STPEXUITL. BPD YSTEETL RTL JTLYKXTL OLR RPT TLSBPKQEOLV YTPLTD ZHSTLSPUET PLY NTLSDOJ. 2. IPEROLVYGTDYSULRLPY. TPLT OJFUYYTLRT UEEVTJTPLIPEROLV HFFLTS SODTL FOD RPT NOQOLFS. YPT ITDTPSTS UOF ULYZDOKXY- OLR GTDULSBHDSOLVYGHEET UOFVUITL PL RTD VTYTEEYKXUFS GHD OLR PYS GHDUOYYTSNOLV FOD RPT YSORPTDFUXPVQTPS. BPD YPLR LTOVPTDPV, PLSTDTYYPTDS OLR HFFTL. BPD FHDRTDL QDPSPYKXTY RTLQTL OLR QDTUSPGPSUS. BPD TDJHVEPKXTL TPLT GPTEFUESPVT IPEROLV RODKX XTDUOYFHDRTDLRT, FUKXTDYZTNPFPYKXT OLR PLSTDRPYNPZEPLUDT FDUVTYSTEEOLVTL. 3. OLSTDDPKXS OLR ETPYSOLV. BPD FHDRTDL ETPYSOLV OLR TLVUVTJTLS. FHDRTDOLV XUS FHDRTDOLV NOJ NPTE. BPD QHJJOLPNPTDTL OLYTDT NPTET OLR GTDFHEVTL RPTYT PL TPLTD GPTEFUESPVTL ETXD- OLR ETDLOJVTIOLV. BPD IPTSTL DUOJ, RTL BTV NOD NPTETDDTPKXOLV JPSNOVTYSUESTL. 4. VTJTPLYKXUFS OLR QHJJOLPQUSPHL. BPD VTXTL UOFTPLULRTD NO OLR LTXJTL TPLULRTD TDLYS. BPD VTXTL DTYZTQSGHEE OLR BTDSYKXUSNTLR JPSTPLULRTD OJ. BPD ZFETVTL TPLT QHLYSDOQSPGT RPYQOYYPHLYQOESOD. BPD OLSTDYSOSNTL TPLULRTD PL RTD SUVEPKXTL UDITPS OLR OITDLTXJTL GTDULSBHDSOLV PL RTD VTJTPLYKXUFS. BPD ZFETVTL OLR FHDRTDL RPT VTJTPLYKXUFS OLR BPD VTYSUESTL VTJTPLYUJT ULEUYYT. BPD SDUVTL YHDVT NO OLYTDTD VTYOLRXTPS OLR OLYTDTD OJBTES. 5. TLSBPKQEOLV OLR PLLHGUSPHL. BPD FHDRTDL TLSBPKQEOLV OLR PLLHGUSPHL, RPT OLYTDTJ IPEROLVYGTDYSULRLPY TLSYZDTKXTL. ITBUXDSTY TLSBPKQTEL BPD BTPSTD. BPD OITDZDOFTL OLR YPKXTDL RPT MOUEPSUS DTVTEJUYYPV. BPD ETDLTL UOY TDFHEVTL OLR JPYYTDFHEVTL VETPKXTDJUYYTL. 6. HFFTLSEPKXQTPS. BPD ULUEWYPTDTL VTYTEEYKXUFSEPKXT TLSBPKQEOLVTL OLR ITNPTXTL RPTYT PL OLYTDT TLSYKXTPROLVTL JPS TPL. BPD YKXUFFTL VTETVTLXTPSTL FOD ITVTVLOLVTL, IPEROLV OLR QOESOD. BPD VTXTL ZUDSLTDYKXUFSTL OLR QHHZTDUSPHLTL TPL. BPD YPLR IHSYKXUFSTDPLLTL OLR IHSYKXUFSTD OLYTDTD YKXOET. RUY ETPSIPER BODRT PJ YKXOECUXD 2017/18 GHL ETXDZTDYHLTL, YKXOETDPLLTL OLR YKXOETDL, ULVTYSTEESTL OLR RTD YKXOEETPSOLV TDUDITPSTS.
Auftrag: Knacke den verschlüsselten Text oben mithilfe der Häufigkeitsanalyse.
Ergebnis der Häufigkeitsanalyse des verschlüsselten Textes (Geheimtext)
Schreibe einen Code, um die folgenden Fragen zu beantworten:
faust
(siehe unten) der Buchstabe 'E'
vor?' ','.','!'
usw. sollen nicht gezählt werden.Tipp Aufgabe 1 (Teil I: Schleife)
Tipp Aufgabe 1 (Teil II: Korrektes Symbol?)
Tipp Aufgabe 1 (Teil III: Counter erhöhen)
Tipp Aufgabe 2 (Teil I: Schleife)
Tipp Aufgabe 2 (Teil II: Symbol in Alphabet?)
Führe nun selbst eine Häufigkeitsanalyse von einem Text durch. Wähle dafür eine der beiden Optionen.
Führe eine Häufigkeitsanalyse des Textes unten (Ausschnitt aus Goethes Faust). Der Text wurde bereits vorbereitet: Kleinbuchstaben durch Grossbuchstaben ersetzt, Umlaute ersetzt, …
Wie Option 1, aber mit dem Unterschied, dass der String noch nicht vorbereitet wurde sondern noch im originalen Zustand ist.
Schreibe eine Funktion, die eine Linie Text einliest und eine Häufigkeitsanalyse durchführt. Das Alphabet soll nur aus den $26$ Standardbuchstaben Bestehen. Alle Buchstaben sollen in Kleinbuchstaben umgewandet werden. Umlaute wie Ä,ä,Ö,ö,Ü,ü sollen als A,O und U, die Buchstaben É,È und À als E resp. A aufgefasst werden. Buchstaben in einem String kannst du wie folgt ersetzen: s = s.replace('É','E')
Variante 1:
Anstelle einer Häufigkeitsanalyse eines einzelnen Strings soll eine solche für ein ganzes Buch durchgeführt werden. Auf Project Gutenberg findet man über $60'000$ gratis Ebooks. Wähle dort ein Buch aus und lade dessen „Plain Text UTF-8“-Version herunter. Wandle alle Klein- in Grossbuchstaben um und ersetze Umlaute (wie in Option 2). Führe dann eine Häufigkeitsanalyse durch.
Variante 2:
Alternativ kann man auch direkt über das Web auf das Buch zugreifen (→ muss nicht herunterladen): Klicke auf der Website auf „Plain Text UTF-8“. Das Buch erscheint dann im einfachen Textformat direkt im Browser. Über den dazugehörigen Link, kannst du das Buch direkt in Python einlesen:
import urllib2 data = urllib2.urlopen(<Pfad zu File als String>) line_first = ... # erste Zeile des Texts line_last = ... # letzte Zeile des Texts for line in data: line = line.replace('\n', '').decode('utf-8') # replace(...): entfernt nervige Zeilenumbrueche, decode(): Umlaute usw richtig anzeigen if line_first <= count <= line_last: print(line) # Achtung: keine gute Idee, wenn File sehr viele Zeilen beinhaltet! Baue z.B. Counter ein, damit nach z.B. 100 Ausgaben abbricht
Beachte, dass du noch die erste und letzte Zeilennummer im Buch angeben musst: Der Text am Anfang und Ende des Files gehört nicht zum Buch und soll ignoriert werden.
Kontrolle: am häufigsten vorkommen sollte $E$ (gut $15\%$), gefolgt von $N$ (ca. $10\%$) und $S$. Die letzten Ränge machen typischerweise $Y$, $Q$ und $X$ unter sich aus.
Versuche, mithilfe einer Häufigkeitsanalyse den Text (in deutscher Sprache, nur Kleinbuchstaben) unten möglichst fest zu entschlüsseln. Aus welchem Buch ist dieser?
Die Autokey-Verschlüsselungsmethode ist eine Weiterentwicklung der Vigenere-Verschlüsslung. Anstelle das Schlüsselwort wie bei der Vigenere-Methode wiederholt zu verwenden, wird an den Schlüssel entweder der Klartext oder der bereits verschlüsselte Text angehängt. Somit werden Wiederholungen vermieden, was diese Verschlüsselungsmethode viel sicherer macht. Implementiere die Autokey-Verschlüsselungsmethode.
Erklärung und Beispiele: https://kryptografie.de/kryptografie/chiffre/autokey.htm
Nutze den Code unten, um Nachrichten zu verschlüsseln und entschlüsseln:
Theorie zu Zeichencodierung, ASCII & Unicode:
Löse von Hand (ohne Python) und mithilfe der ASCII-Tabelle:
Beantworte mithilfe von Python. Verwende dazu die beiden folgenden Funktionen:
ord(’t’) # 116
chr(116) # t
Aufgaben:
Welcher Text verbirgt sich hinter dem ASCII-Code:
[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:
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.
Beispiel: Liste mit Quadratzahlen
# Normaler Weg, um eine Liste zu erstellen squares = [] for x in range(10): squares.append(x ** 2) # Mit List Comprehension squares = [x ** 2 for x in range(10)]
Auftrag:
''.join(my_list)
, um die Symbole einer Liste zu einem String aneinanderzuhängen.Wie viele Symbole kann man mit Unicode (1 bis 4 Bytes) darstellen?
Tipp: Siehe Tabelle in Slides.
Studiere das Video und beantworte die Fragen unten:
Fragen:
0000 0000
-Byte vorkommen? Wie wird dies verhindert?
Unicode-Zeichen werden in 1-4 Byte-Binärzahlen gespeichert. Schreibe eine Funktion unicode_symbol_number(b)
, die für eine solche Binärzahl bestimmt, das wievielte Unicode-Zeichen es darstellt.
Einfache Variante: nur für 1-Byte Zahlen
Beispiele:
Tipp: Um eine Binärzahl ins Dezimalsystem umzuwandeln kannst du entweder eine eigene Funktion schreiben (btw: hast du bereits einmal programmiert) oder int("01010101",2)
verwenden.
Aus dem letzten Kapitel wissen wir, wie wir mithilfe von Zeichentabellen Zeichen in Binärzahlen umwandeln können. Doch wie können wir nun auf der Ebene von Binärzahlen eine Nachricht verschlüsseln? Eine monoalphabetische Verschlüsselung, wie wir sie oben kennengelernt haben, macht auf jeden Fall keinen Sinn mehr, da unser 'Alphabet' nur noch aus zwei Zeichen besteht: 0 und 1.
Eine einfache Operation auf Bits ist die XOR (eXclusive OR) Operation. Wie der Name andeutet, werden bei der XOR-Operation zwei Bits so verknüpft, dass das Resultat genau dann $1$ ist, wenn der eine oder der andere der Operanden $1$ ist, aber nicht beide. Die folgende Wahrheitstabelle zeigt, wie je ein Bit des Plaintext ($p$) mit einem Bit des Key ($k$) zum Ciphertext ($c$) verknüpft werden.
Verschlüsselung:
$p$ | $k$ | $c = p \,\text{XOR}\, k$ |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Entschlüsselung:
$c$ | $k$ | $p = c \,\text{XOR}\, k$ |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Die Entschlüsselung funktioniert gleich wie die Verschlüsselung, weil (p XOR k) XOR k = p
gilt.
Da wir mir Binärzahlen arbeiten, können wir nun nicht nur Text sondern beliebige Informationen verschlüsseln, wie zum Beispiel Bilder.
Berechne von Hand, gib Resultate im gleichen Zahlenformat an wie die Zahlen in der Aufgabenstellung:
Löse nun die Aufgaben von E1 mithilfe von Python.
Tipps:
^
int("1010",2)
bin(42)
bin()
, so hat der Binärstring die Form '0b101010'
. Das '0b'
vom String s
entfernt man mit s = s[2:]
, siehe auch Bsp. unten:s = bin(42) print(s) # -> '0b101010' s = s[2:] print(s) # -> '101010'
01101000 01100001 01101100
mit XOR mit dem Schlüssel 01010011 01110101 01100111
von Hand.Ziel dieser Aufgabe ist, deinen Code aus der letzten Aufgabe zu verallgemeinern und eine Funktion für die XOR-Verschlüsselung zu schreiben.
Schreibe eine Funktion encryption_xor_binary(plaintext_bin,key_bin)
der du den Plaintext (Cleartext) und den Key als Binärstrings übergibst. Die Funktion nimmt dann die Verschlüsselung vor und gibt den verschlüsselten Binärstring zurück.
encryption_xor(plaintext,key)
, die einen Klartext plaintext
mit dem Schlüssel key
mit XOR verschlüsselt. Die Funktion gibt den verschlüsselten Text als Binärstring zurück.decryption_xor(ciphertext_bin,key)
, die einen verschlüsselten Binärstring ciphertext_bin
und den Schlüssel key
(Text, nicht binär) entgegennimmt und den verschlüsstelten Text entschlüsselt und als normalen Text zurückgibt.# deine Funktionen oben msg = "Kanti Romanshorn, die innovative Schule im Grünen." key = "Romanshorn" cipher_bin = encryption_xor(msg,key) decripted = decryption_xor(cipher_bin,key) print(decripted) # muss ausgeben: "Kanti Romanshorn, die innovative Schule im Grünen."
Tipps:
b
kannst du wie folgt in eine Dezimalzahl umwandeln: int(b,2)
d
kannst du wie folgt in eine Binärzahl umwandeln: bin(d)
0b
haben, welches entfernt werden sollte.Entschlüssle das folgende Bild mit einem eigenen Code. Der verwendete Schlüsselt findest du unten.
Advanced Encryption System (AES) ist ein symmetrisches Verschlüsselungsverfahren, welches eines der am weitesten verbreiteten modernen Verschlüsselungsverfahren ist. Es gilt (zumindest bis heute) als nicht knackbar. Siehe Slides für Details.
Spannendes Video zu Verschlüsselung, Quanten Computern und SNDL (Store Now, Decrypt Later):
Die folgende Nachricht wurde mit AES-128 CBC verschlüsselt und im Hexadezimalsystem (mehr dazu in Aufgabe unten) dargestellt:
34 02 b9 2d f2 b8 6a c1 bd 77 49 b0 47 61 a7 c6 b3 cf 43 41 09 82 95 01 85 74 95 a7 91 4a 6e 67 4d 4a 28 22 97 22 b6 27 e8 75 b2 ea cd 29 19 bf eb d5 35 00 ea 0f e7 68 aa 3e 21 b6 14 46 20 c6
Die verwendeten Schlüssel sind:
33 06 1c 1e fc 66 07 b6 b5 21 58 e2 34 75 0d ed
d1 f7 37 76 68 27 24 47 cb 60 2b bf 60 f6 87 64
Entschlüssle die verschlüsselten Nachricht mithilfe eines Online-Tools (z.B. https://cryptii.com/pipes/aes-encryption) oder mithilfe Python (für Fortgeschrittene, siehe Tipps).
In der Aufgabe oben hast du viele Zahlen im Hexadezimalsystem angetroffen. Studiere nun die Theorie dazu:
Der Computer arbeitet bekanntlich im Binärsystem. In diesem werden aber selbst kürzeste Nachrichten sehr lange.
Beispiel: Wandelt man das Wort „ROMANSHORN“ in 8bit-Unicode/ASCII um, erhält man:
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,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f$), denn eine Umrechnung zwischen den beiden ist sehr einfach:
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}$$
Jetzt können wir die Binärdarstellung von „ROMANSHORN“ ganz einfach ins Hexadezimalsystem umrechnen:
52 4f 4d 41 4e 53 48 4f 52 4e
Aufgaben:
01000001 01000011 01000100 01000011
von Hand ins Hexadezimalsystem um.4b 53 52
von Hand ins Binärsystem um. Welchem Wort entspricht dies?Ziele: Mit dem Online-Tool https://cryptii.com/pipes/aes-encryption kann man Nachrichten mit AES verschlüsseln und entschlüsseln. Dazu benötigt man aber einen geheimen 128 bit Schlüssel (Key) und einen 128 bit Initialization Vector (IV), die man mit der Person teilt, mit der man kommunizieren will. In dieser Aufgabe soll ein einfacher Code erstellt werden, mit der man solche Keys/IVs generieren kann.
e9 50 33 f9 99 81 a1 b8 6c 47 82 3d 84 59 9a bc
. Tipp: Mit hex(132)[2:]
wandelst du eine Dezimalzahl ins Hexadezimalsystem um und entfernst den Präfix.Programmiere folgende Funktionen:
bin_to_hex(binary)
: übersetzt String mit 8-Bit Binärzahlen (mit Leerschlag getrennt) in Hexadezimalzahlen.hex_to_bin(hexa)
: umgekehrtstring_to_bin(text)
: übersetzt Text in 8-Bit Binärzahlenstring_to_hex(text)
: übersetzt Text in 8-Bit HexzahlenFür alle Aufgaben zu den klassischen Verschlüsselungsmethoden verwenden wir ausschliesslich das Alphabet „ABCDEFGHIJKLMNOPQRSTUVWXYZ“ (26 Grossbuchstaben).
Verschlüssle „XYLOPHON“ von Hand mit Caesar, in dem du um $7$ Stellen nach hinten verschiebst.
Entschlüssle die Nachricht „OSMVAEJVPNRENJFYWNN“ von Hand. Sie wurde mit dem folgenden monoalphabetischen Verfahren verschlüsselt (Alphabet & Schlüssel):
ABCDEFGHIJKLMNOPQRSTUVWXYZ # Alphabet SOGVNPKWEFLMUJDHZRAIYTBXCQ # Schlüssel
Das wievielte Zeichen der Unicode-Tabelle wird gespeichert in der Zahl 11011001 10110111
?
Wandle ohne Hilfsmittel um:
18 9b b7 e3
→ Dez01101000 01100001 01101100 01101100 01101111
01001000 01000001 01001100 01001100 01001111
01101000 01100001 01101100 01101100 01101111