Digitale Signaturen mit RSA in der Kryptographie

LinuxBeginner
Jetzt üben

Einführung

Willkommen zum Labor über Digitale Signaturen mit RSA. Eine digitale Signatur ist ein kryptografischer Mechanismus, der verwendet wird, um die Authentizität und Integrität digitaler Nachrichten oder Dokumente zu überprüfen. Sie gewährleistet, dass die Nachricht von einem bekannten Absender stammt (Authentizität) und dass sie während der Übertragung nicht verändert wurde (Integrität).

In diesem Labor sammeln Sie praktische Erfahrungen mit dem gesamten Lebenszyklus einer digitalen Signatur. Wir werden das Befehlszeilenwerkzeug openssl verwenden, ein robustes und vielseitiges Dienstprogramm für kryptografische Aufgaben. Sie lernen, wie man eine Signatur mithilfe eines privaten Schlüssels generiert und wie man sie mit dem entsprechenden öffentlichen Schlüssel verifiziert. Am Ende werden Sie ein praktisches Verständnis dafür entwickeln, wie digitale Signaturen unsere digitale Kommunikation absichern.

Konzept der digitalen Signatur

In diesem Schritt beginnen wir damit, das Kernkonzept einer digitalen Signatur zu verstehen. Eine digitale Signatur wird vom Absender mithilfe seines privaten Schlüssels erstellt. Dieser Schlüssel wird geheim gehalten und ist nur dem Absender bekannt. Die Signatur kann dann von jedem überprüft werden, der den entsprechenden öffentlichen Schlüssel des Absenders besitzt.

Dieser Prozess bietet zwei entscheidende Sicherheitsgarantien:

  • Authentizität: Da nur der Absender den privaten Schlüssel besitzt, beweist eine gültige Signatur, dass die Nachricht von ihm stammt.
  • Integrität: Die Signatur ist mathematisch an den Inhalt der Nachricht gebunden. Wenn die Nachricht in irgendeiner Weise verändert wird, ist die Signatur nicht mehr gültig.

Um dieses Labor zu erleichtern, hat der Einrichtungsprozess bereits ein RSA-Schlüsselpaar für Sie generiert: private.pem (Ihr geheimer Schlüssel) und public.pem (Ihr teilbarer Schlüssel). Es wurde auch eine Datei namens message.txt erstellt. Lassen Sie uns die Dateien in unserem Projektverzeichnis auflisten, um sie zu sehen.

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

ls -l

Sie sollten die für Sie vorbereiteten Dateien sehen:

-rw-rw-r-- 1 labex labex   55 Oct 20 09:20 document.txt
-rw-rw-r-- 1 labex labex   26 Oct 20 09:20 message.txt
-rw------- 1 labex labex 1704 Oct 20 09:20 private.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 09:20 public.pem

Nachdem wir nun unsere Schlüssel und eine Nachricht haben, sind wir bereit, unsere erste digitale Signatur zu erstellen.

Nachricht mit privatem Schlüssel signieren

In diesem Schritt erstellen Sie eine digitale Signatur für die Datei message.txt. Der Prozess umfasst zwei Hauptaktionen: Zuerst wird ein kryptografischer Hash (eine eindeutige Zeichenfolge von Bytes fester Länge) der Nachricht erstellt, und zweitens wird dieser Hash mit Ihrem privaten Schlüssel verschlüsselt. Das Ergebnis ist die digitale Signatur.

Wir verwenden den Befehl openssl dgst, um diese Operation durchzuführen. Führen wir den Befehl aus, um message.txt zu signieren.

openssl dgst -sha256 -sign private.pem -out signature.bin message.txt

Lassen Sie uns diesen Befehl aufschlüsseln:

  • openssl dgst: Ruft den OpenSSL Digest (Hash-Erzeugungs-) Befehl auf.
  • -sha256: Gibt den SHA-256-Algorithmus zur Erstellung des Nachrichten-Hashs an.
  • -sign private.pem: Weist OpenSSL an, den Hash mithilfe des angegebenen privaten Schlüssels, private.pem, zu signieren.
  • -out signature.bin: Gibt die Ausgabedatei an, in der die resultierende binäre Signatur gespeichert wird.
  • message.txt: Dies ist die Eingabedatei, die wir signieren.

Nach Ausführung des Befehls wird eine neue Datei namens signature.bin erstellt. Diese Datei enthält die digitale Signatur. Sie können deren Erstellung überprüfen, indem Sie die Dateien erneut auflisten.

ls -l

Sie werden nun signature.bin in der Dateiliste sehen:

-rw-rw-r-- 1 labex labex   55 Oct 20 09:20 document.txt
-rw-rw-r-- 1 labex labex   26 Oct 20 09:20 message.txt
-rw------- 1 labex labex 1704 Oct 20 09:20 private.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 09:20 public.pem
-rw-rw-r-- 1 labex labex  256 Oct 20 09:26 signature.bin

Signatur mit öffentlichem Schlüssel verifizieren

In diesem Schritt übernehmen wir die Rolle eines Empfängers, der die Signatur überprüfen möchte. Dazu benötigt der Empfänger drei Dinge: die ursprüngliche Nachricht (message.txt), die digitale Signatur (signature.bin) und den öffentlichen Schlüssel des Absenders (public.pem).

Der Verifizierungsprozess kehrt den Signiervorgang um. OpenSSL verwendet den öffentlichen Schlüssel, um die Signatur zu entschlüsseln, wodurch der ursprüngliche Hash aufgedeckt wird. Anschließend berechnet es unabhängig davon einen neuen Hash der empfangenen Nachricht. Wenn die beiden Hashes übereinstimmen, ist die Signatur gültig.

Wir verwenden erneut openssl dgst, diesmal jedoch mit der Option -verify.

openssl dgst -sha256 -verify public.pem -signature signature.bin message.txt

Hier ist die Aufschlüsselung des Verifizierungsbefehls:

  • -verify public.pem: Weist OpenSSL an, eine Signatur mithilfe des angegebenen öffentlichen Schlüssels, public.pem, zu verifizieren.
  • -signature signature.bin: Gibt die zu verifizierende Signaturdatei an.
  • message.txt: Dies ist die ursprüngliche Nachrichtendatei, zu der die Signatur gehören soll.

Wenn die Signatur gültig ist, gibt OpenSSL die folgende Meldung aus:

Verified OK

Diese Bestätigung bedeutet zwei Dinge: Die Nachricht wurde definitiv vom Besitzer des Schlüssels private.pem signiert, und der Inhalt von message.txt wurde seit der Signierung nicht verändert.

Datei mit privatem Schlüssel signieren

In diesem Schritt werden wir den Signiervorgang vertiefen, indem wir ihn auf eine andere Datei anwenden. Dies wird helfen, Ihr Verständnis dafür zu festigen, wie ein signierter Hash erstellt und verwendet wird. Wir haben eine weitere Datei in unserem Verzeichnis namens document.txt. Wir werden nun eine digitale Signatur für dieses Dokument erstellen.

Das Vorgehen ist identisch mit dem, was wir in Schritt 2 getan haben. Wir werden einen SHA-256-Hash von document.txt generieren und diesen Hash dann mit unserem Schlüssel private.pem signieren.

Erstellen wir die Signatur und speichern sie in einer Datei namens document.sig.

openssl dgst -sha256 -sign private.pem -out document.sig document.txt

Dieser Befehl erstellt eine neue Signaturdatei, document.sig, die spezifisch für den aktuellen Inhalt von document.txt ist. Jede Änderung am Dokument würde die Erstellung einer neuen Signatur erfordern.

Listen wir die Dateien auf, um zu bestätigen, dass document.sig erstellt wurde.

ls

Sie sollten die neue Signaturdatei in der Ausgabe sehen:

document.sig  document.txt  message.txt  private.pem  public.pem  signature.bin

Nun haben wir ein signiertes Dokument, das wir im nächsten Schritt verwenden werden, um die Integritätsprüfungsfähigkeit digitaler Signaturen zu demonstrieren.

Signaturmanipulation testen

In diesem letzten Schritt demonstrieren wir das wichtigste Merkmal einer digitalen Signatur: den Integritätsschutz. Wir werden die Datei document.txt absichtlich manipulieren, nachdem sie signiert wurde, und dann versuchen, sie mit der ursprünglichen Signatur zu verifizieren. Dies zeigt, wie digitale Signaturen unbefugte Änderungen verhindern.

Zuerst fügen wir dem Inhalt der Datei document.txt etwas Text hinzu. Dies simuliert einen Angreifer, der das Dokument verändert.

echo "This is an unauthorized change." >> document.txt

Der Inhalt von document.txt hat sich nun geändert. Die ursprüngliche Signatur, document.sig, wurde basierend auf dem vorherigen Inhalt der Datei erstellt.

Versuchen wir nun, die modifizierte Datei document.txt mithilfe der ursprünglichen Signatur document.sig und des öffentlichen Schlüssels zu verifizieren.

openssl dgst -sha256 -verify public.pem -signature document.sig document.txt

Dieses Mal wird die Verifizierung nicht erfolgreich sein. Stattdessen sehen Sie eine Fehlermeldung, die ähnlich lautet wie:

Verification failure
805BA484597F0000:error:02000068:rsa routines:ossl_rsa_verify:bad signature:../crypto/rsa/rsa_sign.c:430:
805BA484597F0000:error:1C880004:Provider routines:rsa_verify:RSA lib:../providers/implementations/signature/rsa_sig.c:774:

Dieses Scheitern ist das erwartete Ergebnis. Es tritt ein, weil der Hash des modifizierten document.txt nicht mehr mit dem Hash übereinstimmt, der in document.sig verschlüsselt wurde. Dies beweist sofort, dass die Datei seit ihrer Signierung manipuliert wurde. Dieser Mechanismus ist grundlegend für das Vertrauen in digitale Dokumente und Kommunikation.

Zusammenfassung

In diesem Lab haben Sie die praktische Anwendung digitaler Signaturen unter Verwendung von RSA und OpenSSL erfolgreich erlernt.

Sie haben den gesamten Prozess durchlaufen:

  • Verständnis der Kernkonzepte von Authentizität und Integrität, die durch digitale Signaturen bereitgestellt werden.
  • Verwendung eines privaten Schlüssels (private.pem), um eine Nachricht zu signieren und eine Signaturdatei zu erstellen.
  • Verwendung des entsprechenden öffentlichen Schlüssels (public.pem), um die Signatur zu verifizieren und die Authentizität der Nachricht zu bestätigen.
  • Beobachtung eines Verification failure (Verifizierungsfehlers) nach absichtlicher Manipulation einer signierten Datei, was demonstriert, wie digitale Signaturen die Datenintegrität schützen.

Diese praktische Erfahrung bietet eine solide Grundlage für das Verständnis, wie Vertrauen in der digitalen Welt aufgebaut wird – ein entscheidendes Konzept in der Cybersicherheit und der modernen Datenverarbeitung.