Kapitel 17

Verschlüsselung

IN DIESEM KAPITEL

  • Symmetrische und asymmetrische Schlüssel
  • Zertifikate und Zertifikzierungsstellen
  • Eigenbau von Schlüsseln und Zertifikaten
  • Verschlüsseln von Dateien

Die Informatik befasst sich seit Anbeginn mit dem Thema der Verschlüsselung und den Versuchen, verschlüsselte Daten wieder zu entschlüsseln. Ransom-Viren und die Forderungen nach einem Universalschlüssel in der Hand der Regierungen demonstrieren, dass der Aufwand wohl nicht vergebens war. Die Verschlüsselung ist ein wirksamer Schutz, der sensible Daten vor dem Zugriff durch die Mächtigen sichert.

Verfahren und Ideen

Um etwas Ordnung in die Kunst der Verschlüsselung zu bringen, wollen wir die Begriffe Verschlüsselung, private und öffentliche Schlüssel sowie Zertifikate etwas genauer betrachten, ohne uns gleich in den Tiefen der Mathematik zu verlieren.

Sollte Sie allerdings die Theorie und die Mathematik dahinter brennend interessieren, besorgen Sie sich den Klassiker von Hans Werner Lang: Kryptographie für Dummies.

Symmetrische Verschlüsselung

Die symmetrische Verschlüsselung basiert darauf, dass Sender und Empfänger den gleichen Schlüssel haben. Das wohl bekannteste Verschlüsselungsverfahren wird Julius Caesar zugeschrieben. Dabei wird beim Verschlüsseln jeder Buchstabe um eine Stelle weiterverschoben. Aus A wird B, aus M wird N, aus Z wird A. Beim Entschlüsseln wird jeder Buchstabe zurückgeschoben. Ist das Verfahren bekannt, kann als Schlüssel die Zahl der Stellen betrachtet werden, mit denen weitergeschoben wird. In diesem Fall gibt es nur 26 verschiedene Schlüssel. Zum Glück gibt es symmetrische Verfahren, die eine größere Anzahl von Schlüsseln bieten.

Das Problem der symmetrischen Verschlüsselung ist, dass es nur einen Schlüssel gibt, den sowohl Sender als auch Empfänger verwenden. Wird dieser verraten, ist die Verschlüsselung kaputt.

Der Vorteil der symmetrischen Verschlüsselungen ist, dass auch die komplexeren Verfahren, die mehr als 26 Varianten kennen, sehr schnell sind. Wenn man solche Schlüsselverfahren verwendet, die dann auch noch bei jeder Verschlüsselung einen anderen Schlüssel einsetzen, wird symmetrische Verschlüsselung hochinteressant. Nur wie schafft man es, dass sich Sender und Empfänger auf einen Schlüssel einigen, ohne dass die Nachrichten abgefangen werden. Wir werden genau dieses Problem noch lösen.

 http://willemer.de/informatik/web/kryptografie.htm#verschluessel

Asymmetrische Verschlüsselung

Bei der asymmetrischen Verschlüsselung werden zwei Arten von Schlüsseln verwendet. Was der eine Schlüssel verschlüsselt, kann nur der andere Schlüssel entschlüsseln.

Der Besitzer erzeugt das Schlüsselpaar und behält den einen für sich, während er den anderen öffentlich verbreitet. Will jemand dem Besitzer eine geheime Nachricht senden, verschlüsselt er mit dem öffentlichen Schlüssel. Diese Nachricht kann niemand entschlüsseln, ausgenommen der Besitzer des privaten Schlüssels. Besitze ich also die öffentlichen Schlüssel aller meiner Freunde, kann ich denen verschlüsselte Nachrichten senden, die garantiert niemand abhören kann.

Signieren mit asymmetrischen Schlüsseln

Das Schlüsselpaar kann auch zum Signieren, quasi dem Unterschreiben, von Nachrichten dienen. In der einfachen Variante verschlüsselt der Besitzer des privaten Schlüssels die Nachricht mit seinem Schlüssel. Jeder kann diese Nachricht mit dem öffentlichen Schlüssel wieder in den Klartext bringen. Wenn dies möglich ist, muss der Absender im Besitz des privaten Schlüssels sein und der entschlüsselte Text muss so von ihm verschlüsselt worden sein.

Dieses Verfahren hat aber den Nachteil, dass die Nachricht vor dem Lesen entschlüsselt werden muss. Soll die Nachricht allgemein lesbar sein und nur eine Unterschrift daran hängen, verwendet man einen anderen Kniff. Hier wird eine Art Quersumme über den Text gebildet und diese verschlüsselt. Nun kann der Text von allen gelesen werden. Wer die Signatur prüfen will, entschlüsselt die Quersumme. Geht das, besitzt der Autor den privaten Schlüssel. Passt die Quersumme auf den Text, ist nichts verändert worden.

http://willemer.de/informatik/web/kryptografie.htm#asymmetrisch

Zertifikat

Die Idee hinter einem Zertifikat ist vergleichbar mit dem asymmetrischen Schlüsselpaar. Das Zertifikat enthält den öffentlichen Schlüssel. Dieser wird beispielsweise von der Bank für den Betrieb von HTTPS zur Verfügung gestellt. Der einzige Haken ist, dass der Besucher nicht weiß, ob das Zerifikat wirklich von der Bank seines Vertrauens oder der Mafia stammt. Dieser öffentliche Schlüssel könnte genauso gefälscht sein wie die Webseite, auf der es steht.

Hier könnte beispielsweise das Innenministerium weiterhelfen, indem es alle öffentlichen Schlüssel deutscher Webseiten mit seinem privaten Schlüssel verschlüsselt. Das wäre dann wie ein Stempel im Personalausweis. Dann muss jeder Benutzer das Zertifikat nur mit dem öffentlichen Schlüssel des Innenministeriums entschlüsseln. Klappt das, ist entschlüsselte Schlüssel vom Innenministerium geprüft und ist wirklich der öffentliche Schlüssel der Bank. Der Browser benötigt also nur noch den öffentlichen Schlüssel des Innnenministeriums, um alle Schlüssel deutschlandweit zu prüfen.

Leider hat das Innenministerium diese Aufgabe nicht übernommen. Also wurde diese Aufgabe zunächst von großen Computerfirmen übernommen und später von anderen Einrichtungen, die man als Zertifizierungsstellen bezeichnet. Diese signieren nun das von Ihrer Bank, von anderen Banken und ganz vielen weiteren Unternehmen vorgelegte Zertifikate mit ihrem privaten Schlüssel. Dabei wird auch die URL gegen das vorgelegte Zertifikat signiert.

Nun muss der Browser nur noch den öffentlichen Schlüssel der Zertifizierungsstelle haben und schon kann er prüfen, ob das Zertifikat von der Zertifizierungsstelle signiert wurde. Zwar gibt es jede Menge Zeritifizierungsstelle, aber längst nicht so viele wie Zertifikate.

  1. Der Browser prüft also zunächst die Signatur des Zertifikats mit dem öffentlichen Schlüssel der Zertifizierungsstelle.
  2. Der Browser prüft dann, ob die signierte URL auch zu der aufgerufenen URL passt und kann nun sicher sein, dass es die Webseite der Bank und nicht ein Betrüger ist.
  3. Nun kann das Zertifikat, das ja eigentlich ein öffentlicher Schlüssel ist, für den Aufbau einer verschlüsselte Sitzung zwischen Bank und Browser verwendet werden.
  4. Damit könnte man schon verschlüsseln. Aber wir erinnern uns, dass asymmetrische Verschlüsselungen langsam sind. Also wird die asymmetrische Verschlüsselung dazu verwendet, einen Schlüssel für eine symmetrische Verschlüsselung auszuwürfeln. Der dabei generierte Schlüssel ist zufällig und nur für diese Sitzung gültig.
  5. Mit diesem symmetrischen Schlüssel kann nun die eigentliche Sitzung in hohem Tempo verschlüsselt werden.

Zertifizierungsstellen

Die Zertifizierung ist aufwändig und die Zertifizierer lassen sich ihren Aufwand natürlich bezahlen. Für Banken und andere kommerzielle Einsätze lohnt sich das. Damit die Verschlüsselung auch im privateren Umfeld attraktiv ist, bietet Let's Encrypt (https://letsencrypt.org) kostenlose Zertifikate für Webseiten an.

Vielleicht möchten Sie sehen, welche Zertifizierungsstellen es so gibt. Die Liste der Zertifizierer können sich beispielsweise im Firefox anschauen.

  1. Klicken Sie im Menü auf EINSTELLUNGEN | ERWEITERT | ZERTIFIKATE.
  2. Dort wählen Sie den Button ZERTIFIKATE ANZEIGEN.
  3. Klicken Sie auf den Reiter ZERTIFIZIERUNGSSTELLEN.

Da tauchen irgendwelche Organisationen auf, von denen Sie vielleicht noch nie gehört haben. Aber darf man diesen wirklich die Geheimnisse des Online-Bankings anvertrauen? Die Antwort ist, dass man das gar nicht tut. Verschlüsselt wird das Online-Banking mit dem Schlüssel der Bank. Der Zertifizierer bestätigt nur dass die Bank wirklich die Bank ist. Sollte unter den Zertifizierern also ein Krimineller sein, nützt ihm das nichts, weil er an die verschlüsselten Daten erst einmal nicht kommt. Sollte ein Zertifizierer aber schlampig oder vorsätzlich falsch zertifizieren, fliegt er hoffentlich bald aus der Liste der Zertifizierer.

Wir basteln einen SSH-Key

Schlüssel und Zertifikate lassen sich mit Bordmitteln selbst erstellen. Für den Einsatz von SSH, also ssh, scp oder auch rsync gibt es ein einfach zu bediendendes Tool namens ssh-keygen. Dieses generiert ein passendes asymmetrisches Schlüsselpaar.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/arnold/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in huhu
Your public key has been saved in huhu.pub
The key fingerprint is:
SHA256:RoTibyLWtQ3413JfYwN3q06p7PeCMC4zDSNDJnAizTg arnold@tab
The key's randomart image is:
+---[RSA 3072]----+
| + .. |
|Eoo.. .. |
|..+. o . |
| .ooo. . . .|
| .++ +S. o ..|
| o oo=++oo *. |
| . . oo.=oo..=.o |
| + o..++ |
| + .+o.o. |
+----[SHA256]-----+

Die erste Eingabe erwartet den Dateinamen und Pfad. Vorgegeben ist die Datei .shh/id_rsa im Heimatverzeichnis. Daneben legt ss-keygen auch noch den öffentlichen Schlüssel .shh/id_rsa.pub an. Dieses Schlüsselpaar wird standardmäßig herangezogen, wenn nach einem Schlüssel für diesen Benutzer gesucht wird. Wenn man ein zweites Schlüsselpaar benötigt, gibt man besser einen anderen Namen an, damit das Original nicht zerstört wird. Ein Wechsel des Schlüssels kann nachfolgend große Verwirrung bedeuten.

Anschließend fragt ssh-keygen nach einer Passphrase. Im Gegensatz zu einem Passwort sollte man eine Passphrase nicht in erster Linie kryptisch gestalten, sondern eher lang. Sie muss bei der Verwendung des Schlüssel als zweite Sicherheit eingetippt werden. Allerdings sollte man sich gut überlegen, ob man eine Passphrase anlegt. In manchen Situationen wie etwa bei zeitgesteuerten Datensicherungen gibt es niemanden, der die Passphrase eintippen kann.

Bei der Anwendung muss der öffentliche Schlüssel bei jedem Zielrechner hinterlegt werden, in den man sich ohne Passwort einloggen will.

Wir basteln ein Zertifikat mit OpenSSL

Mit dem Programm openssl können Sie sich ein eigenes Zertifikat erstellen. Das können Sie sich von einer Zertifizierungsstelle authorisieren lassen. Für den internen Bedarf können Sie es sogar selbst zertifizieren. Das wird im Internet natürlich nicht akzeptiert, solange Sie nicht ganz offiziell zu den CAs (Certified Authority) aufsteigen.

Dazu installieren Sie zunächst das Softwarepaket openssl mit dem folgenden Befehl, sofern es nicht bereits auf Ihrem Linux-Server installiert ist.

# apt install openssl

Certificate Signing Request

Zunächst erzeugen Sie einen Certificate-Signing-Request (CSR). Das ist der Schlüssel, den Sie der Zertifizierungsstelle vorlegen werden. Dazu rufen Sie den Befehl openssl mit dem Kommando req auf. Das Ergebnis wird in eine Datei umgeleitet, die im Beispiel mein.cert.csr heißt.

# openssl req -new> mein.cert.csr
Generating a 1024 bit RSA private key
....................++++++
..................++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
...

Sie werden um eine Passphrase gebeten, die Sie noch einmal wiederholen sollen. Sie werden sie später noch einmal benötigen. Darüber hinaus werden Sie zu Details der Organisation gefragt, für die das Zertifikat gedacht ist. Ihre Antworten werden dem Benutzer helfen, Ihr Zertifikat zuordnen zu können. Auch hier sollten Sie sich Ihre Antworten merken.

Vor allem der »Common Name« sollte der URL der Webseite entsprechen. Diese wird der Browser später gegen die aufgerufene URL prüfen. Passen die aufgerufene URL nicht mit dem Common Name überein, wird das Zertifikat abgelehnt.

Als Ergebnis erhalten Sie zwei Dateien: mein.cert.csr und den privaten Schlüssel privkey.pem.

Phrase integrieren

Im nächsten Schritt wird der Passphraseschutz in den Schlüssel integriert. Das scheint widersinnig zu sein, aber bei einem Server wäre es schon ärgerlich, wenn der Administrator regelmäßig die Passphrase neu eintippen müsste.

# openssl rsa -in privkey.pem -out mein.cert.key

Das Programm bittet Sie um die Passphrase, die in der Datei mein.cert.key eingearbeitet ist. Sie haben sie sich hoffentlich gemerkt. Sie sollten nun schön auf diese Datei aufpassen. Das fängt schon damit an, dass Sie ein Leseverbot aussprechen. chmod ist da ein guter Partner.

Signieren mit der Certified Authority

Jetzt muss das Zertifikat noch signiert werden. Das erledigt eine Zertifizierungsstelle (CA). Für die Tests können Sie auch einmal selbst Zertifizierungsstelle spielen.

# openssl x509 -req -days 365 -in mein.cert.csr \
-signkey mein.cert.key -out mein.cert.crt

Sie werden noch einmal die Fragen beantworten müssen, die Sie schon bei der Erstellung des Requests beantwortet haben. In diesem Fall allerdings sind Sie die Zertifizierungsstelle und nicht der Antragsteller. Sie müssen also Ihre Identität als CA eintragen.

Die Datei mein.cert.crt ist nun der zertifizierte öffentliche Schlüssel, den Sie dem Anfrager zurücksenden würden, damit er sie verwenden kann.

Verschlüsselte Dateien und Dateisysteme

Sie könnnen mit dem Tool gpg schnell Dateien verschlüsseln und entschlüsseln. Dabei greift gpg auf Schlüssel zurück, die in der Datei .gnugpg/pubring.gpg abgelegt sind.

Dort liegen jede Mange öffentliche Schlüssel herum, die beispielsweise Thunderbird eingesammelt hat. Dort liegen aber auch private Schlüssel.

Einen Überblick der öffentlichen Schlüssel erhalten Sie mit dem Befehl:

$ gpg --list-public-keys
/home/arnold/.gnupg/pubring.gpg
-------------------------------
pub dsa1024 2009-12-15 [SC]
4ABA2F66DBD5A95894910E0673D770CDA59047B9
uid [ unbekannt] HPLIP (HP Linux Imaging and Printing) <hplip@hp.com>
sub elg2048 2009-12-15 [E]

pub rsa4096 2018-07-21 [SCA]
79A975BB2C3EA54758575E9237594643748EBB0E
uid [uneingeschränkt] Arnold Willemer <arnold-willemer@gmx.de>
sub rsa4096 2018-07-21 [E]
...

Alle dort aufgeführten Kennungen können Sie zum Verschlüsseln verwenden. Aber nur diejenigen, die den passenden privaten Schlüssel besitzen, können diese Datei dann auch lesen. Wenn Sie die verschlüsselte Datei also selbst wieder entpacken wollen, sollten Sie den privaten Schlüssel besitzen. Auch dafür können Sie eine Liste erfragen.

$ gpg --list-secret-keys
/home/arnold/.gnupg/pubring.gpg
-------------------------------
sec rsa4096 2018-07-21 [SCA]
79A975BB2C3EA54758575E9237594643748EBB0E
uid [uneingeschränkt] Arnold Willemer <arnold-willemer@gmx.de>
ssb rsa4096 2018-07-21 [E]

Das Verschlüsseln erfolgt mit dem Aufruf von gpg mit der Option -e für encrypt. Sie können mehrere Schlüssel angeben. Jeder, der den passenden privaten Schlüssel besitzt, kann später die Datei entschlüsseln. Wurde bei der Erstellung des Schlüssels eine Passphrase angegeben, muss diese auch beim Entschlüsseln eingegeben werden. Das ermöglicht noch einmal eine zusätzliche Sicherheit, falls jemand das Notebook mit den privaten Schlüsseln geklaut haben sollte.

$ gpg -e geheimedatei
Sie haben keine User-ID angegeben (Sie können die Option “-r” verwenden).

Derzeitige Empfänger:

Geben Sie die User-ID ein. Beenden mit einer leeren Zeile:
arnold-willemer@gmx.de

Derzeitige Empfänger:
rsa4096/BFE16FB6E1F3C484 2018-07-21
“Arnold Willemer <arnold-willemer@gmx.de>”

Geben Sie die User-ID ein. Beenden mit einer leeren Zeile:
$

Nun gibt es neben der unverschlüsselten Datei eine verschlüsselte, die durch die Endung .gpg gekennzeichnet ist. Diese kann später mit der Option -d für decrypt entschlüsselt werden.

$ gpg -d geheimedatei.gpg> huhu
gpg: verschlüsselt mit 4096-Bit RSA Schlüssel, ID BFE16FB6E1F3C484,
erzeugt 2018-07-21
“Arnold Willemer <arnold-willemer@gmx.de>”

Es erscheint zunächst ein Dialog für die Eingabe der Passphrase, sofern der Schlüssel mit einer Passphrase angelegt wurde. Anschließend erscheint die Meldung über die Entschlüsselungsdetails auf dem Fehlerkanal. Darum können Sie den unverschlüsselten Anteil in eine andere Datei umleiten.

Bei einer Textdatei ist es durchaus sinnvoll, das Ergebnis auf den Befehl more umzuleiten. So entsteht keine Datei, die die Informationen im Klartext enthält.

$ gpg -d auktionen.gpg | more