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