Zunächst muss man sich vor Augen führen, dass man bei dieser Art von Keyaustausch keine Möglichkeit hat jemals einen Klartext zu sehen, solange man nur den Datenaustausch von A und B "mithört". Ergo muss man aktiv in den Datenaustausch eingreifen und sich zwischen A und B setzen, quasi als Vermittler. Nur dürfen A und B nichts davon mitbekommen.
Zu Beginn einigen sich A und B auf eine Primzahl p und eine Zufallszahl g. Diese haben wir auch gegeben durch:
p=212935040031604815141240756551104688603
g=63594830015359383540729212896882214340
Jetzt wählt A sich eine zufällige Zahl a. A berechnet sich nun einen Key Xa = g^a mod p. In diesem Beispiel gilt:
Xa=115479666761256450455063207607300019587
Dieser Wert sollte normal zu B gesendet werden, landet aber erstmal bei uns
A hat also quasi versucht mit uns in Verbindung zu treten.
Wir müssen jetzt natürlich - damit die Daten von A auch nach B gelangen - unsererseits eine Verbindung zu B öffnen. Das machen wir, indem wir uns ein beliebiges z>1 ausdenken und den Key Xz= g^z mod p berechnen. Ich habe hier z=2 gewählt.
Für z=2 gilt: Xz=g^z mod p = 137103982843136238647594426704956426850
Das senden wir nun mit IDa = A als Xa zu B
B denk also jetzt: Aha, A will mit mir Kontakt aufnehmen (was aber in Wirklichkeit nun wir sind).
Jetzt geht das ganze Spiel zurück in die andere Richtung. B denkt sich ein b>1 aus, um mit dem vermeintlichen A in Verbindung zu treten. Also: Xb= g^b mod p -> hier: Xb=129097000862523749840957581813757545440
Xb kommt bei uns an, und damit wissen wir schonmal: Der Key, den wir zur Verbindung mit B brauchen ist:
Kb=Xb^z mod p=191384704897205033618818732734805885958
Jetzt steht noch unsere Antwort an A aus. A schicken wir das gleiche, wie B, nämlich unser Xz=g^z mod p = 137103982843136238647594426704956426850
Den Key, den wir zur Kommunikation mit A brauchen können wir uns jetzt auch schon berechnen. Wir nehmen das Xa, was wir im ersten Schritt von A bekommen haben und berechnen:
Ka=Xa^z mod p = 152496511506345413237982002012998611773
Was nun folgt ist eine Kontrolle von A und B, um festzustellen, dass mit der Kommunikation alles in Ordnung ist. A und B müssten normalerweise jetzt den gleichen Key haben. Dafür legen A und B einen Hash von ihrem Key an, und vergleichen diese. Das kann natürlich so nicht funktionieren, da wir ja in der Mitte hängen. Das heißt für uns: Weitere Manipulationen sind nötig. Genau läuft das Ganze hier so ab:
A berechnet sich seinen Key mit Xb^a mod p, um mit B, bzw. mit uns in Verbindung zu treten. Nun wird ein Hash über die beiden IDa und IDb gemacht, allerdings mit Key+1. Dabei kommt dann "77; 49" heraus. Diesen Wert müssen wir nun an B weiterleiten. Damit B aber nichts Auffälliges feststellen kann, müssen wir "77; 49" zunächst mit dem Key, den wir zur Kommunikation mit A haben entschlüsseln. Aber aufpassen, wir brauchen hier Schlüsselwert+1. Also ganz unten auf der Seite key=sha1(152496511506345413237982002012998611774)
msg= 77; 49
Hier sollten wir AB als Ergebnis erhalten, oder was auch immer wir für IDa und IDb verwendet haben. Jetzt müssen wir AB wieder mit dem Key für die Kommunikation mit B verschlüsseln. (wieder key+1)
key=sha1(191384704897205033618818732734805885959)
msg=AB
Was heraus kommt sollte 121; 131 sein (abhängig vom gewählten z, und gewählten IDa und IDb). Diesen Wert übermitteln wir B. "Sieht ok aus..." sollte die Antwort sein.
Jetzt geht das Ganze wieder in die andere Richtung mit key+2. Nachricht von B mit Kb+2 entschlüsseln, dann mit Ka+2 wieder verschlüsseln, und an A übermitteln.
Nun haben wir es im Prinzip schon geschafft. A sendet B eine Nachricht. Als key nutzen wir unseren Ka und die Nachricht als msg, und schon haben wir es geschafft