Was ist Public-Key-Kryptografie?

September 21, 2018
Autor:in:

Was ist Public-Key-Kryptografie?


Hallo und Danke fürs Lesen! Dieser Blogpost ist eine Übersetzung von What is Public Key Cryptography? Während wir unsere Übersetzungsprozesse verbessern, würden wir uns über Dein Feedback an help@twilio.com freuen, solltest Du etwas bemerken, was falsch übersetzt wurde. Wir bedanken uns für hilfreiche Beiträge mit Twilio Swag :)

Von TLS bis Authentifizierung – der Begriff „krypto“ bezieht sich nicht nur auf Währungen. Das Thema Sicherheit sollte für jeden Entwickler oberste Priorität haben, und die Kryptografie ist ein wichtiger Baustein der Bibliotheken und Tools, die wir zum Schutz unserer Daten und Anwendungen einsetzen. In diesem Blog-Beitrag geht es um die Public-Key-Kryptografie, die auch als asymmetrische Kryptografie bezeichnet wird. Ich gebe einen Überblick über die Funktionsweise und die Anwendungsbereiche im Alltag, beispielsweise, wie wir bei Twilio Public-Key-Kryptografie in unserer Anwendung Authy und zur Sicherung unserer API nutzen.

Wir beginnen jedoch mit ein paar Informationen zum Hintergrund und zur Entstehung.

Wer sind Alice und Bob?

Alice und Bob sind berüchtigt für ihre unlauteren Machenschaften. Wir wissen nicht, was sie derzeit planen, aber es ist klar, dass weder wir noch die überaus neugierige Eve davon erfahren sollen. Bevor es das Internet gab, konnten Alice und Bob geheime Botschaften austauschen, indem sie den Text mit einem bestimmten Code verschlüsselten. Dabei haben sie eventuell Buchstaben substituiert oder verschoben oder mit anderen ausgereiften Verfahren kodiert. Die verwendete Methode wurde im Voraus vereinbart, sodass beide wussten, wie sie die Nachricht verschlüsseln und entschlüsseln können.

Symmetrische Kryptographie

Dies wird als symmetrische Kryptografie bezeichnet, da für die Ver- und Entschlüsselung derselbe Schlüssel verwendet wird. Spione im zweiten Weltkrieg nutzten diesen Ansatz sehr erfolgreich. Doch was, wenn Sender und Empfänger sich nicht vorab auf einen Schlüssel einigen können?

Die Public-Key- bzw. asymmetrische Kryptografie wurde erfunden, damit Leute wie Alice und Bob sicher miteinander kommunizieren können, ohne sich erst bei einem Treffen auf einen Schlüssel zu einigen zu müssen oder zu riskieren, dass jemand wie Eve sie über unsichere Kommunikationskanäle belauscht und den Schlüssel in die Hände bekommt. Insbesondere in Bezug auf das Internet ist dies ein unerlässlicher Fortschritt, da unsere Transaktionen und Kommunikationen sich nicht mehr ausschließlich auf Menschen beschränken, die wir kennen und denen wir vertrauen.

Was ist Public-Key-Kryptografie?

Bei der Public-Key-Kryptografie, die auch als asymmetrische Kryptografie bezeichnet wird, hat jede Entität zwei Schlüssel bzw. Keys:

  • Public Key – darf weitergegeben werden
  • Private Key – muss geheim bleiben

Diese Schlüssel werden mithilfe eines Algorithmus gleichzeitig generiert und sind mathematisch miteinander verbunden. Bei Verwendung des RSA-Algorithmus werden die Schlüssel auf eine der folgenden Arten kombiniert:

1. Verschlüsselung mit einem Public Key

Anwendungsfall: Senden von Nachrichten, die nur der beabsichtigte Empfänger lesen kann.

Bob verschlüsselt eine Klartextnachricht mit dem Public Key von Alice. Anschließend entschlüsselt Alice den Geheimtext mit ihrem Private Key. Da außer Alice niemand Zugang zu dem Private Key hat, kann nur Alice die Nachricht lesen.

2. Signieren mit dem Private Key

Anwendungsfall: Verifizieren, dass die Nachricht wirklich vom erwarteten Sender gesendet wurde.

Alice verschlüsselt eine Klartextnachricht mit ihrem Private Key und sendet dann den Geheimtext an Bob. Bob entschlüsselt den Geheimtext mit dem Public Key von Alice. Da mit dem Public Key nur Nachrichten entschlüsselt werden können, die mit dem Private Key von Alice signiert wurden, können wir uns darauf verlassen, dass die Originalnachricht tatsächlich von Alice stammt.

Es ist auch möglich, diese beiden Methoden zu kombinieren, um eine Nachricht mit zwei unterschiedlichen Schlüsselpaaren zu verschlüsseln und zu signieren.

Anwendungsfälle für die Public-Key-Kryptografie

Die Public-Key-Kryptografie wird für zahlreiche Einsatzbereiche genutzt:

Wie Twilio die Public-Key-Kryptografie nutzt

Authy-Push-Authentifizierung

Authy-Push-Authentifizierung

Verify Push API

Twilio nutzt die Public-Key-Kryptografie beispielsweise bei Authy-Anwendungen für die Push-Authentifizierung (siehe oben). Für jede Website, die du auf Authy aktivierst, generiert dein Gerät ein neues RSA-Schlüsselpaar auf deinem Gerät und sendet nur den Public Key an unsere Server – dein Private Key bleibt grundsätzlich auf deinem Gerät. Wenn du auf deinem Gerät eine Anfrage genehmigst oder ablehnst, validiert die Authy-App Folgendes:

  • Dass die Anfrage tatsächlich von dem Sender stammt, der die Kontrolle über den Private Key hat
  • Dass die Autorisierungsanfrage nicht bei der Übertragung modifiziert wurde

SHAKEN/STIR

SHAKEN (Signature-based Handling of Asserted information using toKENs)/STIR (Secure Telephone Identity Revisited) ist ein neuer Branchenstandard, mit dem Robocalls bekämpft und Spam-Anrufer effizient erkannt werden sollen. SHAKEN/STIR nutzt eine Public-Key-Infrastruktur mit zentralisierten Zertifizierungsstellen (Certificate Authorities, CAs) und ähnelt TLS. Twilio setzt diese Technologie ein, um deine Anrufe zu signieren und zu authentifizieren. Hier erfährst du mehr über die Aktivierung von SHAKEN/STIR.

PKCV

Twilio nutzt außerdem Public Key Client Validation (PKCV) als zusätzliche Sicherheitsschicht bei API-Anfragen. Wenn du eine Anfrage per Public Key Client Validation sendest, validiert Twilio – ähnlich wie bei Authy – Folgendes:

  • Dass die Anfrage tatsächlich von dem Sender stammt, der die Kontrolle über den Private Key hat
  • Dass die Nachricht nicht bei der Übertragung modifiziert wurde

Hier erfährst du mehr über die PKCV und ihre Implementierung.

Wie funktioniert Public-Key-Kryptografie? Trapdoor-Funktionen für mehr Sicherheit

farbige Farben

Stell dir vor, du würdest zwei Farben miteinander vermischen: ein sehr einfacher Vorgang. Schwierig wird es erst, wenn es darum geht, das Gemisch wieder in die ursprünglichen Farben zu zerlegen. Bei der physischen Sicherheit ist uns dieses Konzept geläufig – Beispiele dafür sind Kabelbinder, Schlösser, manipulationssichere Schrauben, versiegelte Pakete u. v. m. Es ist möglich, diese Barrieren unentdeckt zu überwinden, allerdings ist der Aufwand so groß, dass die meisten Menschen weder die nötige Zeit noch das nötige Geld darin investieren wollen. Die Kryptografie funktioniert nach demselben Prinzip. Es finden einfache Berechnungen in eine Richtung statt, deren Umkehrung jedoch ohne den erforderlichen Schlüssel extrem schwierig ist. Dieses Verfahren wird auch als Trapdoor-Einwegfunktion bezeichnet.

Bei der digitalen Sicherheit erreichen wir dies, indem wir besonders große Primzahlen miteinander multiplizieren. Ein Computer kann mühelos das Produkt von zwei 600-stelligen Primzahlen berechnen. Aber anhand des Ergebnisses die verwendeten Multiplikatoren zu ermitteln, ist sehr viel schwieriger.

Deine Herausforderung: Finde die beiden Primzahl-Multiplikatoren von 4.757

Es gibt verschiedene Lösungswege, darunter „Brute Force Trial and Error“. Bei einer vierstelligen Zahl könntest du beispielsweise ein Skript schreiben, das bekannte Primzahlen durchschleift. Wenn die Zielzahl jedoch erst einmal 1000 Stellen lang ist, nimmt dies extrem viel Zeit in Anspruch.

Deine nächste Herausforderung: Multipliziere 67 mit 71

Das ist deutlich einfacher!

Deine letzte Herausforderung: Lass uns gemeinsam ein Schlüsselpaar erstellen! Keine Panik, ich gehe das Schritt für Schritt mit dir durch. Die Zahlen in unserem Beispiel sind absichtlich klein gehalten.

Hinweis: Dieses Beispiel dient nur zu Lehrzwecken. Bitte erstelle keine eigene Kryptografie für deine Anwendung!

Wir verwenden in diesem Beispiel den RSA-Algorithmus, eine von vielen Optionen zum Berechnen von Schlüsselpaaren für die asymmetrische Verschlüsselung. Du kannst mithilfe des folgenden Python-Codes mitmachen oder dir das gesamte Skript in meinem GitHub ansehen.

1. Wähle zwei Primzahlen aus:

p = 67
q = 71

2. Multipliziere die Primzahlen miteinander

n = p * q
# n = 67 * 71
# n = 4757

3. Finde das kleinste gemeinsame Vielfache (least common multiple, lcm im Screenshot) von p -1 und q -1

import math

def lcm(a, b):
   return a * b // math.gcd(a, b)

x = lcm(p - 1, q - 1)
# x = lcm(67 - 1, 71 - 1)
# x = lcm(66, 70)
# x = 2310

4. Wähle eine Zahl, die kleiner als x und kein Divisor von x ist:

e = 23

5. Berechne den modularen Kehrwert von e:

def inverse_mod(e, x):
   t = 0
   newt = 1
   r = x
   newr = e
   while newr != 0:
       q = r // newr
       t, newt = newt, t - q * newt
       r, newr = newr, r - q * newr
   if r > 1:
       return None
   if t < 0:
       t += x
   return t

d = inverse_mod(e, x)
# d = 1607

Jetzt haben wir alles zusammen, was wir zur Erstellung unserer Schlüssel brauchen!

public_key = (4757, 23) # (n, e)
private_key = (4757, 1607) # (n, d)

Mit dem Public Key verschlüsseln wir eine Nachricht:

message = 123
encrypted = pow(message, e, n)
# encrypted = pow(123, 23, 4757)
# encrypted = 418

Und mit dem Private Key entschlüsseln wir die Nachricht:

decrypted = pow(encrypted, d, n)
# decrypted = pow(418, 1607, 4757)
# decrypted = 123

... dadurch erhalten wir die ursprüngliche Nachricht!

Algorithmen für Public-Key-Kryptografie und Schlüsselgröße

Publik-Key-Kryptographie – Witz

https://twitter.com/kayandrae07/status/1042026591856017408

RSA (Rivest-Shamir-Adleman)

Das Beispiel hat gezeigt, wie diese Trapdoor-Einwegfunktionen in typische Kryptografie-Algorithmen eingebettet werden. Die meisten unserer bisherigen Erläuterungen bezogen sich auf das RSA-Verfahren, das nach den Forschern Rivest, Shamir und Adleman benannt wurde. RSA ist einer der am häufigsten verwendeten Verschlüsselungsalgorithmen für die Public-Key-Kryptografie. Wenn du schon mal einen GitHub-SSH-Key generiert hast, hast auch du vermutlich diesen Algorithmus verwendet:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

So erstellst du ein RSA-Schlüsselpaar in der Praxis. Wir sehen uns die Bestandteile dieses Befehls nun einmal genauer an.

ssh-keygen ist ein Befehl, der in MacOS und Linux (und in Git Bash für Windows ) zur „Generierung, Verwaltung und Konvertierung von Authentifizierungsschlüsseln“ verwendet wird.

-t rsa gibt an, dass der RSA-Algorithmus zu verwenden ist. Weitere Optionen sind dsa (Digital Signature Algorithm) und ecdsa (Elliptic Curve DSA).

xkcd

https://xkcd.com/538/

-b 4096 gibt die zu verwendende Schlüsselgröße in Bit an. Die Schlüsselgröße wirkt sich auf das Sicherheitsniveau aus, wobei die Sicherheit in Bit gemessen wird. Das Sicherheitsniveau ist „eine Zahl, die angibt, wie aufwendig (also die Anzahl der Vorgänge) das Knacken des kryptografischen Algorithmus oder Systems ist“, basierend auf der NIST-Empfehlung zur Schlüsselverwaltung. Ein RSA-Schlüssel mit einer Größe von 2048 entspricht beispielsweise einem Sicherheitsniveau von 112 Bit, eine Schlüsselgröße von 3072 entspricht 128 Bit Sicherheit.

Die aktuellen NIST-Empfehlungen lauten, mindestens 2048 Bit für RSA-Schlüssel zu verwenden. Diese Empfehlungen berücksichtigen Fortschritte in Bezug auf die Hardware- und Rechenleistung. Wenn die Sicherheit der Schlüssel auch nach 2030 gewährleistet sein soll, empfiehlt NIST eine Verschlüsselung von 3072 Bit.

Nach dem Ausführen dieses Befehls auf deinem Computer hast du zwei Dateien: einen Public Key und einen Private Key. Es ist wichtig, dass du dies auf deinem eigenen Computer erledigst, dann brauchst du nur den Public Key auf die GitHub-Server zu kopieren. Ab jetzt wird jedes Mal, wenn du Code auf GitHub hochlädst, die betreffende Anfrage mit einem Private Key signiert. Dabei führt GitHub die Authentifizierung mit deinem Public Key durch. Hinweis: Die ssh-Authentifizierung ist nicht identisch mit dem Signieren von Git-Commits. Für Letzteres wird GPG verwendet, eine andere Form der Public-Key-Kryptografie. Du siehst, die Public-Key-Kryptografie ist weit verbreitet!

Nachfolgend findest du eine Auswahl weiterer typischer Algorithmen, auf die du möglicherweise bei deiner Arbeit stößt:

Diffie-Hellman

Dieses Verfahren ist die Grundlage der Public-Key-Kryptografie. Beim Diffie-Hellman-Ansatz erstellen zwei Personen gemeinsam einen Geheimschlüssel für die gemeinsame Verwendung. Ziemlich praktisch das Ganze. In diesem Video wird verständlich erläutert, wie der Diffie-Hellman-Ansatz funktioniert.

Diffie-Hellman-Key-Austausch

Elliptic-Curve Cryptography (ECC)

Dieser Ansatz gewinnt zunehmend an Beliebtheit, weil der Elliptic Curve DSA-Algorithmus ein mit RSA vergleichbares Sicherheitsniveau erreichen kann, und zwar mit kleineren Schlüsselgrößen. ECC wird beispielsweise auch für Kryptowährungen wie Bitcoin eingesetztWenn du mehr über die Funktionsweise von ECC wissen möchtest, empfehle ich dir dieses Erklärvideo.

Elliptic-Curve-Kryptologie

Elliptic Curve-Addition (Bild von SuperManu [GFDL oder CC BY-SA 3.0], über Wikimedia Commons)

Kryptografie in deinen Anwendungen

Grundsätzlich gilt, dass du keine eigene Kryptografie erstellen solltest. Verwende stattdessen Bibliotheken, die weithin anerkannte Verschlüsselungsarten wie RSA nutzen. Bei der Erstellung allgemeiner Sicherheits-Workflows – wie z. B. Logins – ist zu berücksichtigen, dass die Verschlüsselung bei den meisten führenden Frameworks bereits integriert ist.

Nachdem du nun einen Einblick in die Grundlagen zur Sicherheit gewonnen hast, könntest du als nächsten Schritt deine Passwortanforderungen überprüfen oder die Zwei-Faktor-Authentifizierung implementieren. Falls du Fragen zur Kryptografie hast, kannst du sie über die Kommentare stellen oder mich über Twitter unter @kelleyrobinson erreichen.