Wie kann festgestellt werden, dass ein Zahlengenerator nicht wirklich zufällig ist?


20

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?


1
Dieser Beitrag kann Ihnen helfen.
Anton

6
Bei der Gefahr, pedantisch zu klingen, ist es nicht wirklich möglich, mit Sicherheit zu sagen, dass eine bestimmte Quelle nicht zufällig ist, wenn Sie nur ihre Ausgaben untersuchen. Sie können eine faire Münze Mal hintereinander werfen und jedes Mal Kopf bekommen, und Ihre Chance, bei dem 10 100 + 1- Wurf Zahl zu bekommen, liegt immer noch bei 50%. Indem wir die Quelle untersuchen, können wir normalerweise nicht zufällige Dinge identifizieren (z. B. Pseudozufallszahlengeneratoren ... wir könnten die Sequenz aus dem Startwert und dem Algorithmus vorhersagen). Viele offensichtliche Zufallsquellen sind möglicherweise nicht ausreichend verstanden, um zuverlässig vorherzusagen. Dies ist jedoch philosophisch. 1010010100+1
Patrick87

@ Patrick87 Wenn du mit "Gewissheit" mathematisch meinst, ist das wahr. Es gibt jedoch statistische Tests, die Ihnen eine willkürliche Aussagekraft verleihen können (vorausgesetzt, die Daten sind "gut").
Raphael

@ Patrick87 Auf die Gefahr hin, banal zu klingen ... du sagst: "Du kannst Mal hintereinander eine faire Münze werfen und jedes Mal Köpfe bekommen" ... nein, das kann ich nicht. Jedes Modell, bei dem ich sogar 10 3 Köpfe hintereinander sehe und immer noch glaube, dass es eine faire Münze ist, erfasst die Realität nicht sehr gut. Dies ist jedoch in der Tat philosophisch. ;-)10100103
Don Hatch

Antworten:


15

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?

1n

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.


7
Dies ist eine gute (aber unvollständige) Antwort, aber ein paar Punkte sind falsch. "Echte Zufälligkeit ist für Computer unmöglich, da alles, was sie tun, deterministisch ist." Das ist nicht immer der Fall, einige Prozessoren enthalten einen Hardware-RNG. Computer können auch auf externe Eingaben reagieren, die zufällig sein können. „… Für die Kryptographie ist es uns also egal, wie„ zufällig “sie in Bezug auf die Verteilung sind“: Tatsächlich ist manchmal eine gleichmäßige Verteilung in der Kryptografie wichtig, z. B. die IV für CBC und der k-Parameter in DSA.
Gilles 'SO- hör auf böse zu sein'

Er schrieb: "Ohne einen Zusatz von außen ist alles, was ein Computer tut, deterministisch." Der externe Zusatz bezieht sich auf Geräte wie RNGs, wie Sie bereits erwähnt haben. Ohne diese Zusätze entsprechen unsere Rechenfähigkeiten denen eines TM, für das eine echte Zufälligkeit unmöglich ist.
Kent Munthe Caspersen

Wenn ich mich richtig erinnere, habe ich das nach Gilles 'Kommentar hinzugefügt.
SamM

4

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.


3

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.


0

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.


"Nicht-triviale PRNGs sind so aufgebaut, dass ihre Algorithmen nicht erkannt (abgeleitet) werden können" - ich denke nicht, dass das richtig ist. Tatsächlich widerspricht Ihr nächster Satz dem. Möchten Sie Ihre Antwort bearbeiten, um dies zu beheben?
DW

es könnte präziser ausgearbeitet werden, aber nicht im Anschluss, was ist Ihr spezifischer Einwand? Der Punkt ist, dass der Algorithmus, der die Sequenz erzeugt, nur aus der Sequenz von Daten allein bestimmt werden kann, außer durch rohe Gewalt, wenn der Algorithmus sicher ist, und in diesem Fall ist es unwahrscheinlich, dass rohe Gewalt erfolgreich ist.
vzn

1
Mein spezieller Einwand ist, dass der Satz für mich falsch klingt: Es klingt so, als würden Sie sagen, dass PRNGs so konzipiert sind, dass jemand, der ihre Ausgabe beobachtet, nicht schließen kann, was der Algorithmus war, aber so funktionieren die Dinge im wirklichen Leben nicht. Die meisten PRNGs sind nicht darauf ausgelegt, jemanden am Erlernen des Algorithmus zu hindern. In der Regel ist der Algorithmus öffentlich. Vielleicht meinen Sie damit, dass PRNGs so aufgebaut sind, dass ihre Ausgabe nicht von echten Zufallsbits unterschieden werden kann?
DW

1
"Der Algorithmus, der die Sequenz generiert, kann nur anhand der Datensequenz bestimmt werden, außer durch rohe Gewalt, wenn der Algorithmus sicher ist." - Dies ist auch nicht korrekt. Der Algorithmus ist normalerweise öffentlich. Es ist nur das Saatgut, das nicht öffentlich ist, und es ist nur das Saatgut, das aus den Ergebnissen schwer abzuleiten sein soll.
DW

-1

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:

  • Die produzierten Zahlen müssen einer gleichmäßigen Verteilung folgen (aus dieser Verteilung können Sie eine beliebige andere Verteilung erzielen).
  • Die produzierten Zahlen müssen statistisch unabhängig sein.
  • die Sequenz ist reproduzierbar (dieser Punkt wird aufgrund der Hardwareeigenschaft eines klassischen Computers auferlegt, weshalb sie als "Pseudozufallszahlen" bezeichnet werden);
  • die Periode der Sequenz muss groß genug sein;
  • Die Zahlengenerierung muss schnell sein.

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 /


Dies beantwortet die Frage nicht wirklich. Sie erklären, wie Sie Zufallszahlen generieren und nicht, ob ein gegebener RNG zufällig ist. Auch dann fehlen Ihre Erklärungen etwas, lineare Kongruenzen sind kaum "eine der besten". Derzeit gibt es Hardware-RNGs, es ist kein Quantencomputer erforderlich. Es besteht eine gute Chance, dass Sie einen in Ihrem PC, einen in Ihrem Telefon und sogar einen in Ihrer Kreditkarte haben.
Gilles 'SO - hör auf böse zu sein'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.