Diffie-Hellman-Schlüsselaustausch
Das Problem: Alice und Bob wollen ein gemeinsames Geheimnis vereinbaren – aber jeder, der die Leitung mithört, soll es nicht herausfinden können. Diffie-Hellman (1976) löst genau das, ohne dass je ein Schlüssel direkt übertragen wird.
Die Farben-Analogie: Alice und Bob einigen sich öffentlich auf eine gelbe Farbe. Jeder mischt heimlich seine geheime Farbe dazu und schickt das Ergebnis. Beide mischen die empfangene Mischung noch einmal mit ihrer eigenen geheimen Farbe – und erhalten dieselbe Endfarbe. Ein Lauscher hat nur die Mischungen gesehen und kann die geheimen Farben nicht rückwärts herauslösen.
1. Öffentliche Parameter
2. Private Geheimnisse
👩 Alice
A = ga mod p= 8
🧑 Bob
B = gb mod p= 19
🔑 Gemeinsamer Schlüssel
Alice rechnet Ba mod p= 2
Bob rechnet Ab mod p= 2
✔ Beide kommen auf 2 – ohne dass dieser Wert je übertragen wurde.
Was sieht ein Angreifer?
- Öffentlich bekannt:
- p = 23, g = 5, A = 8, B = 19
- Geheim:
- a, b und der gemeinsame Schlüssel
Um aus A das geheime a zu bekommen, müsste der Angreifer den diskreten Logarithmus berechnen – bei großen Primzahlen (z. B. 2048 Bit) praktisch unmöglich.
Wichtig: Reines Diffie-Hellman schützt nicht vor Man-in-the-Middle. Ein Angreifer könnte sich gegenüber Alice als Bob ausgeben und umgekehrt. In der Praxis kombiniert man DH deshalb mit Authentifizierung (Zertifikate, Signaturen) – z. B. bei TLS.
Schritt für Schritt
- Alice und Bob einigen sich öffentlich auf p (Primzahl) und g (Generator).
- Alice wählt geheim a, Bob wählt geheim b.
- Alice schickt A = gᵃ mod p. Bob schickt B = gᵇ mod p.
- Alice rechnet Bᵃ mod p, Bob rechnet Aᵇ mod p – beide erhalten denselben Wert (gᵃᵇ mod p).
- Dieser Wert dient als Schlüssel für ein symmetrisches Verfahren (z. B. AES).
// Öffentlich vereinbart
const p = 23; // Primzahl
const g = 5; // Generator
// Alice
const a = 6; // privat
const A = (g ** a) % p; // öffentlich
// Bob
const b = 15; // privat
const B = (g ** b) % p; // öffentlich
// Beide berechnen den gemeinsamen Schlüssel
const sharedAlice = (B ** a) % p; // = 2
const sharedBob = (A ** b) % p; // = 2