Datenverschlüsselung

Das Kursangebot “PGP & Co. – Die besten Verschlüsselungsprogramme” der VHS Heidelberg weckte mein Interesse an diesem Thema, obwohl ich kein großer Anhänger von “alles verschlüsseln” bin. Das Thema PGP interessierte mich schon einmal vor 15 Jahren.

Am ersten Abend bekamen wir drei Programme vorgestellt:

  • Eraser (Sicheres Löschen durch mehrfaches Überrschreiben)
  • Veracrypt (Dateiverschlüsselung und mountbare verschlüsselte Container)
  • 7Zip (Komprimieren, Zusammenfassen von Dateien, Verschlüsseln)

Unser Referent legte bei der Programmauswahl Wert auf einen offengelegten Sourcecode und misstraute kommerziellen Anbietern. Man sollte sich diese Programme einfach einmal merken.

Der zweite Abend war dann PGP gewidmet.

Folgende Stichworte sollte man dazu kennen oder kennen lernen:

  • PGP (wird aber aus Rechtsgründen nicht mehr so genannt)
  • asymmetrische Verschlüsselung (RSA …)
  • Schlüsselpaar aus einem privatem und öffentlichen Schlüssel
  • Passwort für die Schlüsselverwaltung (passphrase, keyring)
  • OpenPGP and X.509 (S/MIME) (Die Normen und das Procedere für den Schlüsselaustausch)

Wir bekamen die Installationsdatei für Gpg4win (GNU Privacy Guard for Windows) (Version 2.3.3).  Hier findet man nicht mehr den Namen “PGP”, aber das Verfahren entspicht dem PGP-Prinzip der privaten und öffentlichen Schlüssel. Die Installation lief schnell und einfach ab. Dabei wurden zwei Hauptkomponenten erzeugt:

  • GnuPG The backend; this is the actual encryption tool.
  • Kleopatra A certificate manager for OpenPGP and X.509 (S/MIME) and common crypto dialogs.

Diese klare Trennung fand ich persönlich sehr hilfreich, denn sie zeigt die typische Arbeitsverteilung eines PGP-Systems. Zum einen den Verschlüsseler und zum anderen den Schlüssel-Manager. Man arbeitet eigentlich nur mit Kleopatra, und diese lässt dann mit den jeweiligen Schlüsseln GnuPG arbeiten. Man kann mit diesen Programmen kurze ASCII-Daten über die Zwischenablage verschlüsseln. Oder man verschlüsselt ganze Dateien.

Das Grundprinzip von PGP ist immer noch die asymmetrische hybride Verschlüsselung. Man erzeugt mit Kleopatra ein Schlüsselpaar, welches aus einem privaten und einem öffentlichen Schlüssel besteht. Grundsatz: Der “private” Schlüssel wird NIE weitergegeben, der öffentliche Schlüssel kann/muss weitergegeben oder sogar veröffentlicht werden. Bei dem Vorgang “Verschlüsselung” arbeitet man mit dem öffentlichen Schlüssel des geplanten Empfängers (den braucht man) und verschlüsselt die Daten damit so, dass sie nur mit dem (passenden) privaten Schlüssel des Schlüsselpaars (also dem privaten Schlüssel des Empfängers) wieder entschlüsselt werden können. Diese Art der Verschlüsselung nennt man eine “asymmetrische” Verschlüsselungstechnik. Der eigentlich wichtige Schlüssel zum Entschlüsseln verlässt dabei den Hoheitsbereich des Empfängers nie, kann also auch unterwegs nicht abgefangen werden.

Ein Benutzer kann mehrere Schlüsselpaare erzeugen, besitzen und benutzen, und braucht natürlich auch die öffentlichen Schlüssel der Kontakte. Diese Schlüsselverwaltung ist mit Kleopatra bedienerfreundlich gelöst, kann einen aber auch verwirren.

Vorsicht: Man kann die verschlüsselten Daten auch selbst nicht mehr lesen, wenn man sich nicht selbst in den Kreis der potentiellen Empfänger eingearbeitet hat.

Es wäre aber noch schöner, wenn die PGP-Programme auch untereinander gut harmonieren würden. Denn man will ja mit Partnern verschlüsselt kommunizieren, sie dabei aber nicht zu einem vorgegebenen Programm zwingen.

In der dort eingesetzten RSA-Verschlüsselung spielen große Primzahlen eine wichtige Rolle. Und die Produkte aus großen Primzahlen. Denn es gibt anscheinend kein effizientes Verfahren, um wirklich große Zahlen in ihre Faktoren (Primzahlen) zu zerlegen. Man kann also die in einem Produkt enthaltenen Primzahlen nur sehr schwer finden.

Für mich war es letztendlich interessanter, die eigentliche RSA-Verschlüsselung stark vereinfacht in Python nachzubauen. Dort konnte man ein einfach anzuwendendes asymmetrisches Schlüsselpaar erzeugen und dann mit dem RSA-Verfahren experimentieren.

def encrypt(text_offen, pubkey, factor):
    return text_offen ** pubkey % factor

def decrypt(text_chiffr, privkey, factor):
    return text_chiffr ** privkey % factor

Das ist schon der ganze zentrale Python-Code für die Ver- und Entschlüsselung!