Der Standardanwendungsfall für BigInteger.isProbablePrime(int)
ist die Kryptographie. Insbesondere erfordern bestimmte kryptografische Algorithmen wie RSA zufällig ausgewählte große Primzahlen. Wichtig ist jedoch, dass diese Algorithmen nicht wirklich erfordern, dass diese Zahlen als Primzahl garantiert werden - sie müssen nur mit einer sehr hohen Wahrscheinlichkeit Primzahl sein.
Wie hoch ist sehr hoch? Nun, in einer Kryptoanwendung würde man normalerweise .isProbablePrime()
mit einem Argument irgendwo zwischen 128 und 256 aufrufen. Somit ist die Wahrscheinlichkeit, dass eine Nicht-Primzahl einen solchen Test besteht, geringer als eine von 2 128 oder 2 256 .
Lassen Sie uns das ins rechte Licht rücken: Wenn Sie 10 Milliarden Computer hätten, von denen jeder 10 Milliarden wahrscheinliche Primzahlen pro Sekunde erzeugt (was auf jeder modernen CPU weniger als einen Taktzyklus pro Zahl bedeuten würde), und die Primalität dieser Zahlen wurde mit .isProbablePrime(128)
Ihnen getestet Ich würde im Durchschnitt erwarten, dass alle 100 Milliarden Jahre eine Nicht-Primzahl einmal eintritt .
Das heißt, das wäre der Fall, wenn diese 10 Milliarden Computer Hunderte von Milliarden von Jahren laufen könnten, ohne dass Hardwarefehler auftreten. Obwohl in der Praxis ist es viel wahrscheinlicher , für eine zufällige die kosmische Strahlung auf den Computer schlägt genau zum richtigen Zeitpunkt und Ort des Rückgabewertes auf Flip von .isProbablePrime(128)
von false auf true, ohne andere nachweisbaren Effekte verursacht, als es für ein nicht ist -Prime-Nummer, um den probabilistischen Primalitätstest bei dieser Sicherheitsstufe tatsächlich zu bestehen.
Das gleiche Risiko von zufälligen kosmischen Strahlen und anderen Hardwarefehlern gilt natürlich auch für deterministische Primalitätstests wie AKS . In der Praxis weisen daher selbst diese Tests aufgrund zufälliger Hardwarefehler eine (sehr kleine) falsch positive Grundlinienrate auf (ganz zu schweigen von allen anderen möglichen Fehlerquellen, wie z. B. Implementierungsfehlern).
Da ist es einfach , die intrinsische falsch - positive Rate des schieben Miller-Rabin-Tests durch verwendet .isProbablePrime()
weit unter diesem Basisrate, einfach durch den Test ausreichend viele Male wiederholen, und da auch wiederholt , so oft ist der Miller-Rabin - Test noch In der Praxis viel schneller als die bekanntesten deterministischen Primalitätstests wie AKS, bleibt es der Standard-Primalitätstest für kryptografische Anwendungen.
(Selbst wenn Sie versehentlich ein starkes Pseudoprime als einen der Faktoren Ihres RSA-Moduls ausgewählt haben, würde dies im Allgemeinen nicht zu einem katastrophalen Ausfall führen. Typischerweise sind solche Pseudoprimes Produkte von zwei (oder selten mehr) Primzahlen von ungefähr Die Hälfte der Länge, was bedeutet, dass Sie am Ende einen Multi-Prime-RSA-Schlüssel erhalten . Solange keiner der Faktoren zu klein war (und wenn dies der Fall wäre, hätte der Primalitätstest sie abfangen sollen), wird der RSA-Algorithmus dies tun funktionieren immer noch einwandfrei, und der Schlüssel sollte, obwohl er gegen bestimmte Arten von Angriffen etwas schwächer ist als normale RSA-Schlüssel gleicher Länge, dennoch einigermaßen sicher sein, wenn Sie nicht unnötig an der Schlüssellänge sparen.)