Primzahlen: Unterschied zwischen den Versionen
K (→Ablauf) |
|||
(53 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
=== Arten von Primzahlen === | === Arten von Primzahlen === | ||
− | Primzahlen werden aufgrund ihrer zahlentheoretischen Eigenschaften in verschiedene Kategorien | + | Primzahlen werden aufgrund ihrer zahlentheoretischen Eigenschaften in verschiedene Kategorien zusammengefasst. |
'''Primzahltupel''' | '''Primzahltupel''' | ||
− | Jedes Paar ( | + | Jedes Paar <math>( p_1 , p_2 ) </math>aus zwei Primzahlen <math>p_1</math> und <math>p_2</math> mit der Differenz 2 wird [[Primzahlzwillinge|''Primzahlzwilling'']] genannt. Sie haben also die Form <math>(p,p+2)</math>. Ein Paar aus drei Primzahlen, die den Abstand von 2 haben wird hingegen als ''Primzahldrilling'' bezeichnet und hat die Form <math>(p,p+2,p+4)</math>. Nur das Paar <math>(3,5,7)</math> ist ein Primzahldrilling, da unter drei aufeinanderfolgenden ungerade Zahlen stets eine durch 3 teilbar ist. Diese Definition lässt sich auf ''Primzahltupel'' erweitern, die weitere Bezeichnungen einschließt wie Primzahlvierlinge oder Primzahlcousins. Die Paare mit Abstand 6 werden als ''sexy Primzahlen'' bezeichnet werden. |
− | ''' | + | '''Mersenne-Primzahlen''' |
− | Ist <math> p \in P </math> und hat die Form <math>2^{n -1 | + | Ist <math> p \in \mathbb{P}</math> und hat die Form <math>2^{q}-1 </math> für <math>q \in \mathbb{P} </math> so wird <math>p</math> als Mersenne-Primzahl bezeichnet. Diese sind Sonderfälle von Mersenne-Zahelen, welche die Form <math>2^{n}-1 </math> haben, für <math> n \in \mathbb{N}</math>. |
+ | Der Name geht auf den französischen Theologen und Mathematiker Marin Mersenne (8.8.1588 bis 1.8.1648) zurück. | ||
+ | |||
+ | Dabei ist zu beachten, dass <math> q \in \mathbb{P} </math> wieder eine Primzahl ist und dass nicht alle Zahlen der Form <math> 2^{p}-1 </math> Primzahlen sind. Ein konkretes Beispiel für einen solchen Fall ist die Zahl <math>2^{11}-1 = 2047</math>, welche sich auch als <math> 23*89 </math> darstellen lässt und somit keine Primzahl ist. <ref>http://www.mathe.tu-freiberg.de/~hebisch/cafe/mersenneprim.html</ref><ref>https://www.mathematik.de/dmv-blog/163-der-moench-mersenne-und-die-primzahlen</ref> | ||
+ | |||
+ | Mersenne-Primzahlen lassen sich im Binärsystem als Folge von Einsen schreiben. So hat Beispielsweise <math> 2^{19}-1 = 524.287 </math> im Binärsystem die Form <math> 1111111111111111111_2 </math> | ||
+ | Gegenwärtig sind viele der größten bekannten Primzahlen solche Mersenne-Primzahlen, da durch den [[Primzahlen#Lucas-Lehmer Test|Lucas-Lehmer Test]] Zahlen der Form <math>2^{n}-1</math> verhältnismäßig effizient auf die Primzahleigenschaft überprüft werden können. | ||
'''Sophie-Germain Primzahlen''' | '''Sophie-Germain Primzahlen''' | ||
− | Gilt für eine Primzahl p, dass auch 2p+1 eine Primzahl ist, so wird p Sophie-Germain Primzahl genannt und 2p+1 sichere Primzahl | + | Gilt für eine Primzahl <math>p</math>, dass auch <math>2p+1</math> eine Primzahl ist, so wird <math>p</math> Sophie-Germain Primzahl genannt und <math>2p+1</math> wird sichere Primzahl genannt. |
'''Fermat Primzahlen''' | '''Fermat Primzahlen''' | ||
− | Primzahlen | + | Primzahlen der folgenden Form werden Fermat Primzahlen genannt. |
+ | : <math> p = 2^{2^n} + 1</math> | ||
+ | mit einer ganzen Zahl <math>n \ge 0</math>. | ||
'''Ramanujan Primzahl''' | '''Ramanujan Primzahl''' | ||
− | '''Größte berechnete | + | Ramanujan-Primzahlen <math>R_n</math> sind als kleinste Zahlen definiert, so dass für alle <math>x \geq R_n</math> zwischen <math> x</math> und <math>\tfrac {x}{2}</math> mindestens <math>n</math> Primzahlen liegen. |
+ | |||
+ | Zum Beispiel ist für <math> n = 1 </math> die Ramanujan Primzahl <math>R_1 </math> gleich <math>2</math>. Diesen Fall ist äquivalent zum [https://de.wikipedia.org/wiki/Bertrandsches_Postulat Bertrandschen Postulat]. | ||
+ | |||
+ | '''Größte berechnete Primzahl''' | ||
− | + | Im Jahr 2018 hat das Team um Patrick Laroche die errechnet, dass <math> 2^{82.589.933}-1 </math> eine Primzahl ist. Diese Zahl hat 24.862.048 Stellen.<ref>https://www.mersenne.org/primes/</ref> | |
== Satz von Euklid== | == Satz von Euklid== | ||
− | Im Jahr 300 v.u.Z hat Euklid von Alexandria bewiesen, dass es unendlich viele Primzahlen gibt. | + | Im Jahr 300 v.u.Z. hat Euklid von Alexandria bewiesen, dass es unendlich viele Primzahlen gibt. |
+ | |||
+ | In seinem Beweis durch Widerspruch trifft er die Annahme, dass es nur endlich viele Primzahlen gibt. Danach definiert er eine neue Zahl die eine neue Primzahl als Teiler hat oder welche selbst Primzahl ist. Somit erhalten wir einen Widerspruch und es kann keine endliche Menge aller Primzahlen geben. Es wurden mittlerweile dutzende weitere Beweise veröffentlicht<ref>https://de.wikipedia.org/wiki/Satz_des_Euklid</ref>. | ||
== Primzahlsatz== | == Primzahlsatz== | ||
− | Ein wichtiger Teil der Arbeiten zu Primzahlen beschäftigt sich mit der Verteilung dieser. | + | Ein wichtiger Teil der Arbeiten zu Primzahlen beschäftigt sich mit der Verteilung dieser. Hierfzu definieren wir zunächst die Primzahlfunktion, welche uns die Anzahl der Primzahlen bis zu gegebener Größe wiedergibt, und werden dann weitere Eigenschaften dieser Funktion festhalten. |
=== Die Primzahlfunktion === | === Die Primzahlfunktion === | ||
− | Diese Funktion ist für beliebige <math>x \in R </math> definiert und gibt die Anzahl der Primzahlen an, die nicht größer als <math>x</math> sind. | + | Diese Funktion ist für beliebige <math>x \in \mathbb{R} </math> definiert und gibt die Anzahl der Primzahlen an, die nicht größer als <math>x</math> sind. |
: <math>\pi (x) := \left | \{p \in \mathbb{P} \mid p \le x\} \right |</math> | : <math>\pi (x) := \left | \{p \in \mathbb{P} \mid p \le x\} \right |</math> | ||
Zeile 43: | Zeile 57: | ||
| style="text-align:center;" |[[Datei:Pi(x)plot.png|alternativtext=|zentriert|mini|300x300px]] | | style="text-align:center;" |[[Datei:Pi(x)plot.png|alternativtext=|zentriert|mini|300x300px]] | ||
| style="text-align:left;" |<big>'''<u>Die Primzahlfunktion</u>:'''</big> | | style="text-align:left;" |<big>'''<u>Die Primzahlfunktion</u>:'''</big> | ||
− | In der Graphik ist die | + | In der Graphik ist die Funktion bis zu einem Wert von 200 zu sehen. |
|} | |} | ||
− | Diese Funktion | + | Diese Funktion war auch ein zentrales Untersuchungsobjekt für Bertrand Riemann in seiner Arbeit über die Anzahl der Primzahlen unter einer gegebenen Größe in der er die [[Riemannsche Vermutung]] formuliert. |
=== Der Primzahlsatz === | === Der Primzahlsatz === | ||
− | Die Urfassung des Primzahlsatzes geht auf Gauß zurück, | + | Die Urfassung des Primzahlsatzes geht auf Gauß zurück, welche er im Alter von 15 Jahren, im Jahre 1792, formulierte. |
Sei <math>\displaystyle \mathrm{Li}(x):=\int _{2}^{x}{\frac { \mathrm{d}t }{\ln {t}} } </math> der Integrallogarithmus. Dann gilt <math>\displaystyle \lim _{{x\to \infty }}{\frac {\pi (x)}{\mathrm{Li(x)}}}=1 </math> | Sei <math>\displaystyle \mathrm{Li}(x):=\int _{2}^{x}{\frac { \mathrm{d}t }{\ln {t}} } </math> der Integrallogarithmus. Dann gilt <math>\displaystyle \lim _{{x\to \infty }}{\frac {\pi (x)}{\mathrm{Li(x)}}}=1 </math> | ||
− | Diese Eigenschaft wird als asymptotisch äquivalent bezeichnet und | + | Diese Eigenschaft wird als asymptotisch äquivalent bezeichnet und man schreibt |
:<math>\displaystyle \pi (x) \sim \mathrm{Li(x)} </math> | :<math>\displaystyle \pi (x) \sim \mathrm{Li(x)} </math> | ||
Zeile 59: | Zeile 73: | ||
Es kann gezeigt werden, dass gilt: | Es kann gezeigt werden, dass gilt: | ||
:<math>\displaystyle Li(x) \sim \frac {x}{\ln(x)} </math> | :<math>\displaystyle Li(x) \sim \frac {x}{\ln(x)} </math> | ||
− | So formulieren wir den | + | So formulieren wir den Primzahlsatz, wie er in den meisten Werken zu finden ist. |
:<math>\displaystyle \pi (x) \sim \frac{x}{\ln {x}} </math> | :<math>\displaystyle \pi (x) \sim \frac{x}{\ln {x}} </math> | ||
Zeile 70: | Zeile 84: | ||
|- | |- | ||
| style="text-align:center;" |[[Datei:Lix.png|alternativtext=|zentriert|mini|300x300px]] | | style="text-align:center;" |[[Datei:Lix.png|alternativtext=|zentriert|mini|300x300px]] | ||
− | | style="text-align:left;" |<big>'''<u>Primzahlfunktion, Integrallogarithmusfunktion und x/ | + | | style="text-align:left;" |<big>'''<u>Primzahlfunktion, Integrallogarithmusfunktion und x/ln(x)</u>:'''</big> |
− | Alle drei Funktionen sind im Verlauf bis 200 abgebildet. Die Primzahlfunktion scheint hierbei von den anderen beiden Funktionen eingeschnürrt | + | Alle drei Funktionen sind im Verlauf bis 200 abgebildet. Die Primzahlfunktion scheint hierbei von den anderen beiden Funktionen eingeschnürrt zu werden. Die Integrallogarithmusfunktion scheint insbesondere die Primzahlfunktion immer zu überschätzen. Der Mathematiker John Littlewood bewies aber 1913, dass <math> Li(x) </math> an einem bestimmten Wert x die Primzahlfunktion unterschreiten muss. Stanley Skewes konnte zeigen, dass dies unter dem Wert <math>10^{10^{10^{34}}}</math> passieren muss. Diese Zahl ist als Skewes-Zahl bekannt. |
|} | |} | ||
− | Der Mathematiker Hans von Mangoldt konnte im Jahre 1895 beweisen, dass der Primzahlsatz äquivalent dazu ist, dass die Riemannsche Zeta-Funktion keine Nullstellen hat bei Funktionswerten mit Realteil 1. | + | Der Mathematiker Hans von Mangoldt konnte im Jahre 1895 beweisen, dass der Primzahlsatz äquivalent dazu ist, dass die [[Riemannsche Vermutung|Riemannsche Zeta-Funktion]] keine Nullstellen hat bei Funktionswerten mit Realteil 1. |
+ | == Primfaktorzerlegung == | ||
+ | Es ist möglich jede natürliche Zahl eindeutig als Produkt von sogenannten <b> Primfaktoren </b> <ref>https://de.wikipedia.org/wiki/Primfaktorzerlegung</ref> darzustellen. | ||
+ | |||
+ | === Definition === | ||
+ | *Eine Zahl <math> p </math> heißt ''Primfaktor'' einer natürlichen Zahl <math> n </math>, wenn | ||
+ | ** <math> n </math> durch <math> p </math> ganzzahlig ohne Rest geteilt wird und | ||
+ | ** <math> p </math> eine Primzahl ist. | ||
+ | *Die Darstellung einer natürlichen Zahl <math> n </math> als Produkt ihrer Primfaktoren nennt man ''Primfaktorzerlegung''. | ||
+ | |||
+ | === Eigenschaften === | ||
+ | * Eine Primfaktorzerlegung ist bis auf die Reihenfolge der Primfaktoren eindeutig. | ||
+ | * Da 1 keine Primzahl ist, ist die Primfaktorlzerlegung von 1 ein leeres Produkt. | ||
+ | * Der gleiche Primfaktor kann mehrmals in einer Primfaktorzerlegung vorkommen. | ||
+ | * Es gibt kein effizientes Verfahren, die Primfaktorzerlegung einer Zahl zu bestimmen. | ||
+ | * Für Zahlen mit sehr großen Primfaktoren ist es ein enormer Aufwand die Primfaktorzerlegung zu bestimmen. | ||
+ | * Wählt man die Primfaktoren groß genug, so benötigen sogar Hochleistungsrechner mehrere Jahre, um die Primfaktorzerlegung zu bestimmen. | ||
− | |||
− | |||
− | |||
− | + | === Beispiele === | |
+ | \[ 6 = 2 \cdot 3 \] | ||
+ | \[ 7 = 7 \] | ||
+ | \[ 1003 = 17 \cdot 59 \] | ||
+ | \[ 94684 = 2 \cdot 2 \cdot 23671 \] | ||
==Primzahltests== | ==Primzahltests== | ||
− | === Sieb des Eratosthenes === | + | === <u>Sieb des Eratosthenes</u> === |
− | Das Sieb des Eratosthenes ist eines der ältesten Verfahren zur Bestimmung aller Primzahlen, bis hin zu einer frei wählbaren oberen Grenze. Das Verfahren ist nach dem griechischen Mathematiker Eratosthenes von Kyrene (ca. 276 v. | + | Das Sieb des Eratosthenes ist eines der ältesten Verfahren zur Bestimmung aller Primzahlen, bis hin zu einer frei wählbaren oberen Grenze. Das Verfahren ist nach dem griechischen Mathematiker Eratosthenes von Kyrene (ca. 276 v.u.Z., † ca. 194 v.u.Z.) benannt. Konzeptionell arbeitet das Verfahren auf einer Liste aller Zahlen, beginnend mit der 2 bis hin zu der oberen Grenze N. Anschließend werden nacheinander alle Zahlen in dieser Liste betrachtet. Ist die betrachtete Zahl nicht markiert, so ist sie eine Primzahl und alle ihre Vielfachen können gestrichen werden. Ist die Zahl bereits markiert, kann man zur nächsten weitergehen. So werden nacheinander alle Primzahlen aus der Liste "herausgesiebt". |
− | ==== Ablauf des Algorithmus ==== | + | ==== <u>Ablauf des Algorithmus</u> ==== |
# Wähle eine obere Grenze N, bis zu der alle Primzahlen bestimmt werden sollen. | # Wähle eine obere Grenze N, bis zu der alle Primzahlen bestimmt werden sollen. | ||
# Schreibe alle natürlichen Zahlen von 2 bis N auf (um das Ganze anschaulicher zu machen ordnet man die Zahlen meist in einem rechteckigen Schema an, wobei hier die Vielfachen von 10 am Ender einer Reihe stehen). Im Folgenden werden alle Zahlen die keine Primzahlen sind gestrichen. | # Schreibe alle natürlichen Zahlen von 2 bis N auf (um das Ganze anschaulicher zu machen ordnet man die Zahlen meist in einem rechteckigen Schema an, wobei hier die Vielfachen von 10 am Ender einer Reihe stehen). Im Folgenden werden alle Zahlen die keine Primzahlen sind gestrichen. | ||
# Begonnen wird mit der 2. Die 2 selbst ist eine Primzahl, es können aber alle Vielfachen von 2 gestrichen werden, da sie selbst keine Primzahlen sind. | # Begonnen wird mit der 2. Die 2 selbst ist eine Primzahl, es können aber alle Vielfachen von 2 gestrichen werden, da sie selbst keine Primzahlen sind. | ||
− | # Die nächste nicht gestrichene Zahl ist die Primzahl 3. Wieder können alle Vielfachen von 3 gestrichen werden. Begonnen werden kann hier mit der | + | # Die nächste nicht gestrichene Zahl ist die Primzahl 3. Wieder können alle Vielfachen von 3 gestrichen werden. Begonnen werden kann hier mit der 9, da die 6 bereits als ein Vielfaches von 2 gestrichen wurde. |
# Die 4 wurde bereits im 2. Schritt gestrichen und die nächste Zahl kann betrachtet werden. | # Die 4 wurde bereits im 2. Schritt gestrichen und die nächste Zahl kann betrachtet werden. | ||
− | # Dieses Vorgehen wird mit allen folgenden Zahlen wiederholt. Ist eine Zahl noch nicht gestrichen worden, wenn man sie betrachtet, so ist sie eine Primzahl und ihre Vielfachen können gestrichen werden. Andernfalls kann die nächste Zahl betrachtet werden | + | # Dieses Vorgehen wird mit allen folgenden Zahlen wiederholt, bis die Quadratwurzel von N erreicht wurde. Ist eine Zahl noch nicht gestrichen worden, wenn man sie betrachtet, so ist sie eine Primzahl und ihre Vielfachen können gestrichen werden. Andernfalls kann die nächste Zahl betrachtet werden. |
− | |||
− | Der Algorithmus selbst ist recht Intuitiv und leicht | + | Der Algorithmus selbst ist recht Intuitiv und leicht nachzuvollziehen. Auch erklärt sich durch den Algorithmus, wie der Name "Sieb des Eratosthenes" zu stande kommt. |
− | + | Wer sich anchschauen möchte, wie der Algorithmus in C++ aussieht, findet hier eine Implementierung.<pre> | |
− | <pre> | ||
#include <iostream> | #include <iostream> | ||
+ | #include <cmath> | ||
int main(int argc, const char** argv) { | int main(int argc, const char** argv) { | ||
+ | // erstelle eine Liste der Laenge N. Zu Beginn sind keine Zahlen gestrichen was durch 'false' dargestellt wird | ||
const unsigned int N = 100; | const unsigned int N = 100; | ||
bool Liste[N] = { false }; | bool Liste[N] = { false }; | ||
− | // iteriere über alle Zahlen in der Liste | + | // iteriere über alle Zahlen in der Liste bis zur Wurzel von N |
− | for (int i = 2; i <= N; i++) { | + | for (int i = 2; i <= std::sqrt(N); i++) { |
// falls Index noch nicht gestrichen sind | // falls Index noch nicht gestrichen sind | ||
Zeile 128: | Zeile 159: | ||
} | } | ||
</pre> | </pre> | ||
+ | [[Datei:Demonstration- Sieb des Eratosthenes.mp4|zentriert|mini|553x553px|Eine beispielhafte Ausführung des Algorithmus für N=100]] | ||
+ | |||
+ | === <u>Lucas-Lehmer Test</u> === | ||
+ | Der Lucas-Lehmer-Test ist ein Verfahren um zu überprüfen, ob es sich bei einer gegebenen Mersenne-Zahl auch um eine Mersenne-Primzahl handelt. Der Test geht auf den französischen Mathematiker François Édouard Anatole Lucas (*4.4.1842, † 3.10.1891) zurück, wurde aber erst 1930 von dem US-Amerikanischen Mathematiker Derrick Henry Lehmer (* 23.2.1905, † 22.5.1991) entwickelt. | ||
+ | |||
+ | ==== <u>Ablauf</u> ==== | ||
+ | Der Lucas-Lehmer-Test verwendet die sogenannte Lucas-Folge. Diese ist definiert durch \[ L_{0} := 4 \\ L_{n+1} := (L_{n}^{2} - 2) Mod \ M_{p} \] Dabei ist <math> p \in \mathbb{P}\backslash \{2\} </math> und <math> M_p </math> die zu überprüfende Mersenne-Zahl. | ||
+ | |||
+ | Für <math> M_p </math> gilt: <math> M_p \in \mathbb{P} \Leftrightarrow L_{p-2} = 0</math> | ||
+ | <ref>https://www.youtube.com/watch?v=0Ynt9lgR5jQ</ref> | ||
+ | |||
+ | |||
+ | == Primzahlen in der Natur == | ||
+ | Es existieren Zikadenarten, die sich in einem festen Abstand von Jahren massenhaft über der Erde vermehren und danach wieder unter die Erde zurückkehren. In dieser Zeit sind sie weniger gut vor ihren Fressfeinden geschützt. Die Zikaden haben also einen Vorteil, wenn sie in Jahren über der Erde sind, in denen weniger Fressfeinde auftreten. Einige Zikadenarten nutzen genau diesen Vorteil: Sie vermehren sich im Abstand von 13 oder 17 Jahren über der Erde. | ||
+ | |||
+ | Was passiert also mit ihren Fressfeinden? Für solche, die ohnehin in jedem Jahr auftreten, ändert sich nichts. Allerdings gibt es auch solche, die selbst nur in gewissen Jahren auftreten. Beispielsweise existiert eine zikadenjagende Wespe, die alle zwei bis drei Jahre auftritt. Nehmen wir also eine Art an, die alle 2 Jahre auftritt. Würden sich die Zikaden alle 12 Jahre vermehren, so würde in jedem dieser Jahre auch die Wespenart auftreten und die Zikaden hätten es mit deutlich mehr Fressfeinden zu tun. Nun ist der Zyklus der Zikaden aber 13 Jahre lang. Sie müssen also nur alle 26 Jahre mit jener Wespenart fertig werden. Somit haben sie einen deutlichen Vorteil darin, sich zu vermehren<ref>[https://www.researchgate.net/profile/Eric_Goles/publication/255609248_A_Biological_Generator_of_Prime_Numbers/links/0f317537e232d3df02000000.pdf Goles, Eric; Schulz, Oliver; Markus, Mario (2000): A Biological Generator of Prime Numbers, Nonlinear Phenomena in Complex Systems 3:2 2008-2013]</ref>. | ||
+ | |||
== Primzahlen in der Kryptographie == | == Primzahlen in der Kryptographie == | ||
Die Tatsache, dass es bis heute keine effiziente Methode zum Zerlegen einer großen Zahl in ihre Primfaktoren gibt, ermöglicht einige Anwendungen in der Kryptographie. So verwenden einige Verfahren, die eine verschlüsselte Kommunikation gewährleisten, Primzahlen. Wie wichtig solche Verfahren sind, wird deutlich, wenn man sich ansieht, wobei diese benutzt werden. Das umfasst Anwendungen wie Emails, Chats und Internettelefonie, aber auch weitaus sensiblere Daten, wie beispielsweise beim Onlinebanking. | Die Tatsache, dass es bis heute keine effiziente Methode zum Zerlegen einer großen Zahl in ihre Primfaktoren gibt, ermöglicht einige Anwendungen in der Kryptographie. So verwenden einige Verfahren, die eine verschlüsselte Kommunikation gewährleisten, Primzahlen. Wie wichtig solche Verfahren sind, wird deutlich, wenn man sich ansieht, wobei diese benutzt werden. Das umfasst Anwendungen wie Emails, Chats und Internettelefonie, aber auch weitaus sensiblere Daten, wie beispielsweise beim Onlinebanking. | ||
Zeile 135: | Zeile 183: | ||
==== Public-key System ==== | ==== Public-key System ==== | ||
+ | [[Datei:RSA.png|mini]] | ||
Bei einem Public-key System besitzt jeder Anwender sein eigenes Schlüsselpaar aus privatem und öffentlichen Schlüssel und somit auch sein eigenes Ver- und Entschlüsselungsverfahren. Dabei wird der geheime Schlüssel vom Anwender geheimgehalten, während der öffentliche Schlüssel an alle anderen Anwender, mit denen kommuniziert wird, verteilt wird. <br> | Bei einem Public-key System besitzt jeder Anwender sein eigenes Schlüsselpaar aus privatem und öffentlichen Schlüssel und somit auch sein eigenes Ver- und Entschlüsselungsverfahren. Dabei wird der geheime Schlüssel vom Anwender geheimgehalten, während der öffentliche Schlüssel an alle anderen Anwender, mit denen kommuniziert wird, verteilt wird. <br> | ||
− | Der Verschlüsselungsprozess wird mit <math> D </math> bezeichnet, der Entschlüsselungsprozess mit <math> E </math>. Ein Schlüsselpaar besteht aus zwei Zahlen. Dabei gelten für eine Nachricht im Klartext M die folgenden Eigenschaften: | + | Der Verschlüsselungsprozess wird mit <math> D </math> bezeichnet, der Entschlüsselungsprozess mit <math> E </math>. Dabei steht <math> D </math> für '''D'''ecryption und <math> E </math> für '''E'''ncryption. Ein Schlüsselpaar besteht aus zwei Zahlen. Dabei gelten für eine Nachricht im Klartext <math>M</math> die folgenden Eigenschaften: |
<ol style="list-style-type:lower-alpha"> | <ol style="list-style-type:lower-alpha"> | ||
<li><math> D(E(M)) = M </math></li> | <li><math> D(E(M)) = M </math></li> | ||
<li><math> E(D(M)) = M </math></li> | <li><math> E(D(M)) = M </math></li> | ||
− | <li>E und D sind für sich genommen leicht zu berechnen</li> | + | <li><math>E</math> und <math>D</math> sind für sich genommen leicht zu berechnen</li> |
− | <li>E kann aus D nicht einfach berechnet werden</li> | + | <li><math>E</math> kann aus <math>D</math> nicht einfach berechnet werden</li> |
</ol> | </ol> | ||
− | Ein Entschlüsselungsprozess <math> E </math> heißt trap-door one-way function, wenn er die Eigenschaften a, c und d erfüllt. Handelt es sich außerdem um einen Prozess, der b erfüllt, so wird daraus eine trap-door one-way permutation. Dann ist jeder Geheimtext eine potenzielle Nachricht und jede Nachricht ein potenzieller Geheimtext.<br> | + | Ein Entschlüsselungsprozess <math> E </math> heißt ''trap-door one-way function'', wenn er die Eigenschaften a, c und d erfüllt. Handelt es sich außerdem um einen Prozess, der b erfüllt, so wird daraus eine ''trap-door one-way permutation''. Dann ist jeder Geheimtext eine potenzielle Nachricht und jede Nachricht ein potenzieller Geheimtext.<br> |
− | Betrachten wir nun das Konzept des RSA-Verfahrens an einem Beispiel. Im Folgenden möchte Felix | + | Betrachten wir nun das Konzept des RSA-Verfahrens an einem Beispiel. Im Folgenden möchte Felix eine Nachricht an Ari schicken. Dementsprechend besitzt Felix die Schlüsselverfahren <math> D_F </math> und <math> E_F </math>, Ari entsprechend <math> D_A </math> und <math> E_A </math>.<br> |
− | Wie sieht nun der Nachrichtenaustausch aus? Zuallererst müssen Felix und Ari ihre öffentlichen Schlüssel austauschen. Somit erhält Ari die Möglichkeit <math> | + | Wie sieht nun der Nachrichtenaustausch aus? Zuallererst müssen Felix und Ari ihre öffentlichen Schlüssel austauschen. Somit erhält Ari die Möglichkeit <math> D_F </math> durchzuführen, Felix <math> D_A </math>. <br> |
− | Nun führt Felix auf seiner Nachricht <math> | + | Nun führt Felix auf seiner Nachricht <math> D_A </math> aus. Er nutzt also den öffentlichen Schlüssel von Ari und versendet dann die Nachricht. Bekommt Ari nun die verschlüsselte Nachricht, so kann er sie mit <math> E_A </math> entschlüsseln. Da nur er seinen privaten Schlüssel hat, kann auch niemand anderes die Nachricht entschlüsseln und lesen. Für die Antwort nutzt Ari dann <math> D_F </math> für die Verschlüsselung. |
=== Die Mathematik dahinter === | === Die Mathematik dahinter === | ||
==== Die Nachricht ==== | ==== Die Nachricht ==== | ||
− | Die Nachricht M selbst wird als positive ganze Zahl zwischen 0 und <math> n-1 </math> kodiert, damit man leicht mit ihr rechnen kann. Wie groß <math> n </math> ist, hängt vom einzelnen Schlüsselpaar ab. Ist die Nachricht zu groß, so wird sie in einzelne Blöcke aufgeteilt und jeder Block einzeln betrachtet. Eine mögliche Umwandlung von Buchstaben in Zahlen ist beispielsweise das ASCII-Format | + | Die Nachricht <math>M</math> selbst wird als positive ganze Zahl zwischen <math>0</math> und <math> n-1 </math> kodiert, damit man leicht mit ihr rechnen kann. Wie groß <math> n </math> ist, hängt vom einzelnen Schlüsselpaar ab. Betrachtet man ein realistisches Szenario, so gilt <math> n \geq 10.000 </math>, wobei <math> n </math> meist noch um einiges größer als dieser Wert ist. Ist die Nachricht zu groß, so wird sie in einzelne Blöcke aufgeteilt und jeder Block einzeln betrachtet. Eine mögliche Umwandlung von Buchstaben in Zahlen ist beispielsweise das [https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange ASCII-Format]. |
==== Die Schlüsselpaare ==== | ==== Die Schlüsselpaare ==== | ||
− | Jeder der beiden Schlüssel besteht aus einem Tupel. | + | Jeder der beiden Schlüssel besteht aus einem Tupel. Wir bezeichnen den zu <math> E </math> gehörenden privaten Schlüssel mit <math> P </math> und den zu <math> D </math> gehörenden öffentlichen Schlüssel mit <math> O </math>. |
− | \[ | + | \[ P = (e,n) \hspace{2cm} O = (d,n) \ \text{ wobei }e, d \text{ positive ganze Zahlen sind.} \] |
− | Dabei gilt für den Ver- und Entschlüsselungsprozess eines Klartextes M und eines Geheimtextes C | + | Dabei gilt für den Ver- und Entschlüsselungsprozess eines Klartextes <math>M</math> und eines Geheimtextes <math>C</math> |
− | * <math> C \equiv | + | * <math> C \equiv D(M) \equiv M^d \text{ mod } n </math> |
− | * <math> M \equiv | + | * <math> M \equiv E(C) \equiv C^e \text{ mod } n </math> |
− | ==== | + | ==== Erzeugen der Schlüssel ==== |
− | # Zwei zufällige große Primzahlen <math p </math> und <math> q </math> auswählen. Diese sollten in der Realität mehrere hundert Stellen haben. | + | # Zwei zufällige große Primzahlen <math> p</math> und <math> q </math> auswählen. Diese sollten in der Realität mehrere hundert Stellen haben. |
− | # | + | #: Setze nun <math> n = p \cdot q </math>. Weil <math> p </math> und <math> q </math> so groß sind, ist es nicht in realistischem Zeitaufwand möglich, aus <math> n </math> wieder <math> p </math> und <math> q </math> zu berechnen. |
− | + | # Eine zufällige ganze Zahl <math> d </math> wählen, die folgende Bedingung erfüllt | |
− | # Eine zufällige ganze Zahl d wählen, die folgende Bedingung erfüllt | + | #: <math> \text{ggT}(d, (q-1) \cdot (p-1)) = 1</math> |
− | # | + | #: <math>\text{ggT}</math> bezeichnet dabei den [[Der Satz von Euler-Fermat#ggT | größten gemeinsamen Teiler]], <math>d</math> und <math> (q-1) \cdot (p-1)</math> müssen also teilerfremd sein. |
− | # | + | # <math> e </math> aus <math> d </math> bestimmen |
− | + | #: <math> \ e \cdot d = 1 (\text{ mod } \varphi(n))</math> | |
− | # e aus d bestimmen | + | #: <math> \varphi(n)</math> bezeichnet die [[Der Satz von Euler-Fermat#ggT | Eulersche <math> \varphi</math>-Funktion]] |
− | \ | ||
− | # | ||
==== Warum funktioniert das? ==== | ==== Warum funktioniert das? ==== | ||
+ | Nun gilt noch zu beweisen, dass dieses Verfahren für (fast) alle Nachrichten <math> M </math> funktioniert. | ||
+ | |||
+ | Zuerst betrachten wir <math> \varphi(n) </math>. Da für eine beliebige Primzahl <math> m </math> gilt: | ||
+ | \[ \varphi(m) = m-1 \] | ||
+ | und <math> \varphi </math> multiplikativ für teilerfremde Zahlen ist, folgt für <math> n </math> : | ||
+ | \[ \varphi(n) = \varphi(p \cdot q) = (p-1) \cdot (q-1) = n - (p+q) + 1 \] | ||
+ | |||
+ | Wie hängt nun <math> \varphi(n) </math> mit <math> e </math> und <math> d </math> zusammen? <br> | ||
+ | Da <math> d </math> teilerfremd zu <math> \varphi(n) </math> ist, existiert ein multiplikatives Inverses <math> e </math> im Ring <math> \mathbb{Z}/\varphi(n)\mathbb{Z} </math>: | ||
+ | \[ e \cdot d \equiv 1 (\text{mod} \ \varphi(n)) \] | ||
+ | |||
+ | Bisher gilt für den Ver- und Entschlüsselungsprozess | ||
+ | \[ D(E(M)) \equiv (E(M))^d \ (\text{mod} \ n) \equiv (M^e)^d \ (\text{mod} \ n) = M ^{e\cdot d} \ (\text{mod }n) \] | ||
+ | und analog | ||
+ | \[ E(D(M)) \equiv (D(M))^e \ (\text{mod} \ n) \equiv (M^d)^e \ (\text{mod} \ n) = M ^{e\cdot d} \ (\text{mod }n) \] | ||
+ | |||
+ | Außerdem existiert eine ganze Zahl <math> k </math>, für die gilt: | ||
+ | \[ M^{e\cdot d} \equiv M^{k\cdot \varphi(n) + 1} \ (\text{mod }n) \] | ||
+ | |||
+ | Nun gilt es noch zu zeigen, dass für alle <math> M </math> gilt: <math> M^{e\cdot d} = M \ (\text{mod }n) </math> <br> | ||
+ | Hierzu werden <math> p </math> und <math> q </math> getrennt betrachtet. Dies ist nach dem [https://de.wikipedia.org/wiki/Chinesischer_Restsatz chinesischen Restsatz] möglich, auf den wir hier nicht näher eingehen werden.<br> | ||
+ | Betrachten wir <math> M^{e\cdot d} = M \ (\text{mod }p) </math>, so gilt: | ||
+ | # Falls <math> M = 0\ (\text{mod }p)</math>, dann ist <math> M </math> ein Vielfaches von <math> p </math>. Dann gilt: <math> M^{e\cdot d} = 0 = M \ (\text{mod }p) </math> | ||
+ | # Falls <math> M \not = 0\ (\text{mod }p)</math>, dann gilt nach dem [[Der Satz von Euler-Fermat | Satz von Euler-Fermat]]<br> | ||
+ | <math> M^{ed} = M^{ed-1} M = M^{k(p-1)}M = (M^{p-1})^kM = 1^kM = M (\text{mod } p) </math> <br> | ||
+ | |||
+ | |||
+ | Betrachten wir <math> M^{e\cdot d} = M \ (\text{mod }q) </math>, so gilt analog: | ||
+ | # Falls <math> M = 0\ (\text{mod }q)</math>, dann ist <math> M </math> ein Vielfaches von <math> q </math>. Dann gilt: <math> M^{e \cdot d} = 0 = M \ (\text{mod }q) </math> | ||
+ | # Falls <math> M \not = 0\ (\text{mod }q)</math>, dann gilt nach dem [[Der Satz von Euler-Fermat | Satz von Euler-Fermat]]<br> | ||
+ | <math> M^{ed} = M^{ed-1} M = M^{k(q-1)}M = (M^{q-1})^kM = 1^kM = M (\text{mod } q) </math> <br> | ||
+ | |||
+ | Da die Bedingung für beide Faktoren gezeigt wurde, gilt <math> M^{e\cdot d} = M \ (\text{mod }n)</math> nach dem chinesischen Restsatz auch für <math> n = pq </math>. | ||
+ | <ref>https://en.wikipedia.org/wiki/RSA_(cryptosystem)</ref> | ||
+ | <ref>http://people.csail.mit.edu/rivest/Rsapaper.pdf</ref> | ||
+ | === Einfaches Beispiel === | ||
+ | ==== Teil 1: Schlüssel generieren ==== | ||
+ | # Wir wählen zwei Primzahlen <math> p = 7, \ q = 11 </math> | ||
+ | # Dann gilt <math> n = pq = 77 </math> | ||
+ | # Wir wählen eine ganze Zahl <math> e = 29 </math>, wobei <math> p-1 = 6 </math> und <math> q-1 = 10 </math> teilerfremd zu <math> e </math> sind. | ||
+ | # Der öffentliche Schlüssel ist dann <math> O=(d,n) = (29, 77)</math> | ||
+ | # <math> \varphi(77) = (p-1) (q-1) = 6 \cdot 10 = 60 </math> | ||
+ | # Für <math> d </math> soll gelten: <math> ed + k \cdot \varphi(n) = 1</math>, also <math> 29\cdot d + k \cdot 60 = 1 </math> für ein <math> k \ \in \mathbb{Z}</math>. Somit ist <math> d=29 </math> und <math> k = -14</math. Somit ist der private Schlüssel <math> P=(e,n) = (29,77)</math>. | ||
+ | Wählt man deutlich größere Primzahlen <math> p </math> und <math> q </math>, so ist die Berechnung von <math> e </math> aus <math> d </math> oder andersherum ohne die Kenntnis von <math> p </math> und <math> q </math> sogar für Computer zu aufwendig. | ||
+ | ==== Teil 2: Die Verschlüsselung ==== | ||
+ | Felix möchte die Zahl 13 verschlüsseln und an Ari senden. Hierzu rechnet er: | ||
+ | \[ C = 13^{29}\ (\text{mod } 77) = 6 \] | ||
+ | Diese 6 schickt Felix nun als Geheimtext an Ari. | ||
+ | ==== Teil 3: Die Entschlüsselung ==== | ||
+ | Ari rechnet nun: | ||
+ | \[ M = 6^{29}\ (\text{mod } 77) = 13 \] | ||
+ | Und erhält somit wieder die 13 als Klartext.[[Datei:RSA Signatur.png|mini]] | ||
=== Signatures === | === Signatures === | ||
− | Zwar schützt dieses Verfahren soweit vor fremden | + | [[Datei:Signatur.png|links|mini]]Zwar schützt dieses Verfahren soweit vor fremden Mitlesern, aber es ist immernoch möglich, falsche Nachrichten im Namen von Felix zu versenden. Nehmen wir an, Johanna möchte Ari im Namen von Felix eine Nachricht senden. Mit dem bisherigen Verfahren kann Johanna ebenso Aris öffentlichen Schlüssel verwenden und Ari kann sich nicht sicher sein, ob die Nachricht tatsächlich von Felix stammt oder nicht. <br> |
− | Um dieses Problem zu lösen, wird die Eigenschaft b genutzt. Einer Nachricht wird eine Signatur angehängt, die mit dem privaten Schlüssel ver- und mit dem öffentlichen Schlüssel entschlüsselt wird. Will also Felix nun Ari eine Nachricht schicken, so verschlüsselt er zuerst nur die Signatur mit seinem privaten Schlüssel, dann die ganze Nachricht mit Aris öffentlichem Schlüssel. Für die verschlüsselte Nachricht <math> C </math> ergibt sich also | + | Um dieses Problem zu lösen, wird die Eigenschaft b des Public-key Systems genutzt. Einer Nachricht wird eine Signatur angehängt, die mit dem privaten Schlüssel ver- und mit dem öffentlichen Schlüssel entschlüsselt wird. Will also Felix nun Ari eine Nachricht schicken, so verschlüsselt er zuerst nur die Signatur mit seinem privaten Schlüssel, dann die ganze Nachricht mit Aris öffentlichem Schlüssel. Für die verschlüsselte Nachricht <math> C </math> ergibt sich also |
\[ C = E_A(D_F(M)) \] | \[ C = E_A(D_F(M)) \] | ||
Zeile 200: | Zeile 299: | ||
Nun kann Ari anhand der Signatur erkennen, ob die Nachricht von Felix stammt, denn nur wenn der korrekte private Schlüssel verwendet wurde, ist die Signatur nun korrekt. | Nun kann Ari anhand der Signatur erkennen, ob die Nachricht von Felix stammt, denn nur wenn der korrekte private Schlüssel verwendet wurde, ist die Signatur nun korrekt. | ||
+ | == Quellen == | ||
+ | <references /> | ||
− | == | + | ==Autoren== |
− | Johanna Riedel, Felix Elser,Arianit Miftari | + | Johanna Riedel, Felix Elser, Arianit Miftari |
− | |||
− | |||
− | |||
− |
Aktuelle Version vom 15. April 2021, 16:22 Uhr
Definition
Sei [math] p \in \mathbb{N} [/math]. Hat p genau zwei Teiler so wird p Primzahl genannt. Wir bezeichnen [math]\mathbb P[/math] als die Menge aller Primzahlen.
Arten von Primzahlen
Primzahlen werden aufgrund ihrer zahlentheoretischen Eigenschaften in verschiedene Kategorien zusammengefasst.
Primzahltupel
Jedes Paar [math]( p_1 , p_2 ) [/math]aus zwei Primzahlen [math]p_1[/math] und [math]p_2[/math] mit der Differenz 2 wird Primzahlzwilling genannt. Sie haben also die Form [math](p,p+2)[/math]. Ein Paar aus drei Primzahlen, die den Abstand von 2 haben wird hingegen als Primzahldrilling bezeichnet und hat die Form [math](p,p+2,p+4)[/math]. Nur das Paar [math](3,5,7)[/math] ist ein Primzahldrilling, da unter drei aufeinanderfolgenden ungerade Zahlen stets eine durch 3 teilbar ist. Diese Definition lässt sich auf Primzahltupel erweitern, die weitere Bezeichnungen einschließt wie Primzahlvierlinge oder Primzahlcousins. Die Paare mit Abstand 6 werden als sexy Primzahlen bezeichnet werden.
Mersenne-Primzahlen
Ist [math] p \in \mathbb{P}[/math] und hat die Form [math]2^{q}-1 [/math] für [math]q \in \mathbb{P} [/math] so wird [math]p[/math] als Mersenne-Primzahl bezeichnet. Diese sind Sonderfälle von Mersenne-Zahelen, welche die Form [math]2^{n}-1 [/math] haben, für [math] n \in \mathbb{N}[/math]. Der Name geht auf den französischen Theologen und Mathematiker Marin Mersenne (8.8.1588 bis 1.8.1648) zurück.
Dabei ist zu beachten, dass [math] q \in \mathbb{P} [/math] wieder eine Primzahl ist und dass nicht alle Zahlen der Form [math] 2^{p}-1 [/math] Primzahlen sind. Ein konkretes Beispiel für einen solchen Fall ist die Zahl [math]2^{11}-1 = 2047[/math], welche sich auch als [math] 23*89 [/math] darstellen lässt und somit keine Primzahl ist. [1][2]
Mersenne-Primzahlen lassen sich im Binärsystem als Folge von Einsen schreiben. So hat Beispielsweise [math] 2^{19}-1 = 524.287 [/math] im Binärsystem die Form [math] 1111111111111111111_2 [/math] Gegenwärtig sind viele der größten bekannten Primzahlen solche Mersenne-Primzahlen, da durch den Lucas-Lehmer Test Zahlen der Form [math]2^{n}-1[/math] verhältnismäßig effizient auf die Primzahleigenschaft überprüft werden können.
Sophie-Germain Primzahlen
Gilt für eine Primzahl [math]p[/math], dass auch [math]2p+1[/math] eine Primzahl ist, so wird [math]p[/math] Sophie-Germain Primzahl genannt und [math]2p+1[/math] wird sichere Primzahl genannt.
Fermat Primzahlen
Primzahlen der folgenden Form werden Fermat Primzahlen genannt.
- [math] p = 2^{2^n} + 1[/math]
mit einer ganzen Zahl [math]n \ge 0[/math].
Ramanujan Primzahl
Ramanujan-Primzahlen [math]R_n[/math] sind als kleinste Zahlen definiert, so dass für alle [math]x \geq R_n[/math] zwischen [math] x[/math] und [math]\tfrac {x}{2}[/math] mindestens [math]n[/math] Primzahlen liegen.
Zum Beispiel ist für [math] n = 1 [/math] die Ramanujan Primzahl [math]R_1 [/math] gleich [math]2[/math]. Diesen Fall ist äquivalent zum Bertrandschen Postulat.
Größte berechnete Primzahl
Im Jahr 2018 hat das Team um Patrick Laroche die errechnet, dass [math] 2^{82.589.933}-1 [/math] eine Primzahl ist. Diese Zahl hat 24.862.048 Stellen.[3]
Satz von Euklid
Im Jahr 300 v.u.Z. hat Euklid von Alexandria bewiesen, dass es unendlich viele Primzahlen gibt.
In seinem Beweis durch Widerspruch trifft er die Annahme, dass es nur endlich viele Primzahlen gibt. Danach definiert er eine neue Zahl die eine neue Primzahl als Teiler hat oder welche selbst Primzahl ist. Somit erhalten wir einen Widerspruch und es kann keine endliche Menge aller Primzahlen geben. Es wurden mittlerweile dutzende weitere Beweise veröffentlicht[4].
Primzahlsatz
Ein wichtiger Teil der Arbeiten zu Primzahlen beschäftigt sich mit der Verteilung dieser. Hierfzu definieren wir zunächst die Primzahlfunktion, welche uns die Anzahl der Primzahlen bis zu gegebener Größe wiedergibt, und werden dann weitere Eigenschaften dieser Funktion festhalten.
Die Primzahlfunktion
Diese Funktion ist für beliebige [math]x \in \mathbb{R} [/math] definiert und gibt die Anzahl der Primzahlen an, die nicht größer als [math]x[/math] sind.
- [math]\pi (x) := \left | \{p \in \mathbb{P} \mid p \le x\} \right |[/math]
[math]\pi(x)[/math] wird als Primzahlfunktion bezeichnet.
Die Primzahlfunktion:
In der Graphik ist die Funktion bis zu einem Wert von 200 zu sehen. |
Diese Funktion war auch ein zentrales Untersuchungsobjekt für Bertrand Riemann in seiner Arbeit über die Anzahl der Primzahlen unter einer gegebenen Größe in der er die Riemannsche Vermutung formuliert.
Der Primzahlsatz
Die Urfassung des Primzahlsatzes geht auf Gauß zurück, welche er im Alter von 15 Jahren, im Jahre 1792, formulierte.
Sei [math]\displaystyle \mathrm{Li}(x):=\int _{2}^{x}{\frac { \mathrm{d}t }{\ln {t}} } [/math] der Integrallogarithmus. Dann gilt [math]\displaystyle \lim _{{x\to \infty }}{\frac {\pi (x)}{\mathrm{Li(x)}}}=1 [/math]
Diese Eigenschaft wird als asymptotisch äquivalent bezeichnet und man schreibt
- [math]\displaystyle \pi (x) \sim \mathrm{Li(x)} [/math]
Es kann gezeigt werden, dass gilt:
- [math]\displaystyle Li(x) \sim \frac {x}{\ln(x)} [/math]
So formulieren wir den Primzahlsatz, wie er in den meisten Werken zu finden ist.
- [math]\displaystyle \pi (x) \sim \frac{x}{\ln {x}} [/math]
Primzahlfunktion und Integrallogarithmusfunktion:
Der Verlauf der Funktionen ist bis zum Wert 200 abgebildet. | |
Primzahlfunktion, Integrallogarithmusfunktion und x/ln(x):
Alle drei Funktionen sind im Verlauf bis 200 abgebildet. Die Primzahlfunktion scheint hierbei von den anderen beiden Funktionen eingeschnürrt zu werden. Die Integrallogarithmusfunktion scheint insbesondere die Primzahlfunktion immer zu überschätzen. Der Mathematiker John Littlewood bewies aber 1913, dass [math] Li(x) [/math] an einem bestimmten Wert x die Primzahlfunktion unterschreiten muss. Stanley Skewes konnte zeigen, dass dies unter dem Wert [math]10^{10^{10^{34}}}[/math] passieren muss. Diese Zahl ist als Skewes-Zahl bekannt. |
Der Mathematiker Hans von Mangoldt konnte im Jahre 1895 beweisen, dass der Primzahlsatz äquivalent dazu ist, dass die Riemannsche Zeta-Funktion keine Nullstellen hat bei Funktionswerten mit Realteil 1.
Primfaktorzerlegung
Es ist möglich jede natürliche Zahl eindeutig als Produkt von sogenannten Primfaktoren [5] darzustellen.
Definition
- Eine Zahl [math] p [/math] heißt Primfaktor einer natürlichen Zahl [math] n [/math], wenn
- [math] n [/math] durch [math] p [/math] ganzzahlig ohne Rest geteilt wird und
- [math] p [/math] eine Primzahl ist.
- Die Darstellung einer natürlichen Zahl [math] n [/math] als Produkt ihrer Primfaktoren nennt man Primfaktorzerlegung.
Eigenschaften
- Eine Primfaktorzerlegung ist bis auf die Reihenfolge der Primfaktoren eindeutig.
- Da 1 keine Primzahl ist, ist die Primfaktorlzerlegung von 1 ein leeres Produkt.
- Der gleiche Primfaktor kann mehrmals in einer Primfaktorzerlegung vorkommen.
- Es gibt kein effizientes Verfahren, die Primfaktorzerlegung einer Zahl zu bestimmen.
- Für Zahlen mit sehr großen Primfaktoren ist es ein enormer Aufwand die Primfaktorzerlegung zu bestimmen.
- Wählt man die Primfaktoren groß genug, so benötigen sogar Hochleistungsrechner mehrere Jahre, um die Primfaktorzerlegung zu bestimmen.
Beispiele
\[ 6 = 2 \cdot 3 \] \[ 7 = 7 \] \[ 1003 = 17 \cdot 59 \] \[ 94684 = 2 \cdot 2 \cdot 23671 \]
Primzahltests
Sieb des Eratosthenes
Das Sieb des Eratosthenes ist eines der ältesten Verfahren zur Bestimmung aller Primzahlen, bis hin zu einer frei wählbaren oberen Grenze. Das Verfahren ist nach dem griechischen Mathematiker Eratosthenes von Kyrene (ca. 276 v.u.Z., † ca. 194 v.u.Z.) benannt. Konzeptionell arbeitet das Verfahren auf einer Liste aller Zahlen, beginnend mit der 2 bis hin zu der oberen Grenze N. Anschließend werden nacheinander alle Zahlen in dieser Liste betrachtet. Ist die betrachtete Zahl nicht markiert, so ist sie eine Primzahl und alle ihre Vielfachen können gestrichen werden. Ist die Zahl bereits markiert, kann man zur nächsten weitergehen. So werden nacheinander alle Primzahlen aus der Liste "herausgesiebt".
Ablauf des Algorithmus
- Wähle eine obere Grenze N, bis zu der alle Primzahlen bestimmt werden sollen.
- Schreibe alle natürlichen Zahlen von 2 bis N auf (um das Ganze anschaulicher zu machen ordnet man die Zahlen meist in einem rechteckigen Schema an, wobei hier die Vielfachen von 10 am Ender einer Reihe stehen). Im Folgenden werden alle Zahlen die keine Primzahlen sind gestrichen.
- Begonnen wird mit der 2. Die 2 selbst ist eine Primzahl, es können aber alle Vielfachen von 2 gestrichen werden, da sie selbst keine Primzahlen sind.
- Die nächste nicht gestrichene Zahl ist die Primzahl 3. Wieder können alle Vielfachen von 3 gestrichen werden. Begonnen werden kann hier mit der 9, da die 6 bereits als ein Vielfaches von 2 gestrichen wurde.
- Die 4 wurde bereits im 2. Schritt gestrichen und die nächste Zahl kann betrachtet werden.
- Dieses Vorgehen wird mit allen folgenden Zahlen wiederholt, bis die Quadratwurzel von N erreicht wurde. Ist eine Zahl noch nicht gestrichen worden, wenn man sie betrachtet, so ist sie eine Primzahl und ihre Vielfachen können gestrichen werden. Andernfalls kann die nächste Zahl betrachtet werden.
Der Algorithmus selbst ist recht Intuitiv und leicht nachzuvollziehen. Auch erklärt sich durch den Algorithmus, wie der Name "Sieb des Eratosthenes" zu stande kommt.
Wer sich anchschauen möchte, wie der Algorithmus in C++ aussieht, findet hier eine Implementierung.
#include <iostream> #include <cmath> int main(int argc, const char** argv) { // erstelle eine Liste der Laenge N. Zu Beginn sind keine Zahlen gestrichen was durch 'false' dargestellt wird const unsigned int N = 100; bool Liste[N] = { false }; // iteriere über alle Zahlen in der Liste bis zur Wurzel von N for (int i = 2; i <= std::sqrt(N); i++) { // falls Index noch nicht gestrichen sind if (Liste[i] == false) { // streiche alle Vielfachen beginnend mit dem Quadrat der gegenwärtig betrachteten Zahl an der Stelle i for (int j = i*i; j < N; j += i) { Liste[j] = true; } } } // gebe alle Primzahlen aus for (int i = 2; i <= N; i++){ if (Liste[i] == false){ std::cout << i << std::endl; } } return 0; }
Lucas-Lehmer Test
Der Lucas-Lehmer-Test ist ein Verfahren um zu überprüfen, ob es sich bei einer gegebenen Mersenne-Zahl auch um eine Mersenne-Primzahl handelt. Der Test geht auf den französischen Mathematiker François Édouard Anatole Lucas (*4.4.1842, † 3.10.1891) zurück, wurde aber erst 1930 von dem US-Amerikanischen Mathematiker Derrick Henry Lehmer (* 23.2.1905, † 22.5.1991) entwickelt.
Ablauf
Der Lucas-Lehmer-Test verwendet die sogenannte Lucas-Folge. Diese ist definiert durch \[ L_{0} := 4 \\ L_{n+1} := (L_{n}^{2} - 2) Mod \ M_{p} \] Dabei ist [math] p \in \mathbb{P}\backslash \{2\} [/math] und [math] M_p [/math] die zu überprüfende Mersenne-Zahl.
Für [math] M_p [/math] gilt: [math] M_p \in \mathbb{P} \Leftrightarrow L_{p-2} = 0[/math] [6]
Primzahlen in der Natur
Es existieren Zikadenarten, die sich in einem festen Abstand von Jahren massenhaft über der Erde vermehren und danach wieder unter die Erde zurückkehren. In dieser Zeit sind sie weniger gut vor ihren Fressfeinden geschützt. Die Zikaden haben also einen Vorteil, wenn sie in Jahren über der Erde sind, in denen weniger Fressfeinde auftreten. Einige Zikadenarten nutzen genau diesen Vorteil: Sie vermehren sich im Abstand von 13 oder 17 Jahren über der Erde.
Was passiert also mit ihren Fressfeinden? Für solche, die ohnehin in jedem Jahr auftreten, ändert sich nichts. Allerdings gibt es auch solche, die selbst nur in gewissen Jahren auftreten. Beispielsweise existiert eine zikadenjagende Wespe, die alle zwei bis drei Jahre auftritt. Nehmen wir also eine Art an, die alle 2 Jahre auftritt. Würden sich die Zikaden alle 12 Jahre vermehren, so würde in jedem dieser Jahre auch die Wespenart auftreten und die Zikaden hätten es mit deutlich mehr Fressfeinden zu tun. Nun ist der Zyklus der Zikaden aber 13 Jahre lang. Sie müssen also nur alle 26 Jahre mit jener Wespenart fertig werden. Somit haben sie einen deutlichen Vorteil darin, sich zu vermehren[7].
Primzahlen in der Kryptographie
Die Tatsache, dass es bis heute keine effiziente Methode zum Zerlegen einer großen Zahl in ihre Primfaktoren gibt, ermöglicht einige Anwendungen in der Kryptographie. So verwenden einige Verfahren, die eine verschlüsselte Kommunikation gewährleisten, Primzahlen. Wie wichtig solche Verfahren sind, wird deutlich, wenn man sich ansieht, wobei diese benutzt werden. Das umfasst Anwendungen wie Emails, Chats und Internettelefonie, aber auch weitaus sensiblere Daten, wie beispielsweise beim Onlinebanking.
RSA-Verfahren
Das RSA-Verfahren wurde 1978 von Ron Rivest, Adi Shamir und Leonard Adleman vorgestellt und nach ihnen benannt. Es ist ein public-key Krytosystem, nutzt also ein Schlüsselpaar, das aus einem öffentlichen und einem privaten Schlüssel besteht. Dies hat den Vorteil, dass der öffentlichen Schlüssel nicht geheim weitergegeben werden muss und so der Schlüsselaustausch kein Sicherheitsrisiko darstellt.
Public-key System
Bei einem Public-key System besitzt jeder Anwender sein eigenes Schlüsselpaar aus privatem und öffentlichen Schlüssel und somit auch sein eigenes Ver- und Entschlüsselungsverfahren. Dabei wird der geheime Schlüssel vom Anwender geheimgehalten, während der öffentliche Schlüssel an alle anderen Anwender, mit denen kommuniziert wird, verteilt wird.
Der Verschlüsselungsprozess wird mit [math] D [/math] bezeichnet, der Entschlüsselungsprozess mit [math] E [/math]. Dabei steht [math] D [/math] für Decryption und [math] E [/math] für Encryption. Ein Schlüsselpaar besteht aus zwei Zahlen. Dabei gelten für eine Nachricht im Klartext [math]M[/math] die folgenden Eigenschaften:
- [math] D(E(M)) = M [/math]
- [math] E(D(M)) = M [/math]
- [math]E[/math] und [math]D[/math] sind für sich genommen leicht zu berechnen
- [math]E[/math] kann aus [math]D[/math] nicht einfach berechnet werden
Ein Entschlüsselungsprozess [math] E [/math] heißt trap-door one-way function, wenn er die Eigenschaften a, c und d erfüllt. Handelt es sich außerdem um einen Prozess, der b erfüllt, so wird daraus eine trap-door one-way permutation. Dann ist jeder Geheimtext eine potenzielle Nachricht und jede Nachricht ein potenzieller Geheimtext.
Betrachten wir nun das Konzept des RSA-Verfahrens an einem Beispiel. Im Folgenden möchte Felix eine Nachricht an Ari schicken. Dementsprechend besitzt Felix die Schlüsselverfahren [math] D_F [/math] und [math] E_F [/math], Ari entsprechend [math] D_A [/math] und [math] E_A [/math].
Wie sieht nun der Nachrichtenaustausch aus? Zuallererst müssen Felix und Ari ihre öffentlichen Schlüssel austauschen. Somit erhält Ari die Möglichkeit [math] D_F [/math] durchzuführen, Felix [math] D_A [/math].
Nun führt Felix auf seiner Nachricht [math] D_A [/math] aus. Er nutzt also den öffentlichen Schlüssel von Ari und versendet dann die Nachricht. Bekommt Ari nun die verschlüsselte Nachricht, so kann er sie mit [math] E_A [/math] entschlüsseln. Da nur er seinen privaten Schlüssel hat, kann auch niemand anderes die Nachricht entschlüsseln und lesen. Für die Antwort nutzt Ari dann [math] D_F [/math] für die Verschlüsselung.
Die Mathematik dahinter
Die Nachricht
Die Nachricht [math]M[/math] selbst wird als positive ganze Zahl zwischen [math]0[/math] und [math] n-1 [/math] kodiert, damit man leicht mit ihr rechnen kann. Wie groß [math] n [/math] ist, hängt vom einzelnen Schlüsselpaar ab. Betrachtet man ein realistisches Szenario, so gilt [math] n \geq 10.000 [/math], wobei [math] n [/math] meist noch um einiges größer als dieser Wert ist. Ist die Nachricht zu groß, so wird sie in einzelne Blöcke aufgeteilt und jeder Block einzeln betrachtet. Eine mögliche Umwandlung von Buchstaben in Zahlen ist beispielsweise das ASCII-Format.
Die Schlüsselpaare
Jeder der beiden Schlüssel besteht aus einem Tupel. Wir bezeichnen den zu [math] E [/math] gehörenden privaten Schlüssel mit [math] P [/math] und den zu [math] D [/math] gehörenden öffentlichen Schlüssel mit [math] O [/math]. \[ P = (e,n) \hspace{2cm} O = (d,n) \ \text{ wobei }e, d \text{ positive ganze Zahlen sind.} \] Dabei gilt für den Ver- und Entschlüsselungsprozess eines Klartextes [math]M[/math] und eines Geheimtextes [math]C[/math]
- [math] C \equiv D(M) \equiv M^d \text{ mod } n [/math]
- [math] M \equiv E(C) \equiv C^e \text{ mod } n [/math]
Erzeugen der Schlüssel
- Zwei zufällige große Primzahlen [math] p[/math] und [math] q [/math] auswählen. Diese sollten in der Realität mehrere hundert Stellen haben.
- Setze nun [math] n = p \cdot q [/math]. Weil [math] p [/math] und [math] q [/math] so groß sind, ist es nicht in realistischem Zeitaufwand möglich, aus [math] n [/math] wieder [math] p [/math] und [math] q [/math] zu berechnen.
- Eine zufällige ganze Zahl [math] d [/math] wählen, die folgende Bedingung erfüllt
- [math] \text{ggT}(d, (q-1) \cdot (p-1)) = 1[/math]
- [math]\text{ggT}[/math] bezeichnet dabei den größten gemeinsamen Teiler, [math]d[/math] und [math] (q-1) \cdot (p-1)[/math] müssen also teilerfremd sein.
- [math] e [/math] aus [math] d [/math] bestimmen
- [math] \ e \cdot d = 1 (\text{ mod } \varphi(n))[/math]
- [math] \varphi(n)[/math] bezeichnet die Eulersche [math] \varphi[/math]-Funktion
Warum funktioniert das?
Nun gilt noch zu beweisen, dass dieses Verfahren für (fast) alle Nachrichten [math] M [/math] funktioniert.
Zuerst betrachten wir [math] \varphi(n) [/math]. Da für eine beliebige Primzahl [math] m [/math] gilt: \[ \varphi(m) = m-1 \] und [math] \varphi [/math] multiplikativ für teilerfremde Zahlen ist, folgt für [math] n [/math] : \[ \varphi(n) = \varphi(p \cdot q) = (p-1) \cdot (q-1) = n - (p+q) + 1 \]
Wie hängt nun [math] \varphi(n) [/math] mit [math] e [/math] und [math] d [/math] zusammen?
Da [math] d [/math] teilerfremd zu [math] \varphi(n) [/math] ist, existiert ein multiplikatives Inverses [math] e [/math] im Ring [math] \mathbb{Z}/\varphi(n)\mathbb{Z} [/math]:
\[ e \cdot d \equiv 1 (\text{mod} \ \varphi(n)) \]
Bisher gilt für den Ver- und Entschlüsselungsprozess \[ D(E(M)) \equiv (E(M))^d \ (\text{mod} \ n) \equiv (M^e)^d \ (\text{mod} \ n) = M ^{e\cdot d} \ (\text{mod }n) \] und analog \[ E(D(M)) \equiv (D(M))^e \ (\text{mod} \ n) \equiv (M^d)^e \ (\text{mod} \ n) = M ^{e\cdot d} \ (\text{mod }n) \]
Außerdem existiert eine ganze Zahl [math] k [/math], für die gilt: \[ M^{e\cdot d} \equiv M^{k\cdot \varphi(n) + 1} \ (\text{mod }n) \]
Nun gilt es noch zu zeigen, dass für alle [math] M [/math] gilt: [math] M^{e\cdot d} = M \ (\text{mod }n) [/math]
Hierzu werden [math] p [/math] und [math] q [/math] getrennt betrachtet. Dies ist nach dem chinesischen Restsatz möglich, auf den wir hier nicht näher eingehen werden.
Betrachten wir [math] M^{e\cdot d} = M \ (\text{mod }p) [/math], so gilt:
- Falls [math] M = 0\ (\text{mod }p)[/math], dann ist [math] M [/math] ein Vielfaches von [math] p [/math]. Dann gilt: [math] M^{e\cdot d} = 0 = M \ (\text{mod }p) [/math]
- Falls [math] M \not = 0\ (\text{mod }p)[/math], dann gilt nach dem Satz von Euler-Fermat
[math] M^{ed} = M^{ed-1} M = M^{k(p-1)}M = (M^{p-1})^kM = 1^kM = M (\text{mod } p) [/math]
Betrachten wir [math] M^{e\cdot d} = M \ (\text{mod }q) [/math], so gilt analog:
- Falls [math] M = 0\ (\text{mod }q)[/math], dann ist [math] M [/math] ein Vielfaches von [math] q [/math]. Dann gilt: [math] M^{e \cdot d} = 0 = M \ (\text{mod }q) [/math]
- Falls [math] M \not = 0\ (\text{mod }q)[/math], dann gilt nach dem Satz von Euler-Fermat
[math] M^{ed} = M^{ed-1} M = M^{k(q-1)}M = (M^{q-1})^kM = 1^kM = M (\text{mod } q) [/math]
Da die Bedingung für beide Faktoren gezeigt wurde, gilt [math] M^{e\cdot d} = M \ (\text{mod }n)[/math] nach dem chinesischen Restsatz auch für [math] n = pq [/math]. [8] [9]
Einfaches Beispiel
Teil 1: Schlüssel generieren
- Wir wählen zwei Primzahlen [math] p = 7, \ q = 11 [/math]
- Dann gilt [math] n = pq = 77 [/math]
- Wir wählen eine ganze Zahl [math] e = 29 [/math], wobei [math] p-1 = 6 [/math] und [math] q-1 = 10 [/math] teilerfremd zu [math] e [/math] sind.
- Der öffentliche Schlüssel ist dann [math] O=(d,n) = (29, 77)[/math]
- [math] \varphi(77) = (p-1) (q-1) = 6 \cdot 10 = 60 [/math]
- Für [math] d [/math] soll gelten: [math] ed + k \cdot \varphi(n) = 1[/math], also [math] 29\cdot d + k \cdot 60 = 1 [/math] für ein [math] k \ \in \mathbb{Z}[/math]. Somit ist [math] d=29 [/math] und [math] k = -14\lt /math. Somit ist der private Schlüssel \lt math\gt P=(e,n) = (29,77)[/math].
Wählt man deutlich größere Primzahlen [math] p [/math] und [math] q [/math], so ist die Berechnung von [math] e [/math] aus [math] d [/math] oder andersherum ohne die Kenntnis von [math] p [/math] und [math] q [/math] sogar für Computer zu aufwendig.
Teil 2: Die Verschlüsselung
Felix möchte die Zahl 13 verschlüsseln und an Ari senden. Hierzu rechnet er: \[ C = 13^{29}\ (\text{mod } 77) = 6 \] Diese 6 schickt Felix nun als Geheimtext an Ari.
Teil 3: Die Entschlüsselung
Ari rechnet nun: \[ M = 6^{29}\ (\text{mod } 77) = 13 \]
Und erhält somit wieder die 13 als Klartext.
Signatures
Zwar schützt dieses Verfahren soweit vor fremden Mitlesern, aber es ist immernoch möglich, falsche Nachrichten im Namen von Felix zu versenden. Nehmen wir an, Johanna möchte Ari im Namen von Felix eine Nachricht senden. Mit dem bisherigen Verfahren kann Johanna ebenso Aris öffentlichen Schlüssel verwenden und Ari kann sich nicht sicher sein, ob die Nachricht tatsächlich von Felix stammt oder nicht.
Um dieses Problem zu lösen, wird die Eigenschaft b des Public-key Systems genutzt. Einer Nachricht wird eine Signatur angehängt, die mit dem privaten Schlüssel ver- und mit dem öffentlichen Schlüssel entschlüsselt wird. Will also Felix nun Ari eine Nachricht schicken, so verschlüsselt er zuerst nur die Signatur mit seinem privaten Schlüssel, dann die ganze Nachricht mit Aris öffentlichem Schlüssel. Für die verschlüsselte Nachricht [math] C [/math] ergibt sich also
\[ C = E_A(D_F(M)) \]
Kommt die Nachricht nun bei Ari an, so entschlüsselt er zuerst die ganze Nachricht mit seinem privaten Schlüssel und dann die Signatur mit dem öffentlichen Schlüssel von Felix. Für die Entschlüsselung ergibt sich also
\[ M = D_A(E_F(C))) \]
Insgesamt ergibt sich also
\[ M = D_A(E_F(E_A(D_F(M)))) \]
Nun kann Ari anhand der Signatur erkennen, ob die Nachricht von Felix stammt, denn nur wenn der korrekte private Schlüssel verwendet wurde, ist die Signatur nun korrekt.
Quellen
- ↑ http://www.mathe.tu-freiberg.de/~hebisch/cafe/mersenneprim.html
- ↑ https://www.mathematik.de/dmv-blog/163-der-moench-mersenne-und-die-primzahlen
- ↑ https://www.mersenne.org/primes/
- ↑ https://de.wikipedia.org/wiki/Satz_des_Euklid
- ↑ https://de.wikipedia.org/wiki/Primfaktorzerlegung
- ↑ https://www.youtube.com/watch?v=0Ynt9lgR5jQ
- ↑ Goles, Eric; Schulz, Oliver; Markus, Mario (2000): A Biological Generator of Prime Numbers, Nonlinear Phenomena in Complex Systems 3:2 2008-2013
- ↑ https://en.wikipedia.org/wiki/RSA_(cryptosystem)
- ↑ http://people.csail.mit.edu/rivest/Rsapaper.pdf
Autoren
Johanna Riedel, Felix Elser, Arianit Miftari