Ich habe gehört, dass die Erzeugung von Zufallszahlen in Computern nicht wirklich zufällig ist, aber es gibt keinen effizienten Algorithmus, um sie zu erkennen. Wie kann es überhaupt erkannt werden?
Ich habe gehört, dass die Erzeugung von Zufallszahlen in Computern nicht wirklich zufällig ist, aber es gibt keinen effizienten Algorithmus, um sie zu erkennen. Wie kann es überhaupt erkannt werden?
Antworten:
Computer, die wirklich zufällig sind:
Echte Zufälligkeit ist für Turing Machines theoretisch unmöglich, und die meisten Computer können keine wirklich zufällige Ausgabe erzeugen. Daher enthalten einige moderne Computer Hardware, die es dem Computer ermöglicht, auf eine externe Quelle zuzugreifen, die hoffentlich eine gewisse Zufälligkeit enthält. Ein Beispiel dafür, wie dies erreicht werden kann, ist die Verfolgung kleiner Temperaturschwankungen im Inneren des Computers. Zufälligkeit kann auch von einer externen Quelle erhalten werden. Aber nach dem Ton Ihres Beitrags glaube ich nicht, dass Sie an externen Zufallsquellen interessiert sind.
Saat:
Ohne einen Zusatz von außen ist alles, was ein Computer tut, deterministisch. Dies führt zu einem großen Problem: Wenn Sie ein Zufallszahlen-Generierungsprogramm aufrufen, erhalten Sie jedes Mal dasselbe Ergebnis, wenn Sie dieselbe Eingabe vornehmen. Natürlich brauchen wir ein Programm, das eine Zufallszahl ausgibt, um ihr Verhalten bei jeder Ausführung zu ändern (andernfalls erhalten wir weiterhin die gleiche "Zufallszahl", was nicht besonders hilfreich ist). Eine Idee ist, dem Programm eine Eingabe zu geben, die sich jedes Mal ändert, wenn das Programm ausgeführt wird, so dass eine andere Nummer ausgegeben wird. Wir nennen diesen Eingang einen "Samen". Der Zufallszahlengenerator muss einen Startwert aufnehmen, einige Operationen ausführen und uns eine Zufallszahl geben.
Die aktuelle Systemzeit ist ein klassisches Beispiel für einen Startwert. Dies ergibt einen langen String mit hoher Entropie. Wenn die Zeit hinreichend genau verfolgt wird (dh wenn Ihre Systemuhr Stunden verwendet, ist "time" ein ziemlich schlechter Startwert), ist es unwahrscheinlich, dass Sie die Pseudozufallszahl eingeben Generator die gleiche Nummer zweimal.
Algorithmen, die zufällig genug sind:
Jetzt haben wir einen Algorithmus, der sich jedes Mal, wenn er ausgeführt wird, unterscheidet. Wir geben ihm einen Startwert, und während der Algorithmus bei Aufforderung mit demselben Startwert dieselbe Zahl angibt, möchten wir, dass die von ihm erzeugten Zahlen ansonsten zufällig sind. Dies verhält sich wie oben beschrieben - Sie nehmen einige Eingaben auf und es wird eine Ausgabe erzeugt (die sich hoffentlich genug von der Eingabe unterscheidet, um "zufällig" zu sein).
Nehmen wir an, Sie haben einen eigenen Algorithmus dafür entwickelt, und Sie behaupten, dass die Zahlen, die Ihnen einfallen, ziemlich zufällig sind, als Sie ihm eine Reihe verschiedener Samen gegeben haben. Wie würden wir testen, wie gut es ist?
Jetzt wollen wir einen Algorithmus, der einen Startwert aufnimmt, einige Operationen ausführt und eine Zufallszahl erzeugt. Im einfachsten Fall könnte der Algorithmus nur den Startwert ausgeben - er gibt uns nicht jedes Mal die gleiche Zahl, und zufällige Startwerte geben uns zufällige Ausgaben. Aber genau das wollen wir nicht. Andererseits kann ein Algorithmus ziemlich kompliziert sein, wie viele tatsächliche Pseudozufallsgeneratoren. Wie können wir feststellen, welche Algorithmen uns "zufällige" Zahlen aus unseren nicht notwendigerweise zufälligen Samen geben? Wenn wir es nicht genau bekommen können, wie können wir sagen, welche am besten sind?
Zufällig genug, um einen Angreifer zum Narren zu halten:
Nun, worauf Sie sich möglicherweise beziehen, sind kryptografisch sichere Pseudozufallsgeneratoren. Ich denke, der beste Weg, dies zu erklären, ist der obige Kontext. Hier verwenden wir unsere Zufälligkeit für die Kryptografie. Wenn wir also Tests entwerfen, geht es uns wirklich darum, dass jemand nicht in der Lage ist, zu brechen unsere Sicherheit durch Vorhersage, welche Zufallszahl wir ausgewählt haben. Ich weiß nicht, wie gut Sie mit Kryptografie vertraut sind, aber stellen Sie sich vor, wir machen einen einfachen Ersatzschlüssel - jeder Buchstabe wird durch einen anderen ersetzt. Wir möchten diese Ersetzungen nach dem Zufallsprinzip auswählen, damit ein Angreifer sie nur schwer erraten kann. Aber wenn er herausfindet, wie mein Zufallsgenerator funktioniert, kann er die ganze Chiffre lösen! Daher erfordern kryptografische Algorithmen Zufallszahlengeneratoren, die besonders schwer zu erraten sind.
Aus diesem Grund werden CSPRGs dahingehend definiert, wie gut andere Algorithmen sie lösen (hier kommen wir schließlich zu Ihrer Frage). Nehmen wir an, ich habe eine CSPRG, die ich R. R nennen werde. R ist eine CSPRG, wenn und nur dann, wenn es keinen machbaren Algorithmus gibt, der erraten kann, welches Bit als nächstes ausgegeben wird. Dies gilt auch dann, wenn Sie alle zuvor ausgegebenen Bits kennen!
Nehmen wir also an, die ersten fünf Bits, die mein CSPRG ausgibt, sind 10100. Sie kennen die Eingabe, die ich für das Programm verwendet habe, nicht, aber Sie haben Zugriff auf den Code, mit dem ich mein CSPRG geschrieben habe. Dann ist die Behauptung, dass es unmöglich ist, ein Programm zu schreiben, um zu entscheiden, ob das nächste ausgegebene Bit 101000 oder 101001 ist.
Aus kryptografischen Gründen wird manchmal definiert, wie gut ein Pseudozufallszahlengenerator in Bezug auf die Vorhersagbarkeit für andere Programme ist. Beachten Sie, dass dies immer noch einen Großteil der Intuition von "Zufälligkeit" liefert, da (sagen wir) wenn Sie wissen, dass alle zufälligen Ausgaben seltsam sind, diese weder kryptografisch sicher sind noch einen Common-Sense-Zufälligkeitstest bestehen.
Kürzlich habe ich im Blog der MIT CSAIL Theory of Computation Group einen schönen Beitrag zum Thema Zufälligkeit bei der Berechnung gefunden: Kannst du sagen, ob ein bisschen zufällig ist?
Der Beitrag beginnt mit einigen Ideen, die aus einem wunderbaren Vortrag von Avi Wigderson über die Leistungsfähigkeit und die Grenzen der Zufälligkeit bei der Berechnung extrahiert wurden , wobei der schöne Bereich der zufälligen Algorithmen und die überraschende Verbindung zwischen Pseudozufälligkeit und rechnerischer Unlösbarkeit untersucht wurden .
Anschließend werden einige aktuelle Ergebnisse zur Quantenkryptographie zusammengefasst. insbesondere die Möglichkeit, effizient zu testen, ob die Ausgabe einer bestimmten Art von Gerät wirklich zufällig ist (Zufallserweiterungsprotokolle).
Siehe zum Beispiel die jüngste Arbeit von Umesh Vazirani, Thomas Vidick, Zertifizierbare Quantenwürfel (oder testbare exponentielle Zufallserweiterung)
Abstract: Wir führen ein Protokoll ein, mit dem ein Paar von quantenmechanischen Vorrichtungen verwendet werden kann, um aus einem Keim von O (log n) gleichförmigen Bits n Bits mit wahrer Zufälligkeit zu erzeugen. Die erzeugten Bits sind nachweislich zufällig und basieren nur auf einem einfachen statistischen Test, der vom Benutzer durchgeführt werden kann, und auf der Annahme, dass die Geräte dem No-Signaling-Prinzip gehorchen. An das Innenleben der Geräte werden keine anderen Annahmen gestellt.
Angenommen, Sie sprechen von statistischer Zufälligkeit - Kryptographie hat andere Bedürfnisse! - Es gibt eine ganze Reihe von Anpassungsgütetests , mit denen festgestellt werden kann, ob eine Folge von Zahlen zu einer bestimmten Verteilung passt. Sie können diese verwenden, um zu testen, ob ein (Pseudo-) Zufallszahlengenerator einwandfrei ist (bis zur Qualität Ihres Tests und der gewählten Signifikanz).
Diehard Testsuiten kombinieren verschiedene Methoden.
Dies ist ein weites / komplexes Thema in der Informatik, das in der anderen Antwort von SamM angesprochen wird. Ihre spezifische Frage scheint zu sein, ob Computer sogenannte PRNGs haben , dh Pseudozufallszahlengeneratoren. Wie kann man das erkennen?
Die kurze Antwort lautet, dass nicht-triviale PRNGs so aufgebaut sind, dass ihre Algorithmen nicht erkannt (abgeleitet) werden können. Wenn der PRNG als "sicher" bezeichnet wird, kann ein Angreifer die zur Generierung der Pseudozufallssequenz verwendeten Parameter im Allgemeinen nicht erraten, auch wenn er den Algorithmus kennt, der zur Generierung der Sequenz verwendet wird. Auf diese Weise hat die Pseudozufälligkeit viele tiefe Bindungen zur Kryptographie, und man kann über das "Brechen" eines PRNG auf die gleiche Weise sprechen, wie ein kryptographischer Algorithmus "gebrochen" werden kann. Es gibt viele Forschungsarbeiten in diesem Bereich, es ist ein aktiver Bereich an der Spitze der Kryptographie.
Für "triviale" PRNGs, z. B. einen linearen Kongruenzgenerator , ist der Suchraum "relativ klein" und der Angreifer könnte theoretisch auch die Parameter finden , wenn der Angreifer den Algorithmus kennt, der zur Generierung verwendet wird, und er wird nicht mit "Bignums" generiert von der jeweiligen PRNG im Grunde durch rohe Gewalt und versuchen, alle Kombinationen verwendet.
PRNGs können in der Praxis (wiederum abhängig von ihrer "Sicherheit") in einigen Fällen durch Ausführen einer großen Anzahl statistischer Zufallstests gegen sie gebrochen werden. zB ist dies die Begründung des Programms "Dieharder" (von Brown). Es gibt auch eine NIST-Suite .
Die intrinsische Schwierigkeit / Härte des Brechens von PRNGs ist noch nicht streng theoretisch bewiesen, sondern hängt im Wesentlichen mit sogenannten "Falltür" - oder "Einwegfunktionen" zusammen , die effizient in eine Richtung berechnet werden können, sich aber "schwer" umkehren lassen (Umkehrung). . In der Kryptographie gibt es einige offene Probleme bezüglich der Zufallshärte. Diese Fragen stehen in engem Zusammenhang mit der Trennung von Komplexitätsklassen, z. B. der berühmten P =? NP-Frage.
Fragen zum Brechen von PRNGs beziehen sich auch auf die Kolmogorov-Komplexität , ein Gebiet, das die kleinsten Turing-Maschinen untersucht, die Sequenzen erzeugen können. Das Brechen des PRNG hängt auch eng damit zusammen, das "kürzeste" Programm zum Berechnen einer Pseudozufallssequenz zu finden. Und die Komplexität von Kolmogorov ist im Allgemeinen nicht zu berechnen.
Wie Gilles in einem Kommentar ausführt, gibt es hardwarebasierte RNGs, die aus physikalischen elektronischen Prozessen aufgebaut sind, wie sie zum Beispiel mit Quantenrauschen zusammenhängen. diese sind bei richtiger konstruktion unzerbrechlich.
Tatsächlich ist alles, was ein klassischer Computer tut, deterministisch, in dem Sinne, dass er ihnen deterministisch folgt, wenn Sie ihnen einige Aufgaben geben. Wenn Sie also eine Zufallszahl haben möchten, können Sie diese entsprechend der Zeit berechnen (basierend auf der Eingabezeit des Benutzers). Wenn Sie jedoch eine Reihe von Zufallszahlen haben möchten, können Sie die Zeit nicht für die nächsten Zahlen verwenden, da die zahlen wären nicht mehr unabhängig.
Die Benutzer verwenden Pseudozufallsgeneratoren mit einem Startwert, dh einer Zahl, mit der alle Zahlen des Pseudozufallsgenerators berechnet werden , wenn mehr als ein Satz unabhängiger Zufallszahlen benötigt wird). Der Startwert ist normalerweise 0 oder eine bestimmte Zahl, wenn Sie reproduzierbare Ergebnisse erzielen möchten, oder die Zeit, wenn Sie und verschiedene nicht reproduzierbare Ergebnisse erzielen möchten.
Die Tatsache, dass die Pseudozufallszahlengeneratoren gut genug sind, liegt in der Tatsache, dass sie "den grundlegenden Merkmalen einer Pseudozufallszahlengeneration" folgen, um effizient berechnet zu werden und sich wie echte Zufallszahlen zu verhalten:
Aus jeder Zahl der Folge von Pseudozufallszahlen wird eine neue Zahl berechnet (normalerweise arbeiten wir mit ganzen Zahlen). Es gibt jedoch eine Periode n in einer Folge von Pseudozufallszahlengeneratoren, die darauf vorbereitet sind, in einer bestimmten Basis mit einer endlichen Anzahl verfügbarer Bits zu arbeiten, um die Zahlen auszudrücken (z. B. binär). Wenn dieses n nicht groß genug wäre, gäbe es ernsthafte Probleme, aber keine Sorge, die Informatiker wählen die Keime und andere Parameter der Pseudozufallsgeneratoren gut aus, um ein gutes n zu erhalten.
Beispielsweise kann ein möglicher Pseudozufallszahlengenerator mit der linearen Kongruenzmethode, die zu den ältesten und bekanntesten Algorithmen für Pseudozufallszahlengeneratoren gehört, folgendermaßen definiert werden:
Es hat vier Werte:
- x_0 ≥ 0
- a ≥ 0
- c ≥ 0
- m> x_0, wobei:
x0 ist der Anfangswert, a, c und m sind Konstanten mit: m> a, m> c und es wird die Folge mit der Formel erzeugt:
x_ {i + 1} = (a * x_i + c) MOD m
Die Werte für diese Konstanten müssen sorgfältig ausgewählt werden. Eine Möglichkeit ist:
x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^ 32, Ref. [1-2]
Es gibt andere Algorithmen, die zur Erzeugung von Zufallszahlen ausgefeilter sind und einige der Probleme früherer Algorithmen vermeiden, darunter: [3]
- kürzere als erwartete Zeiträume für einige Keimzustände (solche Keimzustände können in diesem Zusammenhang als "schwach" bezeichnet werden);
- mangelnde Gleichmäßigkeit der Verteilung für große Mengen erzeugter Zahlen;
- Korrelation aufeinanderfolgender Werte;
- schlechte Dimensionsverteilung der Ausgabesequenz;
- Die Abstände, in denen bestimmte Werte auftreten, unterscheiden sich von denen in einer zufälligen Sequenzverteilung.
In Zukunft könnten die klassischen Computer zu Quantensystemen zusammengeschlossen werden, die wirklich zufällige Zahlen liefern und liefern können. [4]
Referenzen:
[1] http://en.wikipedia.org/wiki/linear_congruential_generator
[2] William H. et al. (1992). "Numerische Rezepte in fortran 77: Die Kunst des wissenschaftlichen Rechnens" (2. Aufl.). ISBN 0-521-43064-X.
[3] http://en.wikipedia.org/wiki/pseudozufallsgenerator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /