Diffie-Hellman/Funktionsweise

Aus Foxwiki

Funktionsweise

Veranschaulichung der Grundidee anhand gemischter Farben

Zunächst soll die Grundidee des Diffie-Hellman-Merkle-Schlüsselaustauschs anhand von „Farbmischen“ anschaulich dargestellt werden, wie es die Illustration veranschaulicht. In Wirklichkeit wären die Farben Zahlen und das Mischen von Farben entspräche der diskreten Exponentialfunktion.

Das Mischen von Farben wird hier als eine Einwegfunktion aufgefasst: Es ist „leicht“, zwei oder mehrere verschiedene Farben zu mischen. Die Umkehrung, das Zerlegen einer Farbmischung in ihre ursprünglichen Farb-Komponenten, ist jedoch sehr aufwändig, das heißt nicht effizient durchführbar.

Alice und Bob einigen sich zunächst öffentlich auf eine gemeinsame Farbe (im Beispiel Gelb). Außerdem wählt jeder der beiden Kommunikationspartner für sich eine geheime Farbe (Alice Orange und Bob Türkis). Bob und Alice mischen nun jeweils die gemeinsame Farbe mit ihrer geheimen Farbe. Im Beispiel entsteht dabei für Alice Beige und für Bob Graublau. Diese Farbmischungen tauschen Alice und Bob nun über die abhörbare Leitung aus. Einer potenziellen Lauscherin Eve ist es nicht effizient möglich, aus den öffentlichen Informationen (gelb, beige, graublau) auf die geheimen Farben von Alice und Bob zu schließen.

In einem letzten Schritt mischen nun Alice und Bob die Farbmischung ihres Gegenübers mit ihrer eigenen geheimen Farbe. Daraus entsteht wiederum eine neue Farbe (im Beispiel Ockerbraun), die für beide Kommunikationspartner gleich ist (gelb + orange + türkis = gelb + türkis + orange = ockerbraun). Somit haben Alice und Bob eine gemeinsame geheime Farbe. Für Eve ist es unmöglich, diese herauszufinden, da sie Alices und Bobs geheime Farbzutaten nicht kennt.

Mathematische Funktionsweise

Prinzip des Diffie-Hellman-Merkle-Schlüsselaustauschs
a: privater Schlüssel von Alice
b: privater Schlüssel von Bob
p: öffentlich bekannte Primzahl
g: öffentlich bekannte natürliche Zahl kleiner als p
A: öffentlicher Schlüssel von Alice
B: öffentlicher Schlüssel von Bob
K: geheimer Sitzungs-Schlüssel für Alice und Bob

Die beiden Kommunikationspartner Alice und Bob wollen über ein unsicheres Medium, etwa eine Kabel- oder Funkverbindung, verschlüsselt kommunizieren. Dazu soll ein symmetrisches Kryptosystem eingesetzt werden, für das beide jedoch zunächst einen gemeinsamen geheimen Schlüssel benötigen. Das DHM-Kommunikationsprotokoll sorgt dafür, dass sie einen geheimen Schlüssel berechnen können, ohne dass Dritte (Eve) diesen erfahren können. Den auf diese Weise errechneten Schlüssel können sie dann in Zukunft verwenden, um verschlüsselt mit einem symmetrischen Kryptosystem zu kommunizieren.

  1. Alice und Bob einigen sich zunächst öffentlich auf eine große Primzahl und eine natürliche Zahl , die kleiner als ist. Sich öffentlich darauf einigen bedeutet, dass jeder diese beiden Zahlen kennen darf (also auch potenzielle Lauscher wie Eve). Idealerweise handelt es sich bei um einen Erzeuger der zyklischen Gruppe , das Verfahren funktioniert aber auch, wenn einen anderen Wert kleiner annimmt. In der Praxis ist es ohnehin meist so, dass und vorgegeben sind und von vielen Anwendern verwendet werden.[1]
  2. Alice und Bob erzeugen jeweils eine geheimzuhaltende Zufallszahl (privater Schlüssel) bzw.  aus der Menge . und werden nicht übertragen, bleiben also potenziellen Lauschern, aber auch dem jeweiligen Kommunikationspartner, unbekannt. Nur Alice kennt die Zahl und nur Bob kennt die Zahl .
  3. Alice berechnet mit ihrer geheimen Zahl den öffentlichen Schlüssel und schickt an Bob. Bob berechnet mit seiner geheimen Zahl den öffentlichen Schlüssel und schickt an Alice.
  4. Alice erhält von Bob und berechnet mit ihrem privaten Schlüssel die Zahl . Bob berechnet mit dem erhaltenen und seinem privaten Schlüssel ebenfalls die Zahl . Die beiden haben die gleiche Zahl berechnet. Diese ist somit der gesuchte gemeinsame Schlüssel .

Nur Alice und Bob kennen . Eve kann aus der abgehörten Kommunikation nicht berechnen. Dazu müsste sie den diskreten Logarithmus lösen, was nach heutigem Kenntnisstand nicht effizient möglich ist, wenn die Zahlen groß genug sind. Alice und Bob können also gefahrlos für eine symmetrische Kryptografie nutzen.[1]

Dass beide Kommunikationspartner denselben Wert für berechnen, zeigen die folgenden beiden Restklassengleichungen[2]:

.
.

Da die Multiplikation kommutativ ist, gilt des Weiteren

und somit

.

Alice und Bob erhalten also nach ihren jeweiligen Berechnungen die genau gleiche Zahl, nämlich den geheimen Schlüssel .

Beispiel:

Das folgende Beispiel dient zur Veranschaulichung und benutzt deshalb sehr kleine Zahlen. In der tatsächlichen Anwendung werden dagegen Zahlen mit mindestens mehreren hundert Stellen benutzt.

  1. Alice und Bob einigen sich auf die beiden öffentlichen Schlüssel und ( ist ein Generator der Gruppe , siehe Abschnitt „Gruppentheorie“).
  2. Alice wählt die Zufallszahl als geheimen Schlüssel und Bob .
  3. Nun berechnet Alice und sendet an Bob. Bob berechnet und sendet an Alice.
  4. Alice berechnet . Bob berechnet .
  5. Beide erhalten das gleiche Ergebnis .

Die Lauscherin Eve kann zwar die Zahlen 13, 2, 6 und 9 mithören, das eigentliche gemeinsame Geheimnis von Alice und Bob bleibt ihr aber verborgen. kann als Schlüssel für die nachfolgende Kommunikation verwendet werden.

Mit Hilfe der abgefangenen Nachrichten kann Eve immerhin die folgenden Gleichungen aufstellen:

Daraus kann sie beispielsweise durch Ausprobieren die beiden geheimen Zahlen und bestimmen. Den vereinbarten Schlüssel von Alice und Bob kann sie nun mit

ausrechnen.

Wenn jedoch die Primzahl groß genug gewählt wird und ein Generator der Gruppe ist, ist es für Eve zu aufwändig, um alle Zahlen zwischen und durchzuprobieren, die als Resultat der modularen Potenz in Frage kommen.[3]

Programmierung

Das folgende Programm in der Programmiersprache Python zeigt die Implementierung des Diffie-Hellman-Schlüsselaustauschs für und .

from random import randint

# Festlegung der Gruppe:
p = 107

g = 3
# Zufällige Wahl der geheimen Schlüssel von Alice und Bob:

a = randint(1,p-1)
b = randint(1,p-1)
# Berechnung der Öffentlichen Schlüssel:

A = pow(g, a, p)
B = pow(g, b, p)

print(f'Öffentlicher Schlüssel von Alice: {A=}')
print(f'Öffentlicher Schlüssel von Bob:   {B=}')
# Berechnung des gemeinsamen Geheimnisses:

k_a = pow(B, a, p)
k_b = pow(A, b, p)

print(f'{k_a=}')
print(f'{k_b=}')
  1. 1,0 1,1 Schmeh: Kryptografie. 5. Aufl., 2013, S. 185–186.
  2. Freiermuth u. a.: Einführung in die Kryptologie. 2. Aufl., 2014, S. 199.
  3. Freiermuth u. a.: Einführung in die Kryptologie. 2. Aufl., 2014, S. 200–202.