Signaturen
Wenn wir die Schlüssel der asymmetrischen Verschlüsselung umkehren beobachten wir eine interessante Eigenschaft:
Weil nur Alice den private key kennt, ist damit bewiesen, dass Alice ihn verschlüsselt hat.
Damit haben wir nicht nur die Möglichkeit, einen Text so zu verschlüsseln, dass ihn niemand lesen kann (Vertraulichkeit), sondern auch, so, dass er garantiert von einer bestimmten Person kommt (Authentizität).
Hashfunktionen
In der Praxis ist es zu mühsam, den ganzen Text zu verschlüsseln, um eine Signatur zu erstellen. Stattdessen fassen wir den Klartext mit einer Hashfunktion zu einem kürzeren Wert zusammen. Wir signieren (verschlüsseln) dann nur den Hashwert.
Für die Verifikation der Unterschrift müssen wir nur überprüfen, ob die entschlüsselte Signatur mit dem Hashwert der Nachricht übereinstimmt:
Die Hashfunktion soll folgende Eigenschaften haben:
zwei verschiedene Texte sollen möglichst selten denselben Hashwert ergeben.
es soll schwierig sein, einen Text so zu verändern, dass ein bestimmter Hashwert herauskommt.
Weshalb?
sonst könnte Mallory einen anderen Text in die Nachricht schleusen, die Signatur wäre immer noch korrekt
sonst könnte Mallory den Text ein bisschen anpassen, die Signature wäre immer noch korrekt
Aufgabe XOR-Hash
Schreibe eine Funktion, die alle Zahlen einer Liste mit XOR
kombiniert.
Lösung:
def xor_hash(numbers):
hash = 0
for n in numbers:
hash = hash ^ n
return hash
print(xor_hash([42, 13, 28, 135, 42]))
Teil 2: Schreibe eine Funktion word_hash
die alle Zeichen eines Worts in ASCII-Codes übersetzt, bevor sie mit XOR verbunden werden.
Lösung:
def word_hash(text):
hash = 0
for letter in text:
hash = hash ^ ord(letter)
return hash
print(word_hash("Hallo, good morning"))
Erfüllt die XOR-Hashfunktion die obigen Bedingungen?
Antwort:
Nein - jeweils zwei gleiche Buchstaben heben sich gegenseitig auf. Es ist damit einfach, eine Nachricht so zu modifizieren, dass sie den gleichen Hashwert ergibt:
Hallo
und Hallo leben nebel
haben den gleichen Hashwert.