Grundlegender Schlüsselaustausch mit Diffie-Hellman in der Kryptographie

LinuxBeginner
Jetzt üben

Einführung

In diesem Lab werden Sie die Grundlagen des Diffie-Hellman (DH) Schlüsselaustauschs erkunden, einem Eckpfeiler der modernen Kryptographie. Das DH-Protokoll ermöglicht es zwei Parteien, die keine Vorkenntnisse voneinander haben, gemeinsam einen geteilten geheimen Schlüssel über einen unsicheren Kommunikationskanal zu etablieren. Dieses geteilte Geheimnis kann dann zur Verschlüsselung nachfolgender Kommunikation mittels eines symmetrischen Chiffreverfahrens verwendet werden.

Sie werden das leistungsstarke Befehlszeilenwerkzeug openssl verwenden, um den gesamten DH-Prozess zu simulieren. Dies umfasst die Generierung der öffentlichen Parameter, die Erstellung privater und öffentlicher Schlüssel für zwei separate Parteien sowie schließlich die Ableitung und Überprüfung des geteilten Geheimnisses. Am Ende dieses Labs werden Sie ein praktisches Verständnis davon haben, wie dieser wesentliche kryptographische Handshake funktioniert.

Prinzip des Diffie-Hellman-Schlüsselaustauschs

In diesem Schritt behandeln wir das theoretische Prinzip des Diffie-Hellman-Schlüsselaustauschs. In diesem Schritt sind keine Befehle auszuführen; das Ziel ist es, das Konzept zu verstehen, bevor es implementiert wird.

Der Prozess funktioniert wie folgt:

  1. Vereinbarung öffentlicher Parameter: Zwei Parteien, nennen wir sie Alice und Bob, einigen sich zunächst auf zwei öffentliche Zahlen: eine große Primzahl p (der Modul) und eine Basis g (der Generator). Diese Zahlen sind nicht geheim und können über einen unsicheren Kanal übertragen werden.

  2. Generierung des privaten Schlüssels:

    • Alice wählt eine geheime private Ganzzahl a. Sie behält diese Zahl für sich.
    • Bob wählt eine geheime private Ganzzahl b. Er behält diese Zahl für sich.
  3. Berechnung des öffentlichen Schlüssels:

    • Alice berechnet ihren öffentlichen Schlüssel A mithilfe der Formel: A = g^a \mod p. Sie sendet diesen öffentlichen Schlüssel A an Bob.
    • Bob berechnet seinen öffentlichen Schlüssel B mithilfe der Formel: B = g^b \mod p. Er sendet diesen öffentlichen Schlüssel B an Alice.
  4. Ableitung des geteilten Geheimnisses:

    • Alice empfängt Bobs öffentlichen Schlüssel B und berechnet das geteilte Geheimnis S unter Verwendung ihres eigenen privaten Schlüssels a: S = B^a \mod p.
    • Bob empfängt Alices öffentlichen Schlüssel A und berechnet das geteilte Geheimnis S unter Verwendung seines eigenen privaten Schlüssels b: S = A^b \mod p.

Aufgrund der Eigenschaften der modularen Arithmetik gelangen sowohl Alice als auch Bob exakt zum selben Wert für S.

  • Alices Berechnung: S = (g^b \mod p)^a \mod p = g^{ba} \mod p
  • Bobs Berechnung: S = (g^a \mod p)^b \mod p = g^{ab} \mod p

Ein Lauscher auf dem Kanal kann p, g, A und B sehen, kann aber die privaten Schlüssel a oder b nicht ohne Weiteres berechnen. Diese Schwierigkeit ist als das Problem des diskreten Logarithmus bekannt, welches die Grundlage für die Sicherheit des Diffie-Hellman-Austauschs bildet.

In den folgenden Schritten werden Sie openssl verwenden, um diese Aktionen durchzuführen.

Generieren von Diffie-Hellman-Parametern

In diesem Schritt generieren Sie die öffentlichen DH-Parameter (p und g), die beide Parteien verwenden werden. Das openssl-Tool kann die komplexe Mathematik der Suche nach einer geeigneten Primzahl und einem Generator für Sie übernehmen. Alle Operationen in diesem Lab werden im Standardverzeichnis ~/project durchgeführt.

Verwenden Sie den Befehl openssl dhparam, um die Parameter zu generieren. Wir legen eine Schlüssellänge von 2048 Bit fest, was eine übliche und sichere Länge für diesen Zweck ist.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

openssl dhparam -out dhparam.pem 2048

Lassen Sie uns diesen Befehl aufschlüsseln:

  • openssl dhparam: Ruft das Werkzeug zur Verwaltung von DH-Parametern in OpenSSL auf.
  • -out dhparam.pem: Dieses Flag gibt an, dass die Ausgabe in einer Datei namens dhparam.pem gespeichert werden soll.
  • 2048: Dies ist die gewünschte Bitlänge des Primzahlmoduls p.

Dieser Befehl kann eine Minute dauern, da er nach einer starken Primzahl sucht. Während der Ausführung sehen Sie eine Ausgabe, die der folgenden ähnelt:

Generating DH parameters, 2048 bit long safe prime

Nach Abschluss wird eine Datei namens dhparam.pem in Ihrem aktuellen Verzeichnis erstellt. Diese Datei enthält die öffentlichen Parameter, die beide Parteien für den Schlüsselaustausch verwenden werden.

Generieren der Schlüssel für Partei A

In diesem Schritt simulieren Sie die Aktionen der ersten Partei, "Partei A". Partei A wird die gemeinsamen DH-Parameter aus dem vorherigen Schritt verwenden, um ihren eigenen privaten Schlüssel zu generieren und daraus einen entsprechenden öffentlichen Schlüssel abzuleiten.

Zuerst generieren Sie den privaten Schlüssel von Partei A. Dieser Schlüssel entspricht der geheimen Zahl a aus unserem theoretischen Beispiel. Wir verwenden den Befehl openssl genpkey, ein allgemeines Dienstprogramm zur Schlüsselgenerierung.

Führen Sie den folgenden Befehl aus, um den privaten Schlüssel für Partei A zu generieren:

openssl genpkey -paramfile dhparam.pem -out a_private_key.pem
  • genpkey: Der Befehl zur Generierung eines privaten Schlüssels.
  • -paramfile dhparam.pem: Weist genpkey an, die Parameter aus unserer Datei dhparam.pem zur Erstellung eines DH-Schlüssels zu verwenden.
  • -out a_private_key.pem: Speichert den generierten privaten Schlüssel in der Datei a_private_key.pem.

Als Nächstes muss Partei A ihren öffentlichen Schlüssel aus dem privaten Schlüssel ableiten. Der öffentliche Schlüssel ist das, was mit Partei B ausgetauscht wird.

Führen Sie diesen Befehl aus, um den öffentlichen Schlüssel zu extrahieren:

openssl pkey -in a_private_key.pem -pubout -out a_public_key.pem
  • pkey: Ein Befehl zur Verwaltung öffentlicher und privater Schlüssel.
  • -in a_private_key.pem: Gibt den eingegebenen privaten Schlüssel an.
  • -pubout: Dieses Flag weist den Befehl an, den öffentlichen Teil des Schlüssels auszugeben.
  • -out a_public_key.pem: Speichert den resultierenden öffentlichen Schlüssel in a_public_key.pem.

Nun haben Sie zwei neue Dateien: a_private_key.pem, die Partei A geheim halten muss, und a_public_key.pem, die Partei A über den unsicheren Kanal an Partei B senden würde.

Generieren der Schlüssel für Partei B

In diesem Schritt führen Sie dieselben Aktionen für die zweite Partei, "Partei B", durch. Partei B agiert unabhängig von Partei A, verwendet jedoch dieselben öffentlichen DH-Parameter aus dhparam.pem.

Zuerst generieren Sie den privaten Schlüssel von Partei B. Dieser entspricht der geheimen Zahl b in unserem theoretischen Beispiel.

Führen Sie den folgenden Befehl aus:

openssl genpkey -paramfile dhparam.pem -out b_private_key.pem

Dieser Befehl ist in seiner Struktur identisch mit dem für Partei A, aber wir speichern die Ausgabe in b_private_key.pem, um sie zu unterscheiden.

Als Nächstes muss Partei B, genau wie Partei A, ihren öffentlichen Schlüssel aus ihrem neuen privaten Schlüssel ableiten.

Führen Sie diesen Befehl aus, um den öffentlichen Schlüssel von Partei B zu extrahieren:

openssl pkey -in b_private_key.pem -pubout -out b_public_key.pem

An diesem Punkt eines realen Austauschs hätte Partei A den öffentlichen Schlüssel von Partei B (b_public_key.pem), und Partei B hätte den öffentlichen Schlüssel von Partei A (a_public_key.pem). Beide Parteien haben ihre jeweiligen privaten Schlüssel geheim gehalten. Sie haben nun den Teil des Protokolls, der die Schlüsselgenerierung und den Austausch umfasst, erfolgreich simuliert.

Berechnung des Shared Secret

Dies ist der letzte und wichtigste Schritt. Hier werden beide Parteien ihren eigenen privaten Schlüssel und den öffentlichen Schlüssel der jeweils anderen Partei verwenden, um unabhängig voneinander das gemeinsame Geheimnis zu berechnen. Wenn das Protokoll erfolgreich ist, werden beide Parteien exakt denselben geheimen Wert erhalten.

Zuerst berechnen wir das gemeinsame Geheimnis aus der Perspektive von Partei A. Partei A verwendet ihren privaten Schlüssel (a_private_key.pem) und den öffentlichen Schlüssel von Partei B (b_public_key.pem).

Führen Sie den folgenden Befehl aus:

openssl pkeyutl -derive -inkey a_private_key.pem -peerkey b_public_key.pem -out a_shared_secret.bin
  • pkeyutl: Ein Dienstprogramm zur Durchführung von Public-Key-Operationen.
  • -derive: Diese Aktion weist das Dienstprogramm an, ein gemeinsames Geheimnis abzuleiten.
  • -inkey a_private_key.pem: Gibt den privaten Schlüssel von Partei A an.
  • -peerkey b_public_key.pem: Gibt den öffentlichen Schlüssel der anderen Partei (des "Peers") an.
  • -out a_shared_secret.bin: Speichert das resultierende binäre Geheimnis in einer Datei.

Als Nächstes berechnen wir das gemeinsame Geheimnis aus der Perspektive von Partei B. Partei B verwendet ihren privaten Schlüssel (b_private_key.pem) und den öffentlichen Schlüssel von Partei A (a_public_key.pem).

Führen Sie den folgenden Befehl aus:

openssl pkeyutl -derive -inkey b_private_key.pem -peerkey a_public_key.pem -out b_shared_secret.bin

Nun haben Sie zwei Dateien, a_shared_secret.bin und b_shared_secret.bin. Um den Erfolg des Schlüsselaustauschs zu überprüfen, müssen diese beiden Dateien identisch sein. Sie können den Befehl cmp (compare) verwenden, um dies zu überprüfen.

cmp a_shared_secret.bin b_shared_secret.bin

Wenn die Dateien identisch sind, erzeugt dieser Befehl keine Ausgabe und wird still beendet. Diese Stille signalisiert den Erfolg!

Für eine visuellere Bestätigung können Sie auch den kryptografischen Hash beider Dateien berechnen. Die Hashes müssen übereinstimmen.

sha256sum *.bin

Sie sollten eine Ausgabe sehen, bei der beide Dateien exakt denselben SHA256-Hash aufweisen. Die tatsächlichen Hash-Werte variieren zwischen den Ausführungen, aber sie müssen für beide Dateien identisch sein:

e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec  a_shared_secret.bin
e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec  b_shared_secret.bin

(Hinweis: Ihre Hash-Werte werden von diesem Beispiel abweichen, aber das Wichtigste ist, dass die Hashes für a_shared_secret.bin und b_shared_secret.bin identisch sein müssen, was beweist, dass beide Parteien dasselbe gemeinsame Geheimnis abgeleitet haben.)

Herzlichen Glückwunsch, Sie haben erfolgreich einen Diffie-Hellman-Schlüsselaustausch durchgeführt!

Zusammenfassung

In diesem Lab haben Sie erfolgreich einen vollständigen Diffie-Hellman-Schlüsselaustausch unter Verwendung des openssl-Kommandozeilenwerkzeugs simuliert. Sie haben praktische Erfahrungen mit den grundlegenden Schritten dieses kritischen kryptografischen Protokolls gesammelt.

Sie haben gelernt, wie man:

  • Gemeinsame öffentliche DH-Parameter generiert (openssl dhparam).
  • Private und öffentliche Schlüsselpaare für zwei separate Parteien basierend auf diesen Parametern erstellt (openssl genpkey und openssl pkey).
  • Ein gemeinsames Geheimnis aus dem eigenen privaten Schlüssel und dem öffentlichen Schlüssel eines Peers ableitet (openssl pkeyutl -derive).
  • Überprüft, dass beide Parteien unabhängig voneinander exakt dasselbe Geheimnis berechnet haben, was den Erfolg des Austauschs beweist.

Dieser Prozess ist ein grundlegender Baustein für sichere Kommunikationssysteme wie TLS/SSL, die Daten im Internet schützen. Sie haben nun ein praktisches Verständnis dafür, wie zwei Parteien einen sicheren Kanal für die Kommunikation aufbauen können, selbst wenn sie in einem unsicheren Netzwerk beginnen.