Wie funktioniert die heutzutage weitverbreitete asymmetrische Verschlüsselung? Dieser Artikel soll einen mathematischen Erklärungsansatz am Beispiel des RSA-Verschlüsselungssystems liefern.

Der Begriff Kryptographie umfasst heutzutage mehrere Themengebiete, wie z.B. die Informationssicherheit, Verschlüsselungsverfahren, etc. Belegbare Nutzung von Kryptographie tritt erstmals im dritten Jahrhundert v. Chr. bei den Ägyptern auf. Der Sprachgebrauch „kryptische Zeichen“ lässt sich auch heute noch gut zur Versinnbildlichung als Beispiel benutzen.

Was ist asymmetrische Verschlüsselung?

Bei einem asymmetrischen Verschlüsselungsverfahren erzeugt \(XY\) einen privaten (geheimen) Schlüssel \(priv\_key\) und einen öffentlichen (nicht geheimen) Schlüssel \(pub\_key\). Der öffentliche Schlüssel ist für jeden frei zugänglich und dient lediglich dem Verschlüsseln einer Nachricht \(m\). Diese verschlüsselte Nachricht \(m‘\) kann nun aber nur mithilfe des privaten Schlüssels \(XY\) wieder zur ursprünglichen Nachricht m entschlüsselt werden.

Wie funktioniert die asymmetrische Verschlüsselung?

Dazu müssen die Erzeugung der Schlüssel und die zugehörigen Bedingungen genauer betrachtet werden:

Zuerst werden zwei (eigentlich sehr große) Primzahlen, z.B. \(p=7\) und \(q=17\) benötigt. Damit wird \(N=p*q\) berechnet, also in diesem Fall \(N=7*17=119\). Das ist schon fast der öffentliche Schlüssel. Für den zweiten Teil (\(e\)) benötigen wir die Eulersche Phi-Funktion \(?(N)\), welche die Anzahl an zu \(N\) teilerfremden natürlichen Zahlen, die kleiner als \(N\) sind, angibt.

Da \(N=p*q\) hier das Ergebnis einer Multiplikation zweier Primzahlen ist, gilt \(?(N)=(p-1)*(q-1)\) und dazu muss \(e\), der zweite Teil des öffentlichen Schlüssels, teilerfremd sein. Wenn \(e\) und \(?(N)\) teilerfremd sind, bedeutet das, es existiert keine Zahl, welche \(e\) oder \(?(N)\) teilt (außer die \(1\)). Zum Beispiel sind Vier und Fünf teilerfremd, aber Vier und Sechs nicht (die Zwei ist ein gemeinsamer Teiler: \(4/2=2={\text{ ganze Zahl }}=3=6/2\). Teilen meint, das Ergebnis muss eine ganze Zahl(ohne Komma) sein.

Zurück zu unserem Beispiel:

\(?(N)=6*16=96\) und z.B. \(e=11\) ist teilerfremd zu \(?(N)=96\), da \(11\) eine Primzahl ist, somit keine „echten Teiler“ (außer die Eins) hat und die \(96\) auch nicht teilt. Der öffentliche Schlüssel ist folglich \((e,N)=(11,119)\).

Und jetzt?

Möchte man nun \(XY\) die Nachricht \(DA\) verschlüsselt zu schicken, so muss zuerst die Nachricht \(DA\) in ein Zahlenformat kodiert werden. Dazu benutzt man z.B. die einfachste Form \(A=1, B=2, C=3, D=…\) (Wichtig: Beide Parteien müssen sich auf eine Kodierung einigen!). Somit muss nun die Nachricht \(m=41\) (\(DA\)) verschlüsselt werden. Dazu muss \(m‘ = (m^e \mod N)\) berechnet werden. \(41^{11}\) ergibt 550.329.031.716.248.441 und diese enorm große Zahl (trotz vergleichsweise sehr kleiner Primzahlen und kleinem \(e\)), wird nun modulo \(119\) gerechnet. Das ergibt \(48\). Modulo ist Teilen mit Rest, z.B errechnet man bei \(100 \mod 3\) gerade \((99/3=33) {\text{ Rest }} 1\) und damit ist \(1\) das Ergebnis von \(100 \mod 3\).

Festzuhalten bleibt, die verschlüsselte Nachricht ist \(m’=48\).

Aber wer kann diese Nachricht entschlüsseln?

Das Entschlüsseln geht nur mit dem privaten Schlüssel von \(XY\). Dieser besteht zum einen aus \(N=p*q\), also \(7*17=119\). Zur Erinnerung, \(p\) und \(q\) waren die beiden Primzahlen, die zur Erzeugung des öffentlichen Schlüssels benutzt wurden. Der zweite Teil des privaten Schlüssels (\(d\)), ist das Inverse von \(e\) bezüglich \(\mod ?(N)\). Das heißt, \(d\) muss die Gleichung \((d*e \mod ?(N))=1\) erfüllen.

In diesem Beispiel \((d*11 \mod 96)=1\). Diese Gleichung ist analog zu \(d*11+k*96=1\), welche sich zum Beispiel mit dem erweiterten euklidischen Algorithmus lösen lässt. Dieser berechnet hier \(d=35\) und \(k=(-4)\). Somit ist der private Schlüssel \((35,119)\).

Nun geht es ans Entschlüsseln!

Die verschlüsselte Nachricht, die \(XY\) bekommen hat, lautet \(m’=48\). Die Gleichung für die Entschlüsselung ist \(m=((m‘)^d \mod N)\), und \(48^{35}\) ergibt:

69.733.796.196.349.127.882.498.386.212.799.025.430.591.303.459.053.745.733.632 .

Diese riesige Zahl nun \(\mod 119\) ist \(41\), welches decodiert (\(A=1, B=2,…\)) \(DA\) ergibt.

taaa\(DA\)!

Zusammenfassung

Zuerst wird mithilfe zweier (in der Regel sehr großen) Primzahlen \(N=p*q\) und \(?(N)=(p-1)*(q-1)\) berechnet. Die Primzahlen \(p\) und \(q\) werden nun vergessen bzw. weggeworfen und im Grunde beruht die Sicherheit der RSA-Verschlüsselung darauf, dass kein bekanntes Verfahren existiert, das die Zahl \(N\) in realer Zeit in seine Primfaktoren \(p\) und \(q\) zerlegt. Denn nur mit \(?(N)=(p-1)*(q-1)\) kann sowohl der öffentliche (\(pub\_ key\)), als auch private (\(priv\_ key\)) Schlüssel erzeugt bzw. berechnet werden.

Nachdem die Nachricht in ein Zahlenformat kodiert wird, kann die Verschlüsselung der Nachricht durch Potenzieren der kodierten Nachricht mit dem privaten Schlüssel und anschließend modulo \(N\) (\(m’=(m^e \mod N)\)) berechnet werden. Die verschlüsselte (kryptische) Nachricht \(m‘\) kann nur durch Potenzieren mit dem privaten Schlüssel \(d \) wieder umgekehrt bzw. entschlüsselt werden (\(m=((m‘)^d \mod N)\)).

Schon 1998 stellten Boneh and Venkatesan auf der Eurocrypt-Konferenz Überlegungen vor, dass die Sicherheit von RSA-Verschlüsselung nicht mit dem Faktorisieren der Zahl \(N\) in seine Primfaktoren gleichzusetzen sein könnte.

Wer noch tiefer in das Thema eintauchen möchte, dem kann ich das Paper „Another Look at ‚Provable Security‘“ von Neal Koblitz und Alfred J. Menezes sehr empfehlen.