Seminararbeit Primzahlerzeugung
Transcription
Seminararbeit Primzahlerzeugung
Westfälische Wilhelms-Universität Münster Seminararbeit Primzahlerzeugung Im Rahmen des Seminars „Multimedia“ Tobias Brockmann Themensteller: Prof. Dr. Herbert Kuchen Betreuer: Christian Arndt Institut für Wirtschaftsinformatik Praktische Informatik in der Wirtschaft Inhaltsverzeichnis 1 Einleitung................................................................................................................... 3 2 Primzahlen in der Informatik..................................................................................... 4 3 Definition von Primzahlen......................................................................................... 6 3.1 Eigenschaften von Primzahlen.......................................................................... 6 3.2 Der Satz von Euklid.......................................................................................... 7 3.3 Der kleine Satz von Fermat .............................................................................. 8 3.4 Besondere Primzahlen ...................................................................................... 8 3.4.1 3.4.2 4 5 Mersenne-Primzahlen ................................................................................... 8 Pseudoprimzahlen......................................................................................... 9 Testen von Primzahlen ............................................................................................ 11 4.1 Das Sieb des Eratosthenes .............................................................................. 11 4.2 Test durch Probedivision ................................................................................ 13 4.3 Der Fermat-Test .............................................................................................. 14 4.4 Der Miller-Rabin-Test .................................................................................... 15 4.5 Der Lucas-Lehmer-Test .................................................................................. 16 4.6 Beispiel einer Primzahltest-Implementierung in JAVA ................................. 17 Zusammenfassung ................................................................................................... 21 Literaturverzeichnis ........................................................................................................ 23 II Kapitel 1: Einleitung 1 Einleitung Seit den frühen Anfängen der Mathematik wird den Primzahlen großes Interesse entgegengebracht. Oft hatte das etwas mit Zahlenmystik zu tun. So nimmt die Zahl sieben in Märchen und vielen Religionen eine besondere Rolle ein. Durchsucht man die Buchtitel einer Bibliothek nach der Zahl sieben, bekommt man weitaus mehr Treffer als bei der Suche nach den benachbarten Zahlen 6 und 8 [RS07, S. 102]. Ein materieller Nutzen der jahrtausendealten Forschung zeigt sich erstmalig in den letzten Jahren in Form von effektiven Verschlüsselungstechniken auf Basis von großen Primzahlen. Noch vor nicht langer Zeit hätte wohl niemand eine so in den Alltag hineinreichende praktische Anwendung der Zahlentheorie für möglich gehalten [RS07, 102]. Das Interesse an der Primzahlenforschung ist bis heute ungebrochen. Das GIMPS (Great Internet Mersenne Prime Search) Projekt der Central Missouri State University konnte im September 2006 die größte bisher gefundene Mersenne-Primzahl mit 9.808.358 dezimalen Stellen ermitteln. Ziel des GIMPS-Projektes ist es, die erste Primzahl mit mehr als 10 Millionen dezimalen Stellen zu finden – auf sie ist ein Preisgeld von 100.000 $ ausgesetzt (siehe www.mersenne.org). Die Suche nach einem effizienten Algorithmus zur Primfaktorenzerlegung und der Beweis für die Unendlichkeit von Primzahlzwillingen gelten als ungelöste Probleme der Mathematik. In dieser Seminararbeit wird im zweiten Kapitel zunächst die Relevanz von Primzahlen in der Informatik beschrieben und ein kurzer Ausblick auf das RSA- Verschlüsselungsverfahren gegeben, bei dem Primzahlen die Grundlage für die Verschlüsselung darstellen. Im dritten Kapitel „Definition von Primzahlen“ werden dann die grundlegenden Eigenschaften von Primzahlen erarbeitet und die Spezialfälle der Mersenne- und Pseudoprimzahlen vorgestellt. Die für Public-Key-Kryptosysteme benötigten sehr großen Primzahlen werden mithilfe von Primzahltests ermittelt [BU01, 105]. Im vierten Kapitel werden fünf typische Verfahren zum Testen von Primzahlen beschrieben und anhand von Beispielen verdeutlicht. Ein ausgewählter Primzahltest wird exemplarisch in JAVA implementiert. 3 Kapitel 2: Primzahlen in der Informatik 2 Primzahlen in der Informatik Seit mehreren Jahrhunderten haben Rechenmaschinen eine Relevanz für die Primzahlforschung. Selbst die ersten einfachen Rechenmaschinen wurden zur Lösung von mathematischen Primzahlproblemen verwendet. Ohne sie wären bis heute viele mathematische Probleme ungelöst geblieben. Mit Eintritt des Computerzeitalters Mitte des 20. Jahrhunderts wurden Computer auch zum Finden von großen Primzahlen genutzt. Seitdem wurden regelmäßig neue Primzahlen entdeckt. Es bestand also nur ein Nutzen für die Primzahlforschung, wohingegen die Informatik bis dahin keine Verwendung für Primzahlen hatte. Dieser Nutzen von Primzahlen für die Informatik existiert erst seit der Entwicklung von Kodierungs- und Verschlüsselungsverfahren Ende der 70er Jahre. Ein Kodierungsverfahren, das Primzahlpotenzen verwendet, ist der Reed-Solomon-Code. Die wichtigste praktische Anwendung für Primzahlen findet sich jedoch in Public-Key-Kryptosystemen wie dem RSA-Verfahren. Ein zentrales Problem von symmetrischen Verschlüsselungsverfahren ist, dass bei jeder Datenübertragung zuvor ein geheimer Schlüssel übertragen werden muss. Dieser Schlüssel wird zum Ver- und zum Entschlüsseln der Daten verwendet, d. h., der Schlüssel muss sowohl auf der Absender- als auch auf der Empfängerseite vorhanden sein. Dazu muss ein sicherer Übertragungskanal zur Verfügung stehen, z. B. die Übermittlung des Schlüssels mit einem Kurier. Die Komplexität dieses Verfahrens steigt mit der Teilnehmerzahl des Netzwerkes. Abhilfe schafft ein asymmetrisches Public-Key-Kryptosystem, bei dem es einen öffentlichen Schlüssel gibt, auf den jeder Zugriff hat. Er wird zum Verschlüsseln von Nachrichten verwendet. Das Gegenstück stellt ein geheimer privater Schlüssel da, mit dem die Nachrichten entschlüsselt werden können [BU01, S. 113]. Beim RSA-Verfahren werden sehr große Primzahlen genutzt, um elektronische Nachrichten zu verschlüsseln. Seine Sicherheit hängt eng mit der Schwierigkeit zusammen, große Zahlen in ihre Primfaktoren zu zerlegen [BRK01, S. 174]. Die Idee des RSA-Verfahrens besteht darin, dass ein privater Schlüssel, der aus dem Zahlenpaar (d , N ) besteht, zum Entschlüsseln und zum Signieren der Nachricht verwendet wird. Dieser Schlüssel ist geheim, wird nicht übertragen und kann nur mit 4 Kapitel 2: Primzahlen in der Informatik sehr hohem Aufwand aus dem öffentlichen Schlüssel berechnet werden. Der öffentliche Schlüssel besteht aus dem Zahlenpaar (e, N ) , er wird zum Verschlüsseln und zum Überprüfen von Signaturen verwendet. Die Zahl N ist bei beiden Schlüsseln identisch, sie wird als RSA-Modul bezeichnet. Das Vorgehen von RSA soll nun in drei grundlegenden Schritten vorgestellt werden. 1. Es werden zwei Primzahlen p ≠ q gewählt und das RSA-Modul N = p * q bestimmt. 2. Wähle e =∈ 1 < e < ( p − 1)(q − 1) und gcd(e, ( p − 1)(q − 1)) = 1 3. Berechnen des Entschlüsselungsexponenten d, für den gilt d * e ≡ 1 mod( p − 1)(q − 1) Der öffentliche Schlüssel ist (e, N ) , während der private Schlüssel d ist. Die Zahlen p und q werden nicht mehr benötigt und können gelöscht werden [BU01, S. 179]. Eine Nachricht kann nicht übertragen werden, wenn der private Schlüssel d nicht bekannt ist. Um d zu bestimmen, ist es notwendig, die Primzahlen p und q aus N durch Faktorisierung zu bestimmen. Der effizienteste Faktorisierungsalgorithmus, dessen Laufzeit bewiesen werden kann, benutzt quadratische Formen. Es handelt sich um einen 1 probabilistischen Algorithmus mit erwarteter Laufzeit Ln [ ,1 + o(1)] [BU01, S. 147f.]. 2 Bislang ist kein Faktorisierungsalgorithmus bekannt, der in polynomialer Laufzeit (siehe Kap 4.6) arbeitet. Das Zerlegen einer sehr großen Zahl in ihre Primfaktoren ist demnach in vertretbarer Zeit nicht möglich. Public-Key-Kryptosysteme gelten als sicher und haben den Vorteil, dass im Gegensatz zu den symmetrischen Verfahren kein geheimer Schlüssel übertragen wird. Es reicht aus, einen öffentlichen Schlüssel zentral bereitzustellen. Unglücklicherweise kennt man bis heute kein einfaches Verfahren, mit dem sich ausschließlich Primzahlen erzeugen lassen. Andererseits ist bekannt, dass es sehr viele Primzahlen gibt. Um zufällige große Primzahlen zu generieren, wird eine natürliche Zahl der gewünschten Größe erzeugt und dann mithilfe von Primzahltests (siehe Kap. 4) auf Primalität untersucht [BU01, S. 105]. 5 Kapitel 3: Definition von Primzahlen 3 Definition von Primzahlen 3.1 Eigenschaften von Primzahlen Eine Primzahl lässt sich durch grundlegende Eigenschaften charakterisieren, die im Folgenden kurz beschrieben werden. Eine natürliche Zahl n ≥ 2 mit genau zwei Teilern wird als Primzahl bezeichnet, wenn ihre einzigen positiven Teiler 1 und n sind. Ist eine natürliche ganze Zahl n ≥ 2 keine Primzahl, so wird sie als zusammengesetzte Zahl bezeichnet [BU98, S. 5]. Die Folge der Primzahlen beginnt also aufsteigend sortiert wie folgt: 2, 3, 5, 7, 11, 13, 17, 19, 23 Daraus lässt sich ableiten, dass sich eine Primzahl nicht aus dem Produkt zweier natürlicher Zahlen n > 1 darstellen lässt. Im Umkehrschluss besagt der Fundamentalsatz der Arithmetik, dass sich jede von eins verschiedene natürliche Zahl als Produkt endlich vieler Primzahlen darstellen lässt [BU98, S. 7]. Die Zerlegung einer natürlichen Zahl in ihre Primteiler wird als Primfaktorenzerlegung bezeichnet. Ist die Folge der Faktoren aufsteigend sortiert, wird dies als Eindeutigkeit der Primfaktorenzerlegung bezeichnet. Beispiel: Die Zahl n = 105 lässt sich eindeutig durch die Primzahlen 3, 5, 7 darstellen. Primzahlen entsprechen immer der Form 2k + 1 , wobei „k“ eine natürliche Zahl ist. Das bedeutet, dass mit Ausnahme der Zahl 2 alle Primzahlen ungrade sind. Primzahlen lassen sich in zwei Kategorien einteilen: Primzahlen der Form 4k+1 oder 4k+3, wobei „k“ eine natürliche Zahl ist. Die Zahl 2 lässt sich nach dem oben genannten Schema nicht klassifizieren und stellt somit eine Ausnahme da. Die größte bislang gefundene Primzahl ist 232.582.657 − 1. Es handelt sich hier um eine Mersenne-Primzahl (siehe Kap. 3.4.1) mit 9.808.358 dezimalen Stellen. Euklid hat bereits im vierten Jahrhundert vor Christus festgestellt, dass es unendlich viele Primzahlen gibt. Diese Aussage wird als „Satz von Euklid bezeichnet“ (siehe Kap. 3.2). Zusammenfassend lässt sich folgende Definition für Primzahlen herleiten: Primzahlen stellen eine unendliche Folge von ungraden natürlichen Zahlen n > 2 da, die nur durch 1 und sich selbst ohne Rest teilbar sind. 6 Kapitel 3: Definition von Primzahlen 3.2 Der Satz von Euklid Der Satz von Euklid liefert die Antwort auf die These, dass es unendlich viele Primzahlen gibt. Um dies mathematisch zu belegen, verwendete Euklid einen Widerspruchsbeweis. Angenommen, p1 ; p 2 ;... p n sei die Menge an endlichen Primzahlen. Definiert man P als P = p1 p 2 ... p n + 1 und p als eine Primzahl, die P teilt, dann kann p keine Zahl der Menge p1 ; p 2 ;... p n sein. Denn andernfalls müsste p auch die Differenz P- p1 ; p 2 ;... p n = 1 teilen, was aber unmöglich ist. Daher ist p eine zusätzliche Primzahl, sodass p1 ; p 2 ;... p n nicht die Menge aller Primzahlen ist [RI88; S. 03]. Damit ist obige Annahme widerlegt. Beispiel: Die Menge der Primzahlen sei 2, 3, 5, 7, dann ergibt sich für P = 211, p muss dann eine Primzahl sein, die P teilt. Das wäre in diesem Fall p = 211, da 211 selbst eine Primzahl ist. Eine praktische Anwendung findet der Satz von Euklid, indem zu einer oder mehreren gegebenen Primzahlen mindestens eine Primzahl berechnet werden kann. Dazu wird das Produkt der Primzahlen berechnet und 1 hinzuaddiert. Anschließend führt man von der zuvor berechneten Zahl eine Primfaktorenzerlegung durch. Alle Primfaktoren, die zuvor nicht in der Primzahlmenge waren, sind neu gefundene Primzahlen. Euklids Beweis ist zwar recht einfach, doch gibt er keinerlei Auskunft über die Beschaffenheit der neuen Primzahl. Es ist nur bekannt, dass sie in ihrer Größe höchstens gleich P = p1 p 2 ... p n + 1 ist. Daher ist die Zahl P für manche Indizes n selbst schon eine Primzahl, für andere n aber zerlegbar [RI06, S. 4]. n Beispiel: P = 1 + ∏ pi i =1 Sei 2, 5, 11 die Menge der Primzahlen, ergibt sich für P = 1 + 2*5*11 = 111. Die Primfaktorenzerlegung ergibt dann: 111 = 3 * 37. Die Zahlen 3 und 37 sind dann zwei neu gefundene Primzahlen. 7 Kapitel 3: Definition von Primzahlen 3.3 Der kleine Satz von Fermat Der Satz von Fermat ist ein Lehrsatz der Zahlentheorie. Er macht Aussagen über die Eigenschaften von Primzahlen und wurde im 17. Jahrhundert von Pierre de Fermat aufgestellt: Ist p eine Primzahl, n eine ganze Zahl und p kein Teiler von n, so gilt n p −1 ≡ 1 mod p für alle natürlichen Zahlen. Anders ausgedrückt: np-1 ergibt bei der Division durch p immer den Rest 1 [BE01, S120]. Beweis: Die Aussage ist richtig für n = 1 . Angenommen, sie gelte für ein n, dann ist durch Induktion (n + 1) p = n p + 1 = n + 1(mod p ) . Somit ist der Satz für jede natürliche Zahl n bewiesen. Weitere Beweise finden sich in [RI06, S. 17ff.]. Der Satz von Fermat eröffnet die Möglichkeit festzustellen, ob eine natürliche Zahl n zusammengesetzt oder prim ist. Ergibt sich beim Teilen von n durch p nicht 1, dann ist die Zahl n zusammengesetzt. Ergibt sich jedoch der Rest 1, dann kann n sowohl Primzahl als auch zusammengesetzt sein [BU98, S. 99–100]. Beispiel: n = 2; p = 5, dann gilt 2 4 = 16 , Division durch p ergibt 3 * 5 + 1. Nach dem kleinen Satz von Fermat handelt es sich bei der Zahl p um eine Primzahl. Das Beispiel n = 2; p = 341 ergibt 2 340 ≡ 1 mod 341 und damit handelte es sich nach dem kleinen Satz von Fermat um eine Primzahl, obwohl n = 341 = 11 * 31 und damit zusammengesetzt ist. Der Satz von Fermat bildet die Grundlage für Algorithmen zum Testen von Primzahlen [BU01, S. 107]. 3.4 Besondere Primzahlen 3.4.1 Mersenne-Primzahlen Der Mönch Marin Mersenne (1588–1645) entdeckte, dass es Primzahlen der Form M p = 2 p - 1 gibt. Falls eine Zahl der Form 2 p − 1 prim ist, so muss dies auch schon für den Exponenten gelten. Darüber hinaus lässt sich leicht nachprüfen, dass Zahlen der Form 2 p − 1 Primzahlen sind und somit auch p Primzahl ist. Bei der Suche nach MersennePrimzahlen hat man den Vorteil, dass nur noch die Zahlen zu überprüfen sind, bei denen 8 Kapitel 3: Definition von Primzahlen p eine Primzahl ist. Ein entsprechender Beweis findet sich im Artikel „A note on Mersenne numbers“ von Ligh, S. & Neal, L [RI06, S. 77]. Beispiel: Die Primzahlen M 2 = 2 2 − 1 = 3 und M 3 = 2 3 − 1 = 7 sind Mersenne Primzahlen. Die Primzahl M 11 = 211 − 1 = 2047 ist faktorisierbar als 23 * 89 und damit zusammengesetzt. Bereits zu Mersennes Zeit war bekannt, dass einige Zahlen prim und andere zerlegbar sind. Das gezeigte Verfahren ermittelt mit umso höherer Wahrscheinlichkeit eine Primzahl, je größer der Exponent p ist. Es wird vermutet, dass es unendlich viele Mersenne-Primzahlen gibt. Einen Beweis dafür gibt es jedoch bis heute nicht. Bisher wurden 44 Mersenne-Primzahlen gefunden. Die letzte und größte wurde am 04.09.2006 von dem GIMPS-Projekt bestimmt. Es ist die Zahl 232.582.657 − 1, eine Zahl mit 9.808.358 dezimalen Stellen. Eine Liste mit allen bisher bekannten MersennePrimzahlen findet sich unter: www.Primzahlen.de Zur Überprüfung einer Mersenne-Primzahl wird der Lucas-Lehmer-Test verwendet. Obwohl er zu den effektivsten Primzahltests gehört, benötigt er bei sehr großen pWerten O (n 2 log n) Zeit (siehe Kap. 4.6). In der Praxis bedeutet dies, dass trotz der polynomiellen Laufzeit eine hohe Rechenleistung zum Auffinden der Primzahlen notwendig ist. Weitere Informationen finden sich auf der Internetseite des GIMPSProjekts (www.mersenne.org) [RI06, S. 80]. 3.4.2 Pseudoprimzahlen Eine Pseudoprimzahl ist eine zusammengesetzte Zahl, die gewisse Eigenschaften besitzt, von denen man annehmen würde, dass sie nur auf eine Primzahl zutreffen [RI06, S. 89]. Entdeckt wurden Pseudoprimzahlen bei der Suche nach Algorithmen zur Überprüfung von Primzahlen. Da diese Algorithmen nicht perfekt arbeiteten, wurden Zahlen als Primzahlen identifiziert, die eigentlich keine sind, sich jedoch mit dem verwendeten Algorithmus wie Primzahlen verhalten. Es existieren verschiedene Pseudoprimzahlen, die bekanntesten sind allerdings die Fermat’schen Pseudoprimzahlen. Sie leiten sich direkt vom „kleinen Satz des Fermat“ (siehe Kap 2.3) ab. Zu der Klasse der Fermat’schen Pseudoprimzahlen zählen die CarmichaelPrimzahlen, die Euler’schen Pseudoprimzahlen und die starken Pseudoprimzahlen [RI06, S. 96–101]. Bei der Untersuchung von Pseudoprimzahlen werden die gleichen 9 Kapitel 3: Definition von Primzahlen Fragen wie im Falle der Primzahlen gestellt. So ist z. B. von Interesse, wie viele Pseudoprimzahlen es gibt, wie sie verteilt sind, wie man erkennen kann, ob eine Pseudoprimzahl prim ist, und wie man Pseudoprimzahlen generieren kann [RI06, S. 91]. Zunächst soll der Aufbau einer Carmichael-Primzahl kurz vorgestellt werden. Carmichael-Primzahlen sind zusammengesetzte Zahlen n, für die die Kongruenz a n −1 ≡ 1 mod(n) gilt. Für die Basis a muss gelten: 2 ≤ a ≤ n − 2 und ggT (a, n) = 1 . Unter diesen Bedingungen verhalten sich zusammengesetzte Zahlen auf verschiedenen Basen a ≥ 2 wie Primzahlen [RI06, S 93]. Aufgrund der Tatsache, dass es unendlich viele Primzahlen gibt, existieren auch unendlich viele Carmichael-Zahlen. Entsprechende Beweise finden sich in [RI06, S. 94]. Beispiel: Die kleinste Carmichael-Primzahl ist n = 561 = 3 * 11 * 17 . Es gilt hier für alle Basen a, die keinen Primfaktor mit n = 561 gemeinsam haben. Für Basis a = 3 wird die oben genannte Bedingung nicht erfüllt, denn 3560 ≡ 375 mod 561 . Die Euler’schen Pseudoprimzahlen sind wie folgt definiert: „Eine ungerade natürliche zusammengesetzte Zahl n wird als Eulersche Pseudoprimzahl zur Basis a ≥ 2 a bezeichnet, wenn a und n teilerfremd sind und es gilt: ( ) ≡ a n n −1 2 mod n “. Beweise sind [RI06, S. 96f.] zu entnehmen. Bei einer starken Pseudoprimzahl handelt es sich immer um eine Euler’sche Pseudoprimzahl, allerdings ist nicht jede Euler’sche Primzahl auch eine starke Pseudoprimzahl [RI06, S. 98]. Eine zusammengesetzte Zahl n = d * 2 s + 1 mit ungeradem d und s ≥ 1 sowie a dergestalt, dass 1 < a < n und ggT(a, n) = 1, ist genau dann eine starke Pseudoprimzahl, wenn eine der beiden folgenden Bedingungen erfüllt ist: r d2 ≡ − 1 mod n mit 0 ≤ r ≤ ( s − 1) . Entsprechende Beweise a d ≡ 1 mod n oder a finden sich [RI06, S. 98ff.]. Beispiel: Sei n = 341; d = 85; s = 2 . Dann ist 341 eine starke Pseudoprimzahl zur Basis a = 47 , denn 47 85 ≡ 1 mod 341 . 10 Kapitel 3: Definition von Primzahlen Ebenfalls ist 341 eine starke Pseudoprimzahl zur Basis a = 61 , denn 1 6185*2 ≡ −1 mod 341 . 11 Kapitel 4: Testen von Primzahlen 4 Testen von Primzahlen Ein Primzahltest ist ein mathematisches Verfahren, mit dem in N Schritten ermittelt werden kann, ob eine gegebene Zahl eine Primzahl ist, oder das im Falle der Zerlegbarkeit die Primfaktoren liefert. Für eine gegebene Zahl N müssen nur alle Zahlen n = 1, 2, 3 …bis hin zur Zahl N daraufhin geprüft werden, ob sie ein Teiler von N sind. Wenn dies für kein n der Fall ist, handelt es sich um eine Primzahl [RI06, S. 15]. Ein entsprechender Beweis findet sich im Buch von Johannes Buchmann: Einführung in die Kryptographie S. 105 Theorem 6.1.1. Praktische Anwendung finden Primzahltests bei asymmetrischen Verschlüsselungsverfahren in der Informatik, wobei Primzahlen mit mehreren hundert Dezimalstellen benötigt werden. Da „echte“ Primzahltests eine nicht vertretbare exponentielle Laufzeit haben, verwendet man Primzahltests, die auf der Basis von Monte-Carlo-Algorithmen beruhen. Monte-Carlo-Algorithmen sind randomisierte Algorithmen, die mit einer nach oben beschränkten Wahrscheinlichkeit ein falsches Ergebnis liefern dürfen. Dafür sind sie im Vergleich zu deterministischen Algorithmen effizienter. Ihr Nachteil besteht darin, dass nicht wirklich sicher festgestellt werden kann, ob die gegebene Zahl eine Primzahl ist. Die Wahrscheinlichkeit, eine zusammengesetzte Zahl fälschlicherweise als Primzahl zu identifizieren, kann zwar durch wiederholtes Ausführen des Algorithmus beliebig klein werden, aber nicht null werden [WA06, S. 160]. In dem folgenden Kapitel wird zunächst ein Verfahren zur Bestimmung aller möglichen Primzahlen vorgestellt, das „Sieb des Eratosthenes“. In Kapitel 4.2 wird der Primzahltest durch Probedivision beschrieben. Der Fermat-Test, der Miller-Rabin-Test und der Lucas-Lehmer-Test für Mersenne-Primzahlen werden in den darauf folgenden Kapiteln vorgestellt. Die Implementierung eines Primzahltests wird in Kapitel 4.6 durchgeführt. 4.1 Das Sieb des Eratosthenes Das Sieb des Eratosthenes ist ein Verfahren zur Bestimmung aller Primzahlen p mit x < p < x , wenn sämtliche p ≤ x bereits bekannt sind [BU98. S. 285]. Im eigentlichen Sinne ist es kein Primzahltest, sondern ein Verfahren zum Erzeugen von 12 Kapitel 4: Testen von Primzahlen Primzahlenlisten. Da diese Liste bis zu einer frei wählbaren Grenze alle Primzahlen enthält, kann sie als Primzahltest verwendet werden. Es wird lediglich überprüft, ob die gesuchte Zahl in der Liste ist. Um eine Primzahlliste zu erstellen, wird wie folgt vorgegangen. 1. Zuerst werden alle Zahlen N = {2, 3, 4,…n} bis zu einem frei wählbaren Maximalwert S aufgeschrieben. 2. Alle Zahlen der Menge N sind zunächst potenzielle Primzahlen. Die kleinste Zahl N i ist immer eine Primzahl. 3. Nun werden alle Vielfachen der Primzahl bis zur Schranke S als Ni zusammengesetzt markiert. 4. Es wird dann die nächstkleinste Primzahl N i +1 ausgewählt und Schritt 3 ausgeführt. Die Schritte 3 und 4 werden so lange wiederholt, bis das Quadrat der Primzahl N i + n größer als die Schranke S ist. Dann sind alle Primzahlen kleiner oder gleich S bestimmt [RE07, S. 102]. Die Vorgehensweise zur Erstellung einer Primzahlliste wird nun anhand eines Beispiels (N = 30) illustriert. Zunächst werden alle Zahlen von 1–30 notiert [RI06 S. 16]. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Die Primzahlen 30 müssen bekannt sein. Es sind die Zahlen 2, 3, 5. Die Zahl 1 ist per Definition keine Primzahl und wird aus der Liste gestrichen [BU98, S. 286]. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Die Zahl 2 ist die kleinste Primzahl. Alle ihre Vielfachen der Form 2n mit natürlichen Zahlen n > 2 sind jedoch zusammengesetzt. Die Zahlen 4, 6, 8 … sind aus der Liste zu streichen. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 13 Kapitel 4: Testen von Primzahlen Die kleinste nun noch nicht betrachtete Zahl ist 3. Mögliche „echte“ Teiler, also Teiler, die ungleich 1 und ungleich der Zahl selbst sind, wären kleiner. Weil die Zahl 3 nicht gestrichen wurde, besitzt sie keinen solchen Teiler und ist damit Primzahl. Andererseits folgt, dass alle Zahlen 3n mit n ≥ 2 keine Primzahlen sind. Die Zahlen 6, 9, 12 … sind somit zu streichen. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Dabei fällt auf, dass einige Zahlen bereits im vorherigen Schritt gestrichen wurden (z. B. 6 und 12). Es ist jedoch schneller, dies in Kauf zu nehmen, als einen irgendwie gearteten Test einzubauen, der mehrfaches Streichen verhindert. Nun sind alle Vielfachen der nächstkleinsten und noch nicht gestrichenen Zahl zu streichen. In diesem Fall ist das die Zahl 5. Das Verfahren wird fortgesetzt, bis alle Zahlen zur Obergrenze x erfasst worden sind. Jede nicht gestrichene Zahl in der Liste ist eine Primzahl [RS07, S. 103]. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Es ergibt sich die Primzahlliste 2, 3, 5, 7, 11, 13,17, 19, 23, 29. 4.2 Test durch Probedivision Gegeben sei eine natürliche Zahl n, die auf Primalität zu überprüfen ist. Grundlage für den Test durch Probedivision ist der folgende Zusammenhang: Wenn n eine zusammengesetzte natürliche Zahl ist, dann hat n einen Primteiler p, der nicht größer ist als n [BU01, S. 105]. Um eine Zahl n auf Primalität zu überprüfen, muss für alle Primzahlen p, die nicht größer als n sind, überprüft werden, ob sie n teilen. Dazu ist es notwendig, die Primzahlen p zu bestimmen oder in einer Tabelle nachzusehen. Alternativ kann auch geprüft werden, ob n durch eine ungerade Zahl Z ohne Rest teilbar ist, für die gilt: Z ≤ n und n > 1. Wird diese Bedingung erfüllt, dann kann n keine Primzahl sein. Andernfalls ist n eine Primzahl [BU01, S. 105]. 14 Kapitel 4: Testen von Primzahlen Beweis: Sei eine natürliche Zahl n zusammengesetzt n = pm, wobei p eine Primzahl ist und m ≥ 2 . Ist p > n , so ist m < n und hat einen Primteiler p ∈ 2 ≤ m < n . Dieser ist auch Primteiler von n [RS62]. Beispiel: Mithilfe der Probedivision soll die Zahl n = 15413 auf Primalität überprüft werden. Es gilt n = 124. Es muss getestet werden, ob eine der Primzahlen p ≤ 124 ein Teiler von n ist. Die Primzahlen p ≤ 124 sind, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113. Keine dieser Zahlen teilt n. Daher ist n Primzahl. Alternativ kann getestet werden, ob eine ungerade Zahl zwischen 1 und 124 n ohne Rest teilt, also die Zahlen 3, 5, 7, 9, 11, 13, 15 ...123. Keine dieser Zahlen teilt n ohne Rest, damit muss n selbst eine Primzahl sein. 4.3 Der Fermat-Test Der Fermat-Test beruht auf dem kleinen Satz von Fermat (siehe Kap 3.3). Er eröffnet die Möglichkeit festzustellen, ob eine natürliche Zahl p zusammengesetzt ist. Ergibt das Theorem y = n p −1 mod p den Wert y ≠ 1 , so ist p zusammengesetzt und somit keine Primzahl. Ergibt sich der Wert y = 1 , so kann p sowohl Primzahl als auch zusammengesetzt sein [BU01, S. 107]. Der Fermat-Test kann also nur zeigen, dass p keine Primzahl ist. Lässt sich mit dem Fermat-Test auch für unterschiedliche Basen n ≥ 2 kein Beweis finden, dass p zusammengesetzt ist, dann kann mit großer Wahrscheinlichkeit davon ausgegangen werden, dass p eine Primzahl ist [BU01, S. 107]. Beispiel: Sei p = 341 = 11 * 31 und n = 2, dann gilt 2 340 ≡ 1 mod 341 , daher müsste nach dem Fermat-Test p als Primzahl klassifiziert werden, obwohl p augenscheinlich eine zusammengesetzte Zahl ist. Der Fermat-Test zu Basis n = 3 zeigt, dass 3340 ≡ 56 mod 341 und p somit keine Primzahl ist. 15 Kapitel 4: Testen von Primzahlen 4.4 Der Miller-Rabin-Test Der Miller-Rabin-Test ist ein Algorithmus aus dem Gebiet der mathematischen Zahlentheorie. Er ist nach Garry Miller und Michael O. Rabin benannt. Alternativ wird er auch als Miller-Selfridge-Rabin-Test bezeichnet [YA02, S. 202]. Im vorherigen Kapitel wurde beschrieben, dass mit dem Fermat-Test niemals Gewissheit besteht, ob eine Zahl prim ist (siehe Kap 4.3). Der Miller-Rabin-Test verwendet als Grundlage eine Verschärfung des kleinen Satzes von Fermat. Mit ihm ist es möglich, mit einer Wahrscheinlichkeit von herauszufinden, (Beweis ob siehe (1 / 2) s , wobei s die Anzahl der Iterationen angibt, eine F. natürliche Zahl Rienhardt: zusammengesetzt Der ist. Miller-Rabin-Test, www.bitnuts.de/rienhardt/docs/miller_rabin.pdf) Wird festgestellt, dass eine Zahl eine Primzahl ist, ist dies kein sicheres Ergebnis. Die Wahrscheinlichkeit, eine Zahl falsch zu klassifizieren, sinkt mit der Anzahl der Iterationen. Die Zahlen, die fälschlicherweise vom Miller-Rabin-Test als Primzahlen identifiziert werden, bezeichnet man als starke Pseudoprimzahlen (siehe Kap 3.4.2). Da der Algorithmus nicht immer ein korrektes Ergebnis liefert, zählt er zur Klasse der Monte-Carlo-Algorithmen [BU01, S. 109]. Es gilt hier: n ist eine ungerade natürliche Zahl und s = max{r ∈ N : 2 r teilt (n − 1)} . Damit ist also 2 s die größte Potenz von 2, die n-1 teilt. Setze d = n −1 . Dann ist d eine 2s ungerade Zahl. Ist nun n eine ungerade Zahl und a eine zu n teilerfremde ganze Zahl, so gilt für den Miller-Rabin Test Folgendes: a d ≡ 1 mod n oder aber es findet sich ein r in der Menge {0, 1, 2,…, s-1}, für das gilt a 2r d ≡ − 1 mod n . Eine dieser beiden Bedingungen ist notwendig, um n als Primzahl zu identifizieren. Findet sich also eine Zahl a, die teilerfremd zu n ist und für die weder a d ≡ 1 mod n noch a 2 r d ≡ −1 mod n gilt, so ist die Zahl n zusammengesetzt. Eine solche Zahl a wird als Zeuge der Primalität von n bezeichnet [BU01, S. 109 / BRK01, S. 167ff.] 16 Kapitel 4: Testen von Primzahlen Beispiel: Sei n = 149, dann ist n -1 = 148. 2 7 = 128 teilt 148 nicht 2 6 = 64 teilt 148 nicht 2 5 = 32 teilt 148 nicht 2 4 = 16 teilt 148 nicht 2 3 = 8 teilt 148 nicht Für wert 148 d ergibt sichdamit dannist d =s = 2 2 2den = 4 teilt =37*4, Die Basis a sei hier a = 14, die Menge Für den Wert d ergibt sich dann d = 37. Jetzt können die beiden notwendigen Bedingungen anhand einer zufällig gewählten Basis a geprüft werden. Die Basis a sei hier a = 14, die Menge r beträgt {0,1} 1. a d ≡ 1 mod n , daraus ergibt sich 14 37 ≡ 44 mod 149 2. a 2 r d ≡ −1 mod n ergibt für r = 0 14 37 ≡ −105 mod 149 1 für r = 1 14 2 37 ≡ −1 mod 149 Damit ist die Zahl 149 als Primzahl identifiziert. Die Basis a = 14 ist Zeuge der Primalität. Wird der Vorgang für weitere Basen a wiederholt, erhöht sich die Wahrscheinlichkeit, mit der die Zahl n als richtig klassifiziert wird. 4.5 Der Lucas-Lehmer-Test Der Lucas-Lehmer-Test ist ein Verfahren, um Mersenne-Primzahlen zu überprüfen. Entwickelt wurde der Test von Eduardo Luca und Derrick Henry Lehmer, der die Arbeiten von Luca fortsetzte. Als mathematische Grundlagen dienen Lucas-Folgen. Häufigste Verwendung findet der Test beim Suchen von sehr großen Primzahlen. Er ist seit Jahren die effizienteste Methode, um die größten zurzeit bekannten Primzahlen zu entdecken, und wird als Standardtestverfahren beim GIMPS-Projekt eingesetzt. Verwendet werden kann der Lucas-Lehmer-Test nur bei Mersenne-Primzahlen ab der Größe M 3 = 2 3 − 1 = 7 . 17 Kapitel 4: Testen von Primzahlen Der Algorithmus funktioniert wie folgt: Es sei p eine ungerade Zahl und die rekursive Folge S (k + 1) definiert durch S (1) = 4 und S (k + 1) = S (k )² − 2 . Dann ist jede Mersenne-Primzahl M p = 2p – 1 eine Primzahl, wenn S ( p − 1) durch M p teilbar ist. In dieser von Lucas und Lehmer beschriebenen Grundform werden die Zahlen S(k) sehr schnell sehr groß. Deshalb werden aus praktischen Gründen alle Zwischenschritte direkt mit modulo M p ausgerechnet. Es gilt also: S (1) = 4 und S (k + 1) = S (k )² − 2 mod M p . Die rekursive Folge wird so lange ausgeführt, bis der Wert S(p-1) berechnet wurde. M p ist eine Primzahl, wenn gilt S ( p − 1) = 0 , wenn sich also S(p-1) ohne Rest durch S (k )² − 2 mod M p teilen lässt. Weiterführende Informationen über Lucas folgen; Beweise, die dem Lucas-LehmerTest zugrunde liegen, finden sich in: The Annals of Mathematics, 2nd Ser., Vol. 31, No. 3 (Jul., 1930), pp. 419–448. Beispiel: Zu prüfen ist die Mersenne-Primzahl M 5 = 2 5−1 =31 . Es ergibt sich Folgendes: S (1) = 4 S (2) = (4² − 2) mod 31 = 14 S (3) = (14² − 2) mod 31 = 8 S (4) = (8² − 2) mod 31 = 0 Da S(4) = 62 ohne Rest durch 31 teilbar ist, ist M 5 = 2 5−1 =31 eine Primzahl. 18 Kapitel 4: Testen von Primzahlen 4.6 Beispiel einer Primzahltest-Implementierung in JAVA Die in den vorangegangenen Kapiteln vorgestellten Primzahltests sollen zunächst bezüglich ihrer Laufzeitkomplexität und ihrer Relevanz für die Praxis miteinander verglichen werden. Anhand dieses Vergleiches wird dann ein Primzahltest ausgewählt und beispielhaft in JAVA implementiert. Primzahltest Laufzeitkomplexität Relevanz Praxis Geringe Relevanz, schlechte Laufzeit auch bei Sieb des Eratosthenes Exponentielle Laufzeit kleinen Zahlen. Wird genutzt, um Primzahltabellen zu erstellen. Exponentielle Laufzeit Test durch Probedivision O(2 log( n +1) 2 ) Mittlere Relevanz, deterministischer Test, aber schlechte Laufzeit bei großen Zahlen Keine Relevanz, Logarithmische Laufzeit Fermat-Test O(log n) Primzahlen können nicht eindeutig bestimmt werden Hohe Relevanz, Miller-Rabin-Test Kubische Laufzeit schnelles Verfahren bei kleinen O(log n)³ Zahlen. Anwendung bei Verschlüsselungsverfahren. Hohe Relevanz, Polynomiale Laufzeit Lucas-Lehmer-Test O(n 2 log n) Standard-Testverfahren bei der Suche nach großen Primzahlen. Allerdings nur MersennePrimzahlen. Tabelle 1: Vergleich von Primzahltest Ein effizienter Primzahltest dürfte nur eine polynomiale Laufzeit haben. Das bedeutet, dass die Anzahl der „einfachen Rechenschritte“, die er für die Zahl n benötigt, durch C·(log n)k für die Konstanten k und C abgeschätzt werden kann. Bei Problemen, die in Polynomialzeit lösbar sind, wächst die benötigte Rechenzeit mit Problemkomplexität nicht schneller als eine Polynomfunktion. Das Besondere an der polynomialen Laufzeit ist, dass sie die Grenze zwischen praktisch lösbaren und nicht lösbaren Problemen 19 Kapitel 4: Testen von Primzahlen darstellt. Probleme, die nicht in Polynomialzeit lösbar sind, wachsen schon bei geringen Problemgrößen so schnell, dass sie nicht mit verfügbaren Rechnern und nicht in überschaubaren Zeiträumen gelöst werden können [RI06, S. 111]. Für eine eventuelle Implementierung eignen sich anhand der oben genannten Kriterien nur der Miller-Rabin- und der Lucas-Lehmer-Test. Der einzige Test, der in polynomieller Laufzeit arbeitet, ist der Lucas-Lehmer-Test. Leider ist er nur für die Überprüfung von Mersenne-Primzahlen geeignet. In der Praxis wird der Lucas-Lehmer-Test als Standardverfahren bei der Suche nach der größten Mersenne-Primzahl eingesetzt. Der Miller-Rabin-Test wird genutzt, um Primzahlen für Public-key-Kryptosysteme zu finden, und stellt damit eine direkte praktische Anwendung da. Die bei Public-KeyKryptosystemen notwendigen Primzahlen der Größenordnung von 100-stelligen Dezimalzahlen lassen sich trotz der kubischen Laufzeit mit dem Miller-Rabin-Test in adäquater Zeit bestimmen. Aufgrund des höheren praktischen Nutzens und der Anwendbarkeit auf natürliche Zahlen stellt der Miller-Rabin-Test das günstigste Verfahren da. Er soll im Folgenden beispielhaft implementiert werden. **/Die Methode zeuge realisiert den Fermat-Test * Die Funktion an-1 mod n wird durch fortgesetztes * Multiplizieren und Quadrieren erreicht. */ boolean zeuge(int a, int n){ int f = 1, x; for (int i = length(n-1)-1; i >= 0; i--){ x = f; f = x * x % n; //Nach dem Quadrieren wird geprüft, ob das Ergebnis ist //Sind x != 1 und x != n-1 ist n zusammengesetzt. if (f == 1 && x != 1 && x != n - 1) return true; //Prüfen, ob an-1 mod n 1, wenn ja, wird true //zurückgegeben if (bit(i, n - 1) == 1) f = f * a % n;} return f != 1;} **/ Die * mit * Die * Die */ boolean int for Methode miller_rabin ruft die Methode Zeuge k-mal auf. zufälligem Zeugen a = {2, ..., n-2) Methode liefert true, falls eins zeuge für n gefunden wurde Ausgabe false bedeutet, n ist eine Primzahl miller_rabin(int n, int k){ a; (int I = 0; I < k; i++){ a = random(2, n - 2); if (zeuge(a, n)) return true;} return false; } 20 Kapitel 4: Testen von Primzahlen Es lässt sich zeigen, dass die Wahrscheinlichkeit dafür, dass eine ungerade zusammengesetzte Zahl n durch den Miller-Rabin-Test nicht als zusammengesetzt entlarvt wird, 1/2k entspricht. Bei einer Erhöhung der Anzahl der Versuche k sinkt die Fehlerrate exponentiell auf beliebig kleine Werte. 21 Kapitel 5: Zusammenfassung 5 Zusammenfassung Wie im 2. Kapitel gezeigt wurde, hängt die Sicherheit von Verschlüsselungsverfahren eng mit der Schwierigkeit zusammen, natürliche Zahlen in ihre Primfaktoren zu zerlegen. In den letzten Jahren wurden immer effizientere Faktorisierungsmethoden entwickelt. Trotzdem ist RSA bei einer Schlüssellänge von 1924 Bit sicher. Alle bisher bekannten Faktorisierungsmethoden würden die gesuchten Primfaktoren nicht in einer menschlichen Lebensspanne ermitteln können. Eine wachsende Vernetzung und die zunehmende Zahl von sicherheitskritischen Webanwendungen lassen sichere Verschlüsselungsverfahren immer wichtiger werden. Die zunehmende Bedeutung von Primzahltests und Faktorisierungsalgorithmen in der Informatik ist die logische Konsequenz. Eine Definition und die grundlegenden Eigenschaften von Primzahlen wurden im dritten Kapitel beschrieben. Zwei besondere Typen von Primzahlen sind die MersennePrimzahlen (Kap 3.4.1) und die Pseudoprimzahlen (3.4.2), bei denen eine natürliche zusammengesetzte Zahl bestimmte Eigenschaften einer Primzahl hat. Bislang existiert noch kein effizientes Verfahren, um Primzahlen zu erzeugen. Es ist nur möglich, eine natürliche Zahl auf Primalität zu überprüfen. Dazu gibt es verschiedene Primzahltestverfahren. Eine Möglichkeit, Primzahllisten zu erzeugen, bietet das Sieb das Eratosthenes, mit dem hiermit Primzahllisten bis zu einer bestimmten Größe in adäquater Zeit bestimmen lassen. Der Test durch Probedivision ist ein deterministisches Verfahren. Er findet nach n Versuchen immer heraus, ob eine Zahl prim ist oder nicht. Allerdings ist er in der Praxis aufgrund seiner exponentiellen Laufzeit bei großen Zahlen nicht anwendbar. Der Test von Fermat bildet die Grundlage für den probabilistischen Miller-Rabin-Test. Mit ihm können natürliche Zahlen in kubischer Laufzeit auf Primalität überprüft werden. Um Mersenne-Primzahlen zu überprüfen, eignet sich der Lucas-Lehmer-Test, das einzige hier besprochene Verfahren, das in polynomialer Laufzeit arbeitet. Alle eben genannten Primzahltestverfahren wurden ausführlich im vierten Kapitel vorgestellt. In Zukunft werden Primzahlen ein interessantes Gebiet für die Forschung bleiben. Sei es, dass das GIMPS-Projekt das Auffinden der 45. Mersenne-Primzahl vermeldet oder es einem Mathematiker gelingt, eines der bislang ungelösten Primzahlprobleme zu lösen. 22 Kapitel 5: Zusammenfassung Eine Faktorisierung von großen Primzahlen ist bislang in vertretbarer Zeit nicht möglich. Sollte es gelingen, einen effizienten Algorithmus zu finden, der das beherrscht, könnten Public-Key-Kryptosysteme wie RSA nicht mehr als sicher gelten. 23 Literaturverzeichnis [RE07] Kristina Reiss, Gerald Schmieder: Basiswissen Zahlentheorie „Eine Einführung in Zahlen und Zahlbereiche“, 2. Auflage, Springer Verlag 2007. [BRK01] Andreas Bartholome, Josef Rung, Hans Kern: Zahlentheorie für Einsteiger, 3. Auflage, Vieweg Verlag 2001. [BU01] Johannes Buchmann: Einführung in die Kryptographie, 2. Auflage, Springer Verlag 2001. [PI84] Herbert Pieper: Zahlen aus Primzahlen, 2. Auflage, Birkhäuser Verlag 1984. [RI06] Paulo Ribenboim: Die Welt der Primzahlen, 2. Auflage, Springer Verlag 2006. [RI88] Paulo Ribenboim: The book of prime number records, 1. ed. Springer Verlag 1988. [BU98] Peter Bundschuh: Einführung in die Zahlentheorie, 4. Auflage, Springer Verlag 1998. [BE01] Albrecht Beutelspacher: Moderne Verfahren der Kryptographie. 4. Auflage, Vieweg Verlag 2001. [RS62] Rosser and Schoenfeld: “Approximate Formulas for some functions of prime numbers”. Illinois Journal of Mathematics 6:64–94, 1962. [YA02] Song Y. Yan: Number theory for computing, 2. Auflage. Springer, 2002. [WA06] Rolf Wanka: Approximationsalgorithmen. Eine Einführung (Leitfäden u. Monographien der Informatik). 1. Auflage, Teubner 2006.