vault backup: 2023-10-27 19:03:01

This commit is contained in:
2023-10-27 19:03:01 +02:00
parent dcc7ce922f
commit f3c5c79da8
331 changed files with 23583 additions and 102 deletions

View File

@@ -0,0 +1,128 @@
# 1
## a
Kryptographische Hashfunktionen sind spezielle Funktionen mit verschiedenen Eigenschaften, die sie nützlich für Kryptographie machen. Diese sollten folgende Eigenschaften haben:
1. **Deterministisch**: Für 2 identische Urbilder liefert die Hashfunktion immer den gleichen Hashwert.
5. **Kollisionsresistenz**: Es sollte extrem schwierig sein, zwei verschiedene Eingaben zu finden, die den gleichen Hashwert erzeugen. Dies ist wichtig, um die Integrität von Daten in vielen Anwendungen zu gewährleisten. Resitesz gegen Urbildangriffe und zweites Urbildangriff.
6. **Feste Ausgabegröße**: Unabhängig von der Größe der Eingabe sollte die Ausgabe immer eine konstante Länge haben.
## b
1. **Digitale Signaturen**: Digitale Signaturen verwenden Hashfunktionen, um die Integrität von Daten in einer Nachricht oder einem Dokument zu gewährleisten. Die Daten werden gehasht und der resultierende Hashwert wird mit einem privaten Schlüssel signiert. Der Empfänger kann dann den gesendeten Hash mit dem öffentlichen Schlüssel des Absenders überprüfen. Wenn die Hashes übereinstimmen, kann sichergestellt werden, dass die Daten seit ihrer Signatur nicht geändert wurden.
2. **Passwort-Speicherung**: Eine der häufigsten Anwendungen für Hashfunktionen ist die Speicherung von Passwörtern. Anstatt ein Passwort direkt in einer Datenbank zu speichern, wird das Passwort durch eine Hashfunktion geleitet und der resultierende Hashwert wird gespeichert. Wenn ein Benutzer sein Passwort eingibt, wird es erneut durch die Hashfunktion geleitet und mit dem gespeicherten Hashwert verglichen. Wenn die Werte übereinstimmen, ist das Passwort korrekt. Dies bietet einen zusätzlichen Sicherheitsschutz, da selbst wenn ein Angreifer Zugriff auf die gespeicherten Hashwerte erhält, es extrem schwierig ist, das ursprüngliche Passwort aus dem Hashwert abzuleiten.
# 2
a) **Beweisskizze für das Geburtstagsparadoxon**:
Das Geburtstagsparadoxon ist weniger intuitiv, weil es nicht um die Wahrscheinlichkeit geht, dass eine bestimmte Person mit einer anderen am selben Tag Geburtstag hat, sondern darum, dass irgendein Paar von Personen am selben Tag Geburtstag hat.
Angenommen, wir ignorieren Schaltjahre, es gibt also 365 mögliche Geburtstage. Die Wahrscheinlichkeit, dass zwei Personen an unterschiedlichen Tagen Geburtstag haben, beträgt 364/365.
Wenn eine dritte Person hinzukommt, gibt es 363 Tage übrig, an denen sie Geburtstag haben kann, ohne dass es zu einer Übereinstimmung kommt, also ist die Wahrscheinlichkeit 363/365.
Dies wird fortgesetzt, bis die 23. Person hinzukommt, bei der die Wahrscheinlichkeit 343/365 beträgt. Die Gesamtwahrscheinlichkeit, dass niemand in einer Gruppe von 23 Personen am selben Tag Geburtstag hat, ist das Produkt dieser Wahrscheinlichkeiten. Wenn man dies berechnet, findet man heraus, dass es knapp unter 0,5 liegt. Daher ist die Wahrscheinlichkeit, dass mindestens zwei Personen am selben Tag Geburtstag haben, knapp über 0,5, d.h. über 50%.
| Person | Einzigartiger Geburtstag | Kumulative Wahrscheinlichkeit |
| --- | --- | --- |
| 1 | 365/365 = 1.000 | 1.000 |
| 2 | 364/365 = 0.997 | 0.997 |
| 3 | 363/365 = 0.994 | 0.992 |
| 4 | 362/365 = 0.992 | 0.983 |
| 5 | 361/365 = 0.989 | 0.973 |
| 6 | 360/365 = 0.986 | 0.960 |
| 7 | 359/365 = 0.984 | 0.945 |
| 8 | 358/365 = 0.981 | 0.927 |
| 9 | 357/365 = 0.978 | 0.907 |
| 10 | 356/365 = 0.975 | 0.884 |
| 11 | 355/365 = 0.973 | 0.860 |
| 12 | 354/365 = 0.970 | 0.834 |
| 13 | 353/365 = 0.967 | 0.807 |
| 14 | 352/365 = 0.964 | 0.778 |
| 15 | 351/365 = 0.962 | 0.748 |
| 16 | 350/365 = 0.959 | 0.717 |
| 17 | 349/365 = 0.956 | 0.685 |
| 18 | 348/365 = 0.953 | 0.652 |
| 19 | 347/365 = 0.951 | 0.618 |
| 20 | 346/365 = 0.948 | 0.586 |
| 21 | 345/365 = 0.945 | 0.552 |
| 22 | 344/365 = 0.943 | 0.520 |
| 23 | 343/365 = 0.940 | 0.489 |
b) **Berechnung der Kollision von 96-Bit-Hashwerten**:
Das Geburtstagsparadoxon lässt sich auch auf das Problem der Kollision von Hashwerten anwenden, das als Geburtstagsproblem bekannt ist. In diesem Kontext ist eine Kollision der Punkt, an dem zwei unterschiedliche Eingaben den gleichen Hashwert erzeugen.
Die Anzahl der verschiedenen 96-Bit-Hashwerte beträgt 2^96. Um die durchschnittliche Anzahl der Hashwerte zu berechnen, die erzeugt werden müssen, bevor eine Kollision auftritt, verwenden wir die Quadratwurzel aus dieser Anzahl (dies ist eine Anwendung der Geburtstagsattacke), also etwa 2^(96/2) = 2^48.
Es ist jedoch wichtig zu beachten, dass dies eine durchschnittliche Zahl ist. In der Praxis könnte eine Kollision viel früher oder viel später auftreten. Aber dies gibt uns eine Vorstellung davon, warum größere Hashlängen sicherer sind: Sie machen Kollisionen wesentlich unwahrscheinlicher.
# 3
## a
SHA-2 (Secure Hash Algorithm 2) ist eine Gruppe von kryptographischen Hashfunktionen, die vom National Institute of Standards and Technology (NIST) entwickelt wurden. Die SHA-2-Familie umfasst SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 und SHA-512/256. Die Zahlen beziehen sich auf die Länge des Hashwerts, der produziert wird.
Das Padding spielt eine wichtige Rolle im SHA-2-Algorithmus. Der Eingabetext muss eine Länge haben, die einem Vielfachen des Blockgrößenlimits entspricht (512 Bit für SHA-256, 1024 Bit für SHA-512, usw.). Wenn der Eingabetext nicht diese Bedingung erfüllt, wird er durch Hinzufügen von zusätzlichen Bits - dem sogenannten Padding - aufgefüllt.
Das Padding für die SHA-2 Familie erfolgt in folgenden Schritten:
1. **Anhängen eines 1-Bits**: Der erste Schritt besteht darin, ein Bit mit dem Wert "1" an die Eingabe anzuhängen.
2. **Anhängen von k-Bits mit dem Wert "0"**: Anschließend werden Null-Bits angehängt, bis die Länge der Nachricht modulo die Blockgröße 448 (für SHA-256) oder 896 (für SHA-512) ist. Das heißt, es werden so viele Nullen angehängt, dass nur noch genug Platz für die Länge der ursprünglichen Nachricht ist.
3. **Anhängen der Länge der Originalnachricht**: Die letzten 64 (für SHA-256) oder 128 (für SHA-512) Bits des Blocks werden verwendet, um die Länge der ursprünglichen Nachricht (vor dem Padding) in Binärform anzuhängen. Wenn die Länge der Nachricht weniger Bits benötigt, wird sie mit Null-Bits auf die benötigte Länge aufgefüllt.
Dieses Verfahren stellt sicher, dass die gepaddete Nachricht eine Länge hat, die ein Vielfaches der Blockgröße ist, und es ermöglicht es dem Algorithmus, den Hashwert zu berechnen, selbst wenn die ursprüngliche Nachricht nicht die richtige Länge hat. Darüber hinaus sorgt das Padding dafür, dass jede Nachricht (einschließlich verschiedener Nachrichten mit der gleichen Länge) zu einem eindeutigen Hashwert führt, da die Länge der Nachricht im Padding enthalten ist.
## b
Um das Padding für SHA-256 für den Text "hello, world" durchzuführen, folgen wir den Schritten, die ich zuvor beschrieben habe.
1. **Text in Binär konvertieren**: Jedes ASCII-Zeichen wird in seine 8-Bit-Binärdarstellung umgewandelt. Für "hello, world" ergibt das:
"hello, world" in ASCII ist 68 65 6c 6c 6f 2c 20 77 6f 72 6c 64, was in Binär umgewandelt:
h: 01101000
e: 01100101
l: 01101100
l: 01101100
o: 01101111
,: 00101100
(Leerzeichen): 00100000
w: 01110111
o: 01101111
r: 01110010
l: 01101100
d: 01100100
Die kombinierte Binärnachricht wird:
011010000110010101101100011011000110111100101100001000000111011101101111011100100110110001100100
2. **ein 1-Bit am Ende hinzufügen**:
0110100001100101011011000110110001101111001011000010000001110111011011110111001001101100011001001
3. **Nullen hinzufügen**: Wir fügen Nullen hinzu, bis die Länge der Nachricht modulo 512 gleich 448 ist. Da unsere Nachricht derzeit 97 Bit lang ist, fügen wir 448-97=351 Nullen hinzu:
0110100001100101011011000110110001101111001011000010000001110111011011110111001001101100011001001 + 351 Nullen
4. **Länge der Originalnachricht hinzufügen**: Schließlich fügen wir die Länge der ursprünglichen Nachricht als 64-Bit-Binärzahl hinzu. Die Originalnachricht war 96 Bit lang, was in Binär 1100000 ist. Wir fügen Nullen vorne hinzu, um 64 Bit zu erhalten:
00000000000000000000000000000000000000000000000000000001100000
Unsere endgültige, gepaddete Nachricht wird dann:
0110100001100101011011000110110001101111001011000010000001110111011011110111001001101100011001001 + 351 Nullen + 00000000000000000000000000000000000000000000000000000001100000