Was ist ein Zufallszahlengenerator?

Ein Zufallszahlengenerator (RNG) ist ein System, das zufällige oder pseudozufällige Zahlen erzeugt. Ob sich die nächste Zahl tatsächlich vorhersagen lässt, hängt von der Art des Generators ab. Manche Generatoren nutzen einen physikalischen Vorgang, andere berechnen ihre Zahlen mit einem Algorithmus, und manche Algorithmen sind so gebaut, dass selbst jemand, der ihre bisherigen Werte kennt, nicht vorhersagen kann, was als Nächstes kommt. Zufällig auszusehen und unvorhersagbar zu sein sind zwei verschiedene Eigenschaften, und um diesen Unterschied geht es im größten Teil dieses Artikels.

Hardware-Zufallszahlengeneratoren

Ein Hardware-Zufallszahlengenerator (HRNG), auch echter Zufallszahlengenerator (TRNG) genannt, gewinnt seine Zahlen aus einem physikalischen Vorgang. Die ältesten dieser Generatoren kann man mit bloßem Auge beobachten: eine geworfene Münze, ein Würfel, ein Rouletterad. Die Mechanik beschreibt jeden von ihnen vollständig, und doch ist ein gut gebautes Rad in der Praxis unvorhersagbar, weil winzige Unterschiede zu Beginn jeder Drehung zu völlig verschiedenen Ergebnissen anwachsen.

Moderne Hardware-Generatoren messen stattdessen mikroskopische Phänomene: Schrotrauschen und thermisches Rauschen in elektronischen Schaltungen, atmosphärisches Rauschen, Quanteneffekte. Das sind gute Quellen für Entropie – messbare Unvorhersagbarkeit –, aber eine physikalische Quelle ist nicht von Natur aus perfekt: Sie kann verzerrte Werte liefern, sich mit der Zeit verändern und ausfallen. Deshalb muss ihre Qualität bewertet und überwacht werden, und ihre Werte müssen bei Bedarf nachbearbeitet werden; genau das beschreiben Standards wie NIST SP 800-90B. Hardware-Quellen kommen dort zum Einsatz, wo es auf die Qualität der Zufallsquelle besonders ankommt – vor allem in der Kryptografie, wo sie das unvorhersagbare Ausgangsmaterial für die Schlüssel liefern, auf denen Protokolle wie Transport Layer Security (TLS) beruhen.

Pseudozufallszahlengeneratoren

Die Alternative zu einem physikalischen Gerät ist ein Algorithmus. Ein Pseudozufallszahlengenerator (PRNG) erzeugt eine Folge, die zufällig aussieht, aber vollständig durch einen Startwert (Seed) bestimmt ist. Geben Sie demselben Algorithmus denselben Startwert, erhalten Sie jedes Mal dieselbe Folge. Das ist eine Schwäche, wo immer ein Ergebnis unvorhersagbar sein muss und sich der Startwert oder der interne Zustand erraten oder rekonstruieren lässt, und eine Stärke, wo immer ein Ergebnis reproduzierbar sein muss – eine Simulation oder ein Test lässt sich exakt wiederholen. PRNGs sind außerdem schnell, billig und einfach zu implementieren, weshalb sich die meiste Software auf sie verlässt. Zu den bekannten Algorithmen gehören der lineare Kongruenzgenerator (LCG), die xorshift-Generatoren und der Mersenne-Twister.

Mersenne-Twister

Der Mersenne-Twister, 1997 von Makoto Matsumoto und Takuji Nishimura veröffentlicht, ist einer der am weitesten verbreiteten Pseudozufallszahlengeneratoren und in vielen Programmiersprachen der Standard. Sein Name stammt von seiner Periode – der Länge der Folge, bevor sie sich wiederholt –, die in der Standardvariante MT19937 die Mersenne-Primzahl 219937 − 1 ist. Er besteht die meisten statistischen Tests auf Zufälligkeit und eignet sich gut für Simulationen. Er wurde jedoch nicht dafür entworfen, Geheimnisse zu bewahren: Aus 624 aufeinanderfolgenden 32-Bit-Werten kann jeder seinen internen Zustand rekonstruieren und alle folgenden Werte vorhersagen. Deshalb darf er nicht für Schlüssel, Passwörter oder irgendetwas anderes verwendet werden, das unvorhersagbar bleiben muss.

Kryptografisch sichere Generatoren und Entropie

Viele Anwendungen brauchen beides zugleich: die Geschwindigkeit eines Algorithmus und die Unvorhersagbarkeit einer physikalischen Quelle. Die Antwort ist ein kryptografisch sicherer Pseudozufallszahlengenerator (CSPRNG). Er ist nach wie vor ein PRNG, aber so gebaut, dass sich aus einem Teil seiner Werte der Rest praktisch nicht vorhersagen lässt, und er erhält seinen Startwert aus einer Quelle echter Entropie, aus der er auch regelmäßig neu gespeist wird. Ein Startwert aus einer physikalischen Quelle macht einen gewöhnlichen PRNG nicht sicher; der Algorithmus muss dafür entworfen sein. Eine physikalische Quelle wie thermisches Rauschen oder die Zeitpunkte von Hardware-Ereignissen liefert eine kleine Menge echten Zufalls, und der CSPRNG macht daraus eine lange Folge von Werten, die er weit schneller liefert. Diese Kombination stellt ein Betriebssystem den Programmen zur Verfügung, die darauf laufen, und sie ist heute in der Praxis meist gemeint, wenn von einem „Zufallszahlengenerator“ die Rede ist. Ein solcher Generator erzeugt Verschlüsselungsschlüssel, Sitzungstoken und Passwörter.

Zufallszahlen im Browser

JavaScript gibt einer Webseite zwei eingebaute Wege, Zufallswerte zu erhalten, und sie gehören zu verschiedenen Klassen. Math.random() ist ein gewöhnlicher PRNG: Der JavaScript-Standard überlässt den Algorithmus dem jeweiligen Browser und gibt keine Garantie für kryptografische Sicherheit – in Ordnung für eine Animation, ungeeignet für eine Auslosung, die jemand anfechten könnte. Der andere Weg ist die Web Crypto API. Ihre Methode crypto.getRandomValues() liefert kryptografisch starke Zufallswerte, erzeugt von einem CSPRNG, der seinen Startwert aus der Entropie des Betriebssystems erhält.

Unser Online-Zufallszahlengenerator nutzt die Web Crypto API für jede Ziehung, und die Zahlen entstehen in Ihrem Browser, nicht auf einem Server. Dieselbe Quelle steckt hinter den anderen Generatoren dieser Website, ob Sie würfeln, eine Münze werfen oder ein Passwort generieren.

Von Zufallsbits zu einer Zahl im gewünschten Bereich

Ein kryptografisch sicherer Generator ist nur die Hälfte einer fairen Ziehung. Er liefert rohe Bits, und das Programm muss sie noch in eine Zahl aus dem gewünschten Zahlenbereich umwandeln – und hier kann sich eine Verzerrung einschleichen. Angenommen, die Quelle liefert die Werte 0 bis 9 mit gleicher Wahrscheinlichkeit, und Sie brauchen eine Zahl von 0 bis 5. Den Rest der Division durch 6 zu nehmen, liegt nahe, aber dann können 0, 1, 2 und 3 jeweils auf zwei Wegen entstehen, 4 und 5 dagegen nur auf einem, sodass jede der Zahlen 0 bis 3 eine Wahrscheinlichkeit von 20 % hat, 4 und 5 dagegen jeweils nur 10 %. Eine Möglichkeit, die Verzerrung zu beseitigen, besteht darin, die unpassenden Werte zu verwerfen und neu zu ziehen; die Artikel zu Zufallszahlen gehen darauf im Detail ein.

Zwei weitere Dinge überraschen viele an generierten Werten. Wiederholungen sind normal: Wird eine ganze Zahl von 1 bis 10 unabhängig gezogen und ist jede Zahl gleich wahrscheinlich, hat die eben gezogene Zahl dieselbe Wahrscheinlichkeit von 1 zu 10, erneut gezogen zu werden, wie jede andere. Eine Ziehung ohne Wiederholungen ist eine andere Art von Ziehung, keine zufälligere. Und ein fairer Generator allein macht noch kein faires Verfahren: Die Teilnehmerliste und die Zahl der Versuche zählen genauso – mehr dazu in unserem Artikel darüber, wie Sie einen zufälligen Gewinner auswählen.