Die Mathematik von RSA

Transcription

Die Mathematik von RSA
Die Mathematik von
RSA
Eine Arbeit von
Yimin Ge
(yimin.ge@chello.at)
August 2005
Inhaltsverzeichnis
0 Vorwort
2
1 Prinzip der Einwegverschlüsselung
3
2 Zahlentheoretische Grundlagen
2.1 Teilbarkeit und Primzahlen . . . . . . . . . . . . . . .
2.2 Größter gemeinsamer Teiler und Euklidsches Verfahren
2.3 Kongruenzen und Restklassen . . . . . . . . . . . . . .
2.4 Multiplikative Inverse . . . . . . . . . . . . . . . . . . .
2.5 Der Schlüssel zum Erfolg: Satz von Fermat . . . . . . .
3 Ver- und Entschlüsselungsalgorithmus von
3.1 Das Verfahren . . . . . . . . . . . . . . . .
3.2 Beweis des Verfahrens . . . . . . . . . . .
3.3 Implementierungstechnische Tipps . . . . .
3.4 Die Sicherheit von RSA . . . . . . . . . . .
Literatur
RSA
. . . .
. . . .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
6
9
12
13
.
.
.
.
15
15
16
18
19
20
0
Vorwort
Da der Mathematikunterricht an Österreichischen Schulen im internationalen Vergleich sowohl qualitativ als auch quantitativ praktisch nicht vorhanden ist und aufgrund diverser
Stundenkürzungsreformen noch weiter komprimiert wird, nimmt in Österreich vor allem bei
jungen Menschen der Trend zu, den Sinn dieser Wissenschaft generell in Frage zu stellen.
Die Idee zu dieser Arbeit kam mir, als ich entsetzt feststellte, wie stark die Zweifel an dem
Sinn der Mathematik selbst in meiner eigenen Schulklasse waren. Als Teilnehmer der Österreichischen und Internationalen Mathematikolympiade war ich zutiefst schockiert darüber,
mit welcher Verachtung meine Klassenkollegen über solch eine schöne und vor allem essentielle Wissenschaft sprachen.
Mir lag der Wunsch nahe, diesem Trend entgegenzuwirken und nachdem einige mündliche
Überzeugungsversuche nichts halfen, kam mir die Idee es mit einer schriftlichen Arbeit zu
versuchen. Ich besuche eine Schule mit Schwerpunkt auf EDV, der Gedanke lag daher nahe,
die Mathematik in dieser Arbeit mit einem wichtigen Thema der Informatik zu verbinden.
So kam ich zu RSA, einem weit verbreiteten Verschlüsselungsverfahren, welches von den drei
Mathematikern Ronald Rivest, Adi Shamir und Leonard Adleman entwickelt wurde, einem
Verfahren, das die gesamte Kryptologie revolutionierte.
RSA ist ein Verfahren, von dem die meisten Informatiker bereits etwas gehört haben, welches viele Informatiker bereits programmiert haben, von denen allerdings nur die Wenigsten
wirklich wissen, welche mathematischen Kentnisse und Gesetze dahinterstecken.
Diese Arbeit richtet sich an alle, die RSA nicht nur kennen, können oder programmieren,
sondern verstehen und begreifen wollen. Es wird kein tieferes mathematisches Wissen vorausgesetzt, sämtliche für das Verständnis von RSA benötigten zahlentheoretische Kenntnisse,
welchen ich den Großteil dieser Arbeit widme, werden von Grund auf vermittelt. Dabei lege
ich besonders viel Wert darauf, mathematische Sätze nicht nur zu erklären, sondern auch zu
beweisen, damit der Leser möglichst wenig als gegeben hinnehmen muss.
Diese Arbeit beschäftigt sich ausschließlich mit der mathematischen Seite von RSA. Bei
näherem Interesse zu den geschichtlichen und wirtschaftlichen Auswirkungen von RSA oder
zu Vergleichen mit anderen Verschlüsselungsverfahren sei an dieser Stelle auf zusätzliche,
zahlreich vorhandene Literatur verwiesen.
Zuletzt möchte ich noch das dringende Appell aussprechen, den anfangs beschriebenen
Trend auf keinen Fall fortzusetzen, sondern die Mutter der Wissenschaften, welche die Grundbausteine für die meisten anderen Wissenschaften liefert, auch als solche zu würdigen.
Wien, August 2005
Yimin Ge
2
1
Prinzip der Einwegverschlüsselung
Bei herkömmlichen symmetrischen Verschlüsselungsverfahren (also jene, bei denen der Schlüssel
zum Verschlüsseln auch gleichzeitig der Schlüssel zum Entschlüsseln ist, oder der eine Schlüssel
leicht aus dem anderen berechnet werden kann) war es lange Zeit ein Problem, Schlüssel bzw.
Codebücher sicher zum Kommunikationspartner zu transportieren. Der Schlüsseltransport
war dabei nicht nur der kostenaufwendigste Teil der Kommunikation, sondern auch gleichzeitig die größte logistische Schwachstelle.
Bis in die 1970er Jahre hielt man dieses Problem prinzipiell nicht für lösbar, bis
Whitfield Diffie und Martin Hellmann eine Theorie ohne wirkliche Lösungsansätze zur sogenannten Public-Key-Kryptographie veröffentlicht hatten.
Die grundlegende Idee eines solchen Verschlüsselungsverfahrens besteht darin, dass die
Schlüssel zum Ver- und Entschlüsseln verschieden und ohne Zusatzinformation praktisch
nicht ineinander umrechenbar sind. Dabei ist allerdings zu beachten, dass beide Schlüssel
auch die jeweils andere Funktion ausüben können (man kann also mit irgendeinem der
beiden Schlüssel eine Nachricht verschlüsseln, die dann mit dem jeweils anderen Schlüssel
entschlüsselbar ist). Jener Schlüssel, der zum Verschlüsseln verwendet wird, wird als “Public
Key“ (=öffentlicher Schlüssel) bezeichnet und jener zum Entschlüsseln als “Private Key“
(=privater/geheimer Schlüssel).
Die Verschlüsselung ist mathematisch gesehen eine injektive Einwegfunktion mit Falltür
f , wobei es ein effizientes Verfahren zur Bestimmung von y = f (x) gibt, bei dem nur der
Public Key gebraucht wird, aber dessen Umkehrung, also die Berechnung von x = f −1 (y)
ohne Zusatzinformation, also dem Private Key, praktisch nicht möglich ist. Es ist also nicht
möglich, aus dem Verfahren für f das Verfahren für f −1 herzuleiten. Dieses Prinzip kann
man etwa mit folgender Alltagssituation vergleichen: Ein vorhandenes Schloss kann jeder
schließen, jedoch kann es nur mit dem richtigen Schlüssel wieder geöffnet werden. Das Schloss
entspräche hier dabei dem Public Key und der Schlüssel dem Private Key.
In der Praxis wird dann der Public Key (meistens in einer Datenbank) veröffentlicht, sodass jeder eine Botschaft verschlüsseln kann, die allerdings nur vom rechtmäßigen Empfänger,
der den Private Key besitzt, entschlüsselt und gelesen werden kann. Da aber, wie oben beschrieben, der Private Key auch zum Verschlüsseln einer Nachricht dienen kann, dessen
Entschlüsselung nur mit dem dazugehörigen Public Key möglich ist, kann auf diese Weise eine sogenannte Digitale Signatur geschaffen werden. Diese Unterschrift wird dabei mit
dem privaten Schlüssel verschlüsselt und kann von jedem mit dem öffentlichen Schlüssel entschlüsselt und gelesen werden. Da aber nur der rechtmäßige Empfänger den Private Key
besitzt, kann auf diese Weise dessen Identität verifiziert werden.
3
2
Zahlentheoretische Grundlagen
Ich möchte zuerst, wie bereits angedeutet, wichtige zahlentheoretische Grundlagen vermitteln, die für das Verständnis von RSA essentiell sind.
Anmerkung
Ich werde desöfteren mit Nummern auf einzelne Sätze referenzieren. Es
wäre daher empfehlenswert, die wichtigsten Sätze auf einem separaten
Zettel zu notieren.
2.1
Teilbarkeit und Primzahlen
Definition der Teilbarkeit
Es seien a und b ganze Zahlen. Die Zahl a teilt b genau dann, wenn es eine ganze Zahl k
gibt, sodass gilt:
b=k·a
Man schreibt a | b und sagt auch: a ist ein Teiler von b.
Es gelten folgende Sätze zur Teilbarkeit:
Satz 2.1
Sind a, b und c ganze Zahlen, so gilt:
1. a | 0
2. a | b ⇐⇒ a · c | b · c mit c 6= 0
3. aus a | b und a | c ⇒ a | (b ± c)
4. aus (a · b) | c ⇒ a | c und b | c
5. aus a | b ⇒ a | cb
6. aus a | (b ± c) und a | b ⇒ a | c
7. Aus a | b und b 6= 0 ⇒ |a| ≤ |b| (Mit |x| ist der Absolutbetrag einer reellen Zahl x
gemeint, also x ohne Vorzeichen, z.B. | − 3| = 3, | − 1| = 1, |4| = 4)
Beweis:
1. 0 = a · 0 ⇒ a | 0, da 0 ∈ Z
2. a | b ⇐⇒ b = a · k ⇐⇒ b · c = a · c · k
3. b = ak1 , c = ak2 ⇒ (b ± c) = (ak1 ± ak2 ) = a(k1 ± k2 )
4. c = abk = a(bk) = b(ak)
5. b = ak ⇒ bc = a(ck)
4
6. (b ± c) = ak, b = ak1 ⇒ ak = ak1 ± c ⇒ c = a(k ± k1 )
7. aus ak = b ⇒ |a| · |k| = |b|, aus b 6= 0 ⇒ k 6= 0, somit gilt |k| ≥ 1 ⇒ |a| ≤ |b|
Definition einer Primzahl
Eine positive ganze Zahl p ist genau dann eine “Primzahl“, wenn p genau zwei positive Teiler
hat, nämlich 1 und p.
Die kleinste Primzahl wird als 2 definiert.
5
2.2
Größter gemeinsamer Teiler und Euklidsches Verfahren
Definition eines gemeinsamen Teilers zweier Zahlen
Sind a, b und t ganze Zahlen, so ist t genau dann ein “gemeinsamer Teiler“ von a und b,
wenn gilt:
t | a und t | b.
Aus Satz 2.1.7 (a | b und b 6= 0 ⇒ |a| ≤ |b|) folgt aber, dass jede ganze Zahl (6= 0)
nur endlich viele Teiler hat, da es zu jeder ganzen Zahl b nur endlich viele ganze Zahlen a
gibt mit |a| ≤ |b| (nämlich 0; ±1; ±2; ...; ±b). Da jede Zahl nur endlich viele Teiler hat, gibt
es logischerweise auch nur endlich viele gemeinsame Teiler zweier Zahlen und daher gibt es
auch einen größten gemeinsamen Teiler zweier Zahlen.
Definition des größten gemeinsamen Teilers zweier Zahlen
Die größte Zahl, die gemeinsamer Teiler von a und b ist, nennt man den
“größten gemeinsamen Teiler“ von a und b und schreibt dafür ggT (a, b).
Da 1 aber jede Zahl teilt, ist somit 1 ein gemeinsamer Teiler von a und b.
Es gilt daher: ggT (a, b) ≥ 1.
Anmerkung: Ist der ggT (a, b) = 1, so sagt man auch: a und b sind “teilerfremd“ oder
“relativ prim“.
Es gibt zum Glück ein einfaches Verfahren zur Bestimmung des ggT zweier ganzer Zahlen,
das sogenannte “Euklidsche Verfahren“. Dieser ist nicht zuletzt auch wegen seiner einfachen
Implementierbarkeit (siehe unten) besonders in der Informatik sehr beliebt. Grundsatz für
dieses Verfahren liefert uns folgende Gleichung:
Satz 2.2.1
ggT (a, b) = ggT (b, a − kb) mit k ∈ Z
(“Man kann die eine Zahl von der anderen beliebig oft abziehen.“)
Beweis: Es sei t1 = ggT (a, b) und t2 = ggT (b, a − kb). Wir wollen nun zeigen, dass t1 = t2 .
Aus t1 | b folgt nach Satz 2.1.5 t1 | kb und analog dazu aus t2 | b ⇒ t2 | kb.
Aus t1 | a und t1 | kb folgt nach Satz 2.1.3 t1 | (a − kb).
⇒ t1 ist gemeinsamer Teiler von b und (a − kb)
⇒ t1 ≤ t2
(∗)
(Begründung: t1 ist gemeinsamer Teiler von b und (a − kb), kann aber nicht größer als der
größte gemeinsame Teiler sein)
Aus t2 | kb und t2 | (a − kb) folgt nach Satz 2.1.6 t2 | a
⇒ t2 ist gemeinsamer Teiler von a und b.
⇒ t2 ≤ t1
(∗∗)
(gleiche Begründung wie bei (∗)).
Aus (∗) und (∗∗) folgt aber ⇒ t1 = t2
q.e.d.1
1
q.e.d. ist die Abkürzung für “quod erat demonstrandum“, was auf Deutsch soviel wie “was zu zeigen
war“ heißt. Dies ist ein Kürzel, welches in der Mathematik üblicherweise unter einen erfolgreich geführten
Beweis geschrieben wird.
6
Mit Hilfe dieser Gleichung bekommt man ein einfaches Verfahren zur Bestimmung des
ggT , indem (falls die kleinere Zahl die Größere nicht teilt, da der ggT sonst, 0 natürlich
ausgenommen, die kleinere Zahl wäre) man b von a sooft abzieht, bis das neue a kleiner ist
als b, prüft, ob das neue a b teilt und falls nicht, diesen Vorgang solange wiederholt (a und
b vorher vertauschen), bis dies der Fall ist.
In der Programmiersprache C würde dieser Algorithmus so aussehen:
int ggT(int a, int b)
{
int h;
if (a < 0) a=-a;
if (b < 0) b=-b;
while (a % b != 0)
{
while (a > b) a-=b;
h = a;
a = b;
b = h;
}
return b;
}
oder kürzer:
int ggT(int a, int b)
{
return (a % b == 0) ? (b < 0) ? -b : b : ggT(b, a % b);
}
7
Mit Hilfe des Euklidschen Verfahrens kann man allerdings weit mehr, als den ggT bloß
zu berechnen. Den wahren Wert dieses Verfahrens bringt uns folgende Überlegung:
Es seien a und b (nichtnegative) ganze Zahlen mit a ≥ b. Es gilt:
I) a = 1 · a + 0 · b
II) b = 0 · a + 1 · b
Nun multiplizieren wir die zweite Gleichung mit −k1 und addieren beide Gleichungen.
Wir erhalten
III)s1 = a − k1 · b = 1 · a + (−k1 ) · b
Es sei nun k1 so gewählt, dass s1 ≤ b (wir haben b so oft von a abgezogen).
Nun führen wir den gleichen Schritt nochmals durch, allerdings mit den Gleichungen
II) und III). Wir erhalten dann
IV )s2 = b − k2 · s1 = (−k2 ) · a + (k1 k2 + 1) · b
Diesen Schritt führen wir nun solange durch, bis links (also bei sn ) der ggT steht,
welcher nach dem Euklidschen Verfahren irgendwann erreicht werden muss. Rechts
bleibt allerdings immer eine Summe ganzzahliger Vielfachen von a und b.
Wir kommen daher zu folgendem Schluss:
Satz 2.2.2
Zu jedem Paar ganzer Zahlen (a, b) gibt es ganze Zahlen x und y, sodass gilt:
ggT (a, b) = x · a + y · b
Das Verfahren zur Bestimmung dieser Zahlen x und y wird auch als das
“Erweiterte Euklidsche Verfahren“ bezeichnet.
Ich werde in einem späteren Kapitel noch auf diesen Satz zurückkommen, bei dem sich
dieser noch als äußerst hilfreich erweisen wird. Er soll noch an einem Beispiel verdeutlicht
werden:
Beispiel: Für a = 2100 und b = 2005 seien die ganzen Zahlen x und y gesucht, sodass
ggT (2100, 2005) = x · 2100 + y · 2005
I)
2100 = 1 · 2100 + 0 · 2005
II)
2005 = 0 · 2100 + 1 · 2005
| · (−1)
I + (−1) · II = III)
95 = 1 · 2100 + (−1) · 2005
| · (−21)
II + (−21) · III = IV )
10 = (−21) · 2100 + 22 · 2005
| · (−9)
III + (−9) · IV = V )
5 = 190 · 2100 + (−199) · 2005
Da 5 | 10 ist 5 = ggT (2100, 2005). Wir erhalten daher:
x = 190
y = −199
8
2.3
Kongruenzen und Restklassen
Definition der Restklassen modulo m
Sei m eine positive ganze Zahl. Die Mengen
[ 0 ]m , [ 1 ]m , ... , [m − 1]m
seien folgendermaßen definiert:
[ 0 ]m = {x | x = k · m + 0, ∀k ∈ Z}
[ 1 ]m = {x | x = k · m + 1, ∀k ∈ Z}
...
[m − 1]m = {x | x = k · m + (m − 1), ∀k ∈ Z}
oder allgemein:
[ i ]m = {x | x = k · m + i, ∀k ∈ Z} für i = 0, 1, ..., m − 1
Diese Mengen werden auch als die sogenannten “Restklassen modulo m“ bezeichnet (m ist
der sogenannte “Modul“).
Beispiel für m = 5:
[
[
[
[
[
0
1
2
3
4
]5
]5
]5
]5
]5
= {..., −15, −10, −5, 0, 5, 10, 15, ...}
= {..., −14, −9, −4, 1, 6, 11, 16, ...}
= {..., −13, −8, −3, 2, 7, 12, 17, ...}
= {..., −12, −7, −2, 3, 8, 13, 18, ...}
= {..., −11, −6, −1, 4, 9, 14, 19, ...}
Wir halten folgende Tatsachen fest:
• Ist a ∈ [ i ]m mit a ∈ Z und m ∈ Z+ und i = 0, 1, ..., m − 1, so ist i der Divisionsrest,
den a bei der (ganzzahligen) Division durch m lässt.
Diese Tatsache ist eigentlich nahezu trivial, wenn man sich die Definition der Restklassen genauer ansieht:
k · m ist durch m teilbar, lässt also Divisionsrest 0.
k · m + i muss daher Rest i lassen, da 0 ≤ i ≤ m − 1.
• Da aber jede ganze Zahl genau einen der Reste 0, 1, ..., m − 1 bei der ganzzahligen
Division durch m lässt, folgern wir daraus, dass die Vereinigung aller Restklassen
modulo m die Menge aller ganzen Zahlen Z ergibt.
• Man darf zu einer beliebigen ganzen Zahl a den Modul m beliebig oft addieren bzw.
von a subtrahieren, ohne die Restklasse modulo m zu verlassen (so haben wir die
Restklassen ja eigentlich definiert).
9
Definition von Kongruenz
Seien a, b ganze Zahlen und m eine positive ganze Zahl. Man sagt a und b sind zueinander
“kongruent modulo m“, genau dann, wenn a und b in derselben Restklasse modulo m sind.
Man schreibt:
a ≡ b mod m
(häufig auch a ≡ b (m) oder a ≡ b (mod m)).
Hinweis:
Häufig findet man auch folgende Definition von Kongruenz:
a und b sind genau dann kongruent modulo m, wenn m | (a − b).
Die Äquivalenz dieser Definitionen kann sehr schnell gezeigt werden (Bei Äquivalenz müssen
wir den Schluss in beide Richtungen zeigen):
a ≡ b mod m ⇐⇒ a = km + i und b = lm + i ⇒ a − b = km − lm = m(k − l) ⇒ m | (a − b)
m | (a−b) ⇐⇒ a−b = mk. Sei nun a = ml+i ⇒ a−b = ml+i−b = mk ⇐⇒ b = m(l−k)+i
Es gelten folgende Rechenregeln für Kongruenzen:
Satz 2.3
1. aus a ≡ b mod m und c ≡ d mod m
⇒ a + c ≡ b + d mod m sowie a − c ≡ b − d mod m
2. aus a ≡ b mod m und c ≡ d mod m ⇒ a · c ≡ b · d mod m
3. aus k · a ≡ k · b mod m und ggT (k, m) = 1 ⇒ a ≡ b mod m
4. aus a ≡ b mod m und a ≡ b mod n und ggT (m, n) = 1 ⇒ a ≡ b mod mn
5. aus a ≡ b mod m ⇒ ak ≡ bk mod m mit k ∈ N
Beweis:
1. a ≡ b mod m ⇐⇒ m | (a − b)
c ≡ d mod m ⇐⇒ m | (c − d)
Aus Satz 2.1.3 folgt m | [(a − b) ± (c − d)] ⇐⇒ m | [(a ± c) − (b ± d)]
2. Nach Satz 2.1.5 folgt aus m | (a − b) und m | (c − d), dass
m | c · (a − b) und m | b · (c − d)
Nach Satz 2.1.3 folgt nun
m | [c · (a − b) + b · (c − d)] also m | (ac − bc + bc − bd) also m | (ac − bd)
3. Nach Satz 2.2.2 gibt es ganze Zahlen x und y, sodass
ggT (k, m) = 1 = xk + ym ⇒ (a − b) = (a − b)xk + (a − b)ym
Da aber m | k(a − b) ⇐⇒ k(a − b) = lm
⇒ (a − b) = k(a − b)x + (a − b)ym = lmx + (a − b)ym = m(lx + (a − b)y)
10
4. Nach Satz 2.2.2 gibt es ganze Zahlen x und y, sodass
ggT (m, n) = 1 = xm + yn ⇒ (a − b) = (a − b)xm + (a − b)yn
Da m | (a − b) ⇐⇒ (a − b) = km und n | (a − b) ⇐⇒ (a − b) = ln
⇒ (a − b) = (a − b)xm + (a − b)yn = lnmx + kmyn = mn(lx + ky)
5. Aus a ≡ b mod m folgt nach Satz 2.3.2
a · a ≡ b · b mod m sowie
a · a · a ≡ b · b · b mod m
...
· ... · }b mod m
a
· ... · a} ≡ b| · b {z
| · a {z
n
n
Für k = 0 erhalten wir 1 ≡ 1 mod m was selbstverständlich richtig ist.
11
2.4
Multiplikative Inverse
Wir rufen uns nochmals Satz 2.2.2 in Erinnerung:
Sind a und b ganze Zahlen, so gibt es ganze Zahlen x und y, sodass
ggT (a, b) = xa + yb
Es sei nun m eine positive ganze Zahl und a eine zu m teilerfremde ganze Zahl. Nach
Satz 2.2.2 gibt es nun ganze Zahlen x und y, sodass
1 = xa + ym
Betrachten wir nun diese Gleichung modulo m. Da man beliebige ganze Vielfache von m
abziehen kann, ohne die Restklasse zu verlassen, gilt:
1 = xa + ym ≡ xa
mod m
Es gilt also
x·a≡1
mod m
Es sei nun x ∈ [ i ]m (x muss logischerweise in irgendeiner Restklasse modulo m sein).
Es gilt x ≡ i mod m
Nach Satz 2.3.2 gilt daher
x · a ≡ i · a mod m
und daher
i·a≡1
mod m
Wir kommen daher zu folgendem Schluss:
Satz 2.4.1
Ist m eine positive ganze Zahl und a eine zu m teilerfremde ganze Zahl, so gibt es eine ganze
Zahl i mit 0 ≤ i ≤ m − 1, sodass
i·a≡1
mod m
i wird auch als die sogenannte “Multiplikative Inverse zu a modulo m“ (oft auch mit a−1 )
bezeichnet. Sie kann leicht mit dem Erweiterten Euklidschen Verfahren berechnet werden
(Siehe Kapitel 2.2).
Man kann sogar (recht kurz) zeigen, dass es nur eine Zahl i mit 0 ≤ i ≤ m − 1 gibt,
sodass ia ≡ 1 mod m
Beweis: Seien 0 ≤ i, j ≤ m − 1 ganze Zahlen, sodass ia ≡ ja mod m. Da ggT (a, m) = 1
folgt nach Satz 2.3.3 i ≡ j mod m und da 0 ≤ i, j ≤ m − 1 ⇒ i = j.
12
2.5
Der Schlüssel zum Erfolg: Satz von Fermat
Der Satz von Pierre de Fermat lautet wie folgt:
Satz 2.5.1
Ist p eine Primzahl und a eine ganze Zahl mit p - a, so gilt:
ap−1 ≡ 1
mod p
Beweis:
Es seien die Zahlen x1 , x2 , ..., xp−1 wie folgt definiert:
x1 = 1 · a
x2 = 2 · a
...
xp−1 = (p − 1) · a
Es gilt nun: je zwei xr und xs mit 1 ≤ r, s ≤ p − 1 und r 6= s sind nicht kongruent
modulo p.
Beweis durch Widerspruch:
Annahme:
xr ≡ xs mod p
also:
r·a≡s·a
mod p
Da a kein Vielfaches von p und somit zu p teilerfremd ist (p ist Primzahl) folgt
nach Satz 2.3.3
r ≡ s mod p
was allerdings ein Widerspruch zu r 6= s ist, da 1 ≤ r, s ≤ p − 1
Da nun alle xi paarweise inkongruent sind und mit Sicherheit keine der Zahlen
x1 , ..., xp−1 durch p teilbar ist, müssen unter den p − 1 Zahlen x1 , ..., xp−1 alle Restklassen von [ 1 ]p bis [p − 1]p vorkommen (wenn auch wahrscheinlich in einer anderen
Reihenfolge)
Nach Satz 2.3.2 folgt aber nun:
x1 · x2 · ... · xp−1 ≡ 1 · 2 · ... · (p − 1) mod p
also 1a · 2a · ... · (p − 1)a ≡ 1 · 2 · ... · (p − 1) mod p
also ap−1 · 1 · 2 · ... · (p − 1) ≡ 1 · 2 · ... · (p − 1) mod p
Da aber die Faktoren 1, 2, ..., p−1 alle nicht durch p teilbar und somit zu p teilerfremd
sind, folgt nach Satz 2.3.3
ap−1 ≡ 1 mod p
q.e.d.
13
Wir wissen jetzt also, dass für jede Primzahl p und jede ganze Zahl a mit p - a gilt:
ap−1 ≡ 1
mod p
Nach Satz 2.3.5 gilt nun
(ap−1 )k ≡ 1k
f ür k ∈ Z
mod p
Da (ap−1 )k = a(p−1)·k und 1k = 1
⇒ a(p−1)·k ≡ 1
mod p
Es seien nun p und q zwei (verschiedene) Primzahlen und a eine ganze Zahl mit p - a und
q - a.
Nach obiger Feststellung gilt nun (wenn man q − 1 für k einsetzt)
a(p−1)(q−1) ≡ 1
mod p
Da aber auch a(p−1)(q−1) ≡ 1 mod q gilt, folgt nach Satz 2.3.4
Satz 2.5.2
a(p−1)(q−1) ≡ 1
mod p · q
für p, q Primzahlen und a ∈ Z mit p - a und q - a.
Anmerkung
Der Satz von Fermat lässt sich noch folgendermaßen verallgemeinern
(Satz von Euler-Fermat):
Ist m eine positive ganze Zahl und a eine zu m teilerfremde ganze Zahl,
so gilt:
aϕ(m) ≡ 1 mod m
wobei ϕ(m) die sogenannte “Eulersche ϕ-Funktion“ ist, welche die
Anzahl der ganzen Zahlen x mit 1 ≤ x ≤ m − 1 liefert, die zu m
teilerfremd sind.
Sowohl Satz 2.5.1 als auch Satz 2.5.2 sind Spezialfälle dieses Satzes.
Der Satz von Euler-Fermat lässt sich im Grunde genommen genauso beweisen, wie der Satz von Fermat.
14
3
Ver- und Entschlüsselungsalgorithmus von RSA
Bevor es nun endgültig zum RSA-Verfahren geht, müssen wir noch folgende Operation definieren:
Definition des mod-Operators
Für eine positive ganze Zahl m und eine ganze Zahl a sei
a
mod m
jene Zahl i mit 0 ≤ i ≤ m − 1, sodass a ≡ i mod m gilt
(bzw, was gleichbedeutend ist: a ∈ [ i ]m ).
Anmerkung: In vielen Programmiersprachen ist dieser mod-Operator auch als der
% -Operator bekannt.
3.1
Das Verfahren
Es seien p, q zwei verschiedene Primzahlen und n := p · q deren Produkt.
e sei eine ganze Zahl (> 1), die zu (p − 1)(q − 1) teilerfremd ist.
Da e und (p − 1)(q − 1) teilerfremd sind, gibt es laut Satz 2.4.1 eine multiplikative Inverse
zu e modulo (p − 1)(q − 1). Sei d := e−1 diese Zahl.
Es gilt nun:
e · d ≡ 1 mod (p − 1)(q − 1)
Es sei nun M die zu verschlüsselnde Nachricht, wobei folgende Bedingung für M gelten muss:
M ist eine ganze Zahl mit 0 ≤ M ≤ n − 1
C sei die verschlüsselte Nachricht.
Das Verfahren lautet nun wie folgt:
Das RSA-Verfahren
Verschlüsseln
C = M e mod n
Entschlüsseln
M = C d mod n
e und n sind daher logischerweise der Public Key und d der Private Key.
15
3.2
Beweis des Verfahrens
Wir wollen nun zeigen, dass (C d mod n) wieder die ursprüngliche Nachricht M ergibt.
Sowohl M als auch C sind ganze Zahlen mit 0 ≤ M, C ≤ n − 1.
Es genügt daher zu zeigen, dass
Cd ≡ M
mod n
Wir wissen aber, dass C ≡ M e mod n. Daher ist C d ≡ M mod n äquivalent zu
(M e )d = M e·d ≡ M
mod n
Um diese Gültigkeit zu beweisen unterscheiden wir folgende 2 Fälle:
Fall 1: ggT (M, n) = 1
Wir wissen, dass e · d ≡ 1 mod (p − 1)(q − 1). Dies ist natürlich wegen unserer Definition
der Kongruenz gleichbedeutend mit e · d = k · (p − 1) · (q − 1) + 1. Einsetzen in unsere zu
zeigende Kongruenzgleichung ergibt:
M k·(p−1)·(q−1)+1 ≡ M
mod n
Es gilt aber:
M k·(p−1)·(q−1)+1 = M k·(p−1)·(q−1) · M
= (M (p−1)(q−1) )k · M
Wegen Satz 2.5.2 wissen wir, dass
M (p−1)(q−1) ≡ 1
mod pq = n
Es gilt daher:
(M (p−1)(q−1) )k · M ≡ 1k · M
≡ M mod n
womit unsere Aussage für Fall 1 bewiesen wäre.
16
Den Schwierigen Fall, der auf die meisten M zutrifft, ist damit bewiesen.
Es bleiben daher die Spezialfälle zu zeigen, in denen M durch mindestens einen der Primzahlen p, q teilbar ist.
Unser zweiter Fall lautet daher logischerweise:
Fall 2: ggT (M, n) 6= 1
Wir unterschieden an dieser Stelle wieder 2 Unterfälle. Im ersten nehmen wir an, dass M
durch beide der Zahlen p, q teilbar ist (also n | M gilt) und im zweiten Fall nehmen wir an,
dass M nur durch einen dieser Zahlen teilbar ist.
Fall 2.a: n | M
Da wir aber von Anfang an vorausgesetzt haben, dass 0 ≤ M ≤ n − 1 gilt, folgt daher
nach Satz 2.1.7
⇒M =0
(sonst müsste M ja (betragsmäßig) ≥ n sein) Damit ist die Aussage aber
trivial, da somit
C ≡ 0e ≡ 0 mod n
und daher C d ≡ 0d ≡ 0 ≡ M mod n gilt.
Dieser Fall ist somit erledigt. Es bleibt daher folgender Fall:
Fall 2.b: p | M und q - M (Der Fall p - M und q | M ist analog)
Aus q - M folgt M q−1 ≡ 1 mod q (Satz 2.5.1)
Nach Satz 2.3.5 folgt daraus
M k(p−1)(q−1) ≡ 1 mod q
Nach Satz 2.3.2 können wir diese Kongruenzgleichung mit M multiplizieren.
⇒ M k(p−1)(q−1) · M
M k(p−1)(q−1)+1
≡ M
⇐⇒
≡ M
mod q
mod q
Da aber M ≡ 0 mod p, gilt aber auch
M k(p−1)(q−1)+1 ≡ M
mod p
und da p und q verschiedene Primzahlen sind, folgt nach Satz 2.3.4
⇒ M k(p−1)(q−1)+1 ≡ M
mod pq = n
womit unsere Behauptung auch für den letzten Fall bewiesen ist.
⇒ q.e.d.
17
3.3
Implementierungstechnische Tipps
Nachfolgendes dürfte besonders für Informatiker interessant sein, welche die Programmierung
von RSA beabsichtigen.
Da sowohl d als auch e in realistischen RSA-Systemen mehrere 100 Dezimalstellen haben
können, dauert es sehr lange, M so oft mit sich selbst zu multiplizieren (lineare Ordnung).
Es ist allerdings auch fast unmöglich, diese Zahl effizient genau auszurechnen.
Es ist daher essentiell, dass nach jeder einzelnen Multiplikation ein mod n des neuen
Produkts folgt.
Ein effizienterer Algorithmus dieses “Modulo-Potenzierens“ wird erreicht, indem der Exponent in eine Summe von Zweierpotenzen (=Binärdarstellung) aufgeteilt wird. Auf diese
Weise wird das Gesamtprodukt in Teilprodukte mit Zweierpotenzen im Exponenten aufgespalten, welche nachher wieder miteinander multipliziert werden. Um auf die nächsthöhere
Zweierpotenz zu kommen muss selbstverständlich nur quadriert werden. Auf diese Weise
erhält man einen Algorithmus logarithmischer Ordnung.
Beispiel:
M = 8, e = 27 = 1 + 2 + 8 + 16, n = 55
81 ≡ 8 mod 55
82 ≡ 64 ≡ 9 mod 55
84 ≡ 82 · 82 ≡ 9 · 9 ≡ 81 ≡ 26 mod 55
88 ≡ 84 · 84 ≡ 26 · 26 ≡ 676 ≡ 16 mod 55
816 ≡ 88 · 88 ≡ 16 · 16 ≡ 256 ≡ 36 mod 55
827 ≡ 81 · 82 · 88 · 816 ≡ 8 · 9 · 16 · 36 ≡ 41472 ≡ 2 mod 55
18
3.4
Die Sicherheit von RSA
Nehmen wir an, eine Person ohne den privaten Schlüssel d möchte eine mit dem dazugehörigen öffentlichen Schlüssel verschlüsselte Nachricht lesen. Er müsste dazu aus dem öffentlichen
Schlüssel (bestehend aus e und n) den privaten Schlüssel d berechnen.
Das einzige bis heute bekannte Verfahren dafür (es ist allerdings nicht bewiesen, dass es
keine effizientere gibt) besteht darin, n wieder in ihre Primfaktoren p und q zu faktorisieren.
Hat man die Primzahlen gefunden, so kann mit e und (p − 1)(q − 1) der private Schlüssel
d natürlich leicht berechnet werden. Die Faktorisierung von n ist heute allerdings praktisch
(!) nicht möglich, wenn man bei der Wahl von p und q folgendes beachtet:
• p und q sind riesig (Militärstandard sind 1024 Bit, was mehr als 300 Dezimalstellen
entspricht)
• p und q liegen weit auseinander.
Der erste Punkt dürfte klar sein, der zweite Punkt ist deshalb wichtig, da die systematische
(sequentielle) Suche nach den Primzahlen nicht unbedingt bei kleinen Zahlen beginnen muss,
sondern auch bei großen Zahlen starten kann und rückwärts gesucht wird. Ausgangspunkt
wäre dabei natürlich√die Quadratwurzel von n. Je enger p und q beieinander liegen, desto
näher liegen sie bei n und desto kürzer wäre die Suche.
Beachtet man die obigen Punkte, so ist es sehr wahrscheinlich, dass die Sonne ausbrennt,
bevor ein Computer mit heutiger Rechenleistung und den heute bekannten Algorithmen n
faktorisiert hätte.
Die wachsende Rechenleistung der Computer stellt kein Problem dar, da diese Entwicklung vorauszusehen ist sodass der Nutzer bei der Wahl seiner Schlüssel darauf achten kann,
dass sein n groß genug ist, sodass es während der Zeit der beabsichtigten Verwendung nicht
faktorisierbar ist.
Problematisch wird es bei unvorhersagbaren Ereignissen wie z.B. die Fertigstellung eines Quantencomputers (für den das Faktorisierungsproblem möglicherweise kein prinzipiell
so schwieriges Problem ist) oder die Entwicklung eines effizienten Algorithmus zur Faktorisierung einer großen Zahl. Es ist allerdings, wie bereits erwähnt, nicht bewiesen, dass das
Faktorisierungsproblem überhaupt gelöst werden muss, um den privaten Schlüssel zu bestimmen. Solche Entwicklungen sind zwar höchst unwahrscheinlich, können theoretisch aber
jederzeit eintreten.
19
Literatur
[1] Clemens Heuberger, Zahlentheorie, http://www.oemo.at/intern/formel/zahlentheorie.pdf
[2] Simon Singh, Geheime Botschaften
20