Beruflich Dokumente
Kultur Dokumente
Tobias M. Bölz
Inhaltsverzeichnis
1. Einleitung 2
2. Public-Key-Verschlüsselung 2
4. Beweis 4
5. Sicherheit 5
5.1. Angriffsmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5.2. Sicherheitsprobleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
6. Implementation 5
6.1. Schlüsselgenerierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
6.2. Berechnung von M e mod n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
A. Beispielprogramme 8
A.1. inversmod.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
A.2. encrypt1.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
A.3. encrypt2.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
B. Literatur 10
1
2 PUBLIC-KEY-VERSCHLÜSSELUNG
1. Einleitung
Das RSA-Verfahren war das erste Public-Key-Verschlüsselungsverfahren, das sowohl zur Verschlüsselung
als auch zur Erstellung digitaler Unterschriften eignete. Es wurde 19781 erfunden und ist nach seinen Erfin-
dern Ronald Rivest, Adi Shamir und Leonard Adleman benannt [1].
Da das Konzept eines Public-Key-Verschlüsselungsverfahren von Whitfield Diffie und Martin E. Hellman
[2] den Anstoss zu den Überlegungen gab, wird diese Idee im nächsten Abschnitt erklärt. Danach finden Sie
eine Beschreibung des RSA-Verfahrens und die Grundzüge eines möglichen Beweisverfahrens, Überlegun-
gen zur Sicherheit sowie Algorithmen, mit deren Hilfe man es implementieren kann.
2. Public-Key-Verschlüsselung
Das Konzept der Public-Key-Verschlüsselung (auch asymmetrische Verschlüsselung genannt) wurde 1976
von Whitfield Diffie und Martin E. Hellman entwickelt [2]: Jeder Benutzer veröffentlicht eine Verschlüsse-
lungsmethode E und hält die dazugehörige Entschlüsselungsmethode D geheim. Für E und D muss folgen-
des gelten:
(1) Die Entschlüsselung der Verschlüsselten Form der Nachricht M ist M, also
D(E(M)) = M
E(D(M)) = M
1 laut manchen Quellen 1977, die Veröffentlichung fand aber definitiv 1978 statt
2
3 BESCHREIBUNG DES VERFAHRENS
für einen bestimmten Empfänger bestimmt, so verschlüsselt man die signierte Nachricht mit dessen öffent-
lichen Schlüssel. Alternativ zur Signierung der gesamten kann auch nur eine unterschriebene Prüfsumme
mit der Nachricht versendet werden.
Diffie und Hellman stellten nur das Konzept, jedoch keine mögliche Implementation vor.
Um eine Nachricht M zu verschlüsseln, benötigt man einem öffentlichen Schlüssel (e, n). Zum Entschlüsseln
einer verschlüsselten Nachricht C benötigt man einen privaten Schlüssel (d, n).
Die Nachricht muss in Blöcke zerlegt werden und die Blöcke jeweils duch einen Integer zwischen 0 und
n − 1 repräsentiert werden. Welches Verfahren hier verwendet wird ist für die Verschlüsselung unerheblich,
da es nur dazu dient, die Nachricht in numerische Form zu bringen.
Eine Nachricht wird mit der Funktion
C = M e mod n
mit dem öffentlichen Schlüssel (e, n) verschlüsselt. Zur Entschlüsselung dient die Funktion
M = Cd mod n
n = p·q
p und q müssen geheim bleiben, da sich aus ihnen und dem öffentlichen Schlüssel der private Schlüs-
sel berechnen liese.
3
4 BEWEIS
• d ist eine große zufällige natürliche Zahl, die zu (p − 1) · (q − 1) teilerfremd ist, also
ggT(d, (p − 1) · (q − 1)) = 1
erfüllt.
• e ist das Inverse zu d bezüglich mod (p − 1)(q − 1), oder anders ausgedrückt
(e · d) mod (p − 1) · (q − 1) = 1
4. Beweis
Das RSA-Verfahren basiert grundlegend auf dem Satz von Euler, der besagt, dass
aϕ(n) ≡ 1 mod n
wenn a und n teilerfremd sind. Dabei ist ϕ(n) die Eulersche ϕ-Funktion, die die Anzahl aller natürlichen
Zahlen, die kleiner als n und teilerfremd zu n sind, liefert (Für einen Beweis siehe z. B. [3]).
Für Primzahlen gilt
ϕ(p) = p − 1
Bei RSA ist n das Produkt zweier Primzahlen p und q. Deshalb ist
ϕ(n) = ϕ(p) · ϕ(q)
= (p − 1) · (q − 1)
Die zu zeigenden Aussagen D(E(M)) = M und E(D(M)) = M mit E(M) = M e mod n und D(C) =
Cd mod n lässt sich gemäß der Potenzregel zur Restwertarithmetik folgendermaßen umformen:
M = D(E(M))
= (E(M))d mod n
= M e·d mod n
M = E(D(M)) mod n
= M e·d mod n
4
6 IMPLEMENTATION
5. Sicherheit
Man vermutet, dass die Sicherheit von RSA auf dem Problem der Faktorisierung großer Zahlen basiert.
Dies ist jedoch nicht bewiesen; es könnte sein, dass es noch andere Möglichkeiten gibt, M aus C und e zu
berechnen.
5.1. Angriffsmöglichkeiten
Eine Agriffsmöglichkeit besteht darin, n zu faktorisieren. Dann lässt sich aus den erhaltenen Zahlen und d e
berechnen. Eines der schnellsten Verfahren dazu ist die Elliptische-Kurven-Faktorisierung. Die sich daraus
ergebenden Schätzungen für die Dauer der Faktorisierung von n sehen Sie in Tabelle 1. Es ist also praktisch
unmöglich, n zu faktorisieren, wenn es groß genug ist.
Tabelle 1: Schätzung der Dauer der Faktorisierung von n unter Verwendung der Elliptische-Kurven-
Faktorisierung. (Quelle: [4])
Es wäre auch möglich, ϕ(n) zu berechnen, ohne n zu faktorisieren. Aus ϕ(n) und e kann ebenfalls e berech-
net werden. Da n zusammengesetzt ist, gibt es jedoch keine einfache Möglichkeit, ϕ(n) zu berechnen, ohne
n zu faktorisieren.
Ein anderer Weg wäre, d zu erraten. Da es jedoch sehr viele mögliche d gibt ist dieses Verfahren äußerst
ineffizient.
5.2. Sicherheitsprobleme
Es könnte sein, dass ein Benutzer durch Unterschreiben eine verschlüsselte Nachricht entschlüsselt. Dazu
müsste er jedoch zufällig den selben privaten Schlüssel haben, wie derjenige, der die Nachricht verschlüs-
∗
selt hat, oder einen Schlüssel, für den gilt M = Cd mod n∗ . Dies ist sehr unwahrscheinlich, jedoch nicht
ausgeschlossen.
Ein weiteres Problem, das bei der Implementation auftritt, ist, dass die meisten Algorithmen zur Bestim-
mung von Primzahlen probabilistisch arbeiten. Wenn für p oder q eine zusammengesetzte Zahl verwendet
wird, wird die Ver- bzw. Entschlüsselung wahrscheinlich nicht korrekt funktionieren.
6. Implementation
Dieser Abschnitt stellt einige Algorithmen, die zur Implementation verwendet werden können, vor. Den
Quelltext von lauffähigen Programmen mit den hier vorgestellten Algorithmen finden Sie im Anhang.
5
6.1 Schlüsselgenerierung 6 IMPLEMENTATION
6.1. Schlüsselgenerierung
Der öffentliche und der private Schlüssel können folgendermaßen generiert werden:
1. Da n das Produkt zweier Primzahlen p und q ist, muss ein Weg gefunden werden, sehr große zufällige
Primzahlen zu finden. Dabei sollten p und q ähnlich groß und halb so groß wie die vorgesehene
Größe von n sein. Dazu gibt es verschiedene Möglichkeiten. Eine ist, so lange Zufallszahlen in der
gewünschten Größe generieren, bis eine Primzahl dabei ist. Dabei werden die Zahlen in der Regel aus
Geschwindigkeitsgründen mit probabilistischen Methoden überprüft, was zu Fehlern führen kann.
Eine Alternative, die jedoch sehr viel Speicher benötigen würde, wäre, aus einer Liste mit Primzahlen
zufällig eine auszuwählen.
2. Für d eignet sich z. B. jede Primzahl, die größer als p und q ist.
3. Um e aus d und ϕ(n) zu berechnen kann man den erweiterten Euklidischen Algorithmus verwenden
[1, 5]. Dieser berechnet zusätzlich zum ggT die Koeffizienten u und v der Gleichung
ggT(a, b) = u · a + v · b; u, v ∈ Z.
ggT(ϕ(n), e) = u · ϕ(n) + v · e = 1
6
6.2 Berechnung von M e mod n 6 IMPLEMENTATION
Zur Berechnung von M e mod n bzw. Cd mod n gibt es viele Möglichkeiten. Die am wenigsten optimale
wäre, die Standard-Funktionen der Programmiersprache, also z. B. in C pow(M, e) % n. Hier würden
die einzelnen Rechenschritte nacheinander durchgeführt, was dazu führt, dass das Zwischenergebnis von
M e , das extrem groß ist, zwischengespeichert würde.
Wenn man die zu lösende Gleichung folgendermaßen umformt
kann man erkennen, dass sie auch rekursiv gelöst werden kann [6]. Dies lässt sich leicht mit Hilfe einer
Schleife implementieren:
int C = 1, i;
In [1] wird die Potenzierung durch wiederholte Quadrierung und Multiplikation vorgeschlagen. Diese Methode funk-
tioniert folgendermaßen:
1. ek ek−1 . . . e1 e0 sei die binäre Repräsentation von e
2. Initialisierung: C = 1
3. Wiederhole die folgenden Schritte für i = k, k − 1, . . . , 0
a) C = C2 mod n
b) Wenn ei = 1, dann C = (C · M) mod n
4. Jetzt ist C = M e mod n
In C sieht das z. B. folgendermaßen aus:
int C = 1;
while(e != 0)
{
C = (C * C) % n;
if(e & 1)
{
C = (C * M) % n;
}
e = e >> 1;
}
Es gibt natürlich noch viele andere und vor allem auch effizientere Algorithmen für diese Problem. Eine Auswahl
finden Sie z. B. in [7].
7
A BEISPIELPROGRAMME
A. Beispielprogramme
A.1. inversmod.c
#include <stdio.h>
#include <stdlib.h>
int g, u, v;
printf("%i\n", v);
return 0;
}
A.2. encrypt1.c
#include <stdio.h>
#include <stdlib.h>
return 0;
}
8
A.3 encrypt2.c A BEISPIELPROGRAMME
return C;
}
A.3. encrypt2.c
#include <stdio.h>
#include <stdlib.h>
return 0;
}
while(e != 0)
{
C = (C * C) % n;
if(e & 1)
{
C = (C * M) % n;
}
e = e >> 1;
}
return C;
}
9
B. Literatur
[1] Rivest, R. L., Shamir, A. und Adleman, L. A Method for Obtaining Digital Signatures and Public-Key Cryptosys-
tems. 1978
[2] Diffie, W. und Hellman, P. New Directions in Cryptography. 1976
[3] Wikipedia. Satz von Euler. http://de.wikipedia.org/wiki/Satz_von_Euler
[4] Patzelt, D. Vortrag zum Thema RSA-Verschlüsselung. http://www.inf.hs-zigr.de/˜wagenkn/TI/Komplexitaet/Refe-
rate/RSA/
[5] Erweiterter Euklidischer Algorithmus. http://www.iti.fh-flensburg.de/lang/algorithmen/code/krypto/euklid.htm
[6] Werner, B. RSA-Verschlüsselung und weitere Anwendungen elementarer Zahlentheorie auf die Kalenderrechnung.
2003
[7] Knuth, D. E. The Art of Computer Programming, Vol. 2: Seminumerical Algorithms. Addison-Wesley, 1969
10