Kompakte Notebooks Kompakte Notebooks - Wuala
Kompakte Notebooks Kompakte Notebooks - Wuala
Kompakte Notebooks Kompakte Notebooks - Wuala
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Know-how | Zufallszahlen<br />
gewinnen Grand Challenge 2005, c’t 23/05,<br />
S. 92<br />
[3]ˇOliver Lau, Krypto-Ass, Schneller verschlüsseln<br />
per Hardware, c’t 11/05, S. 230<br />
[4]ˇCryptography Research, Evaluation of VIA C3<br />
Nehemiah Random Number Generator, Februar 2003<br />
[5]ˇMersenne-Twister: http://de.wikipedia.org/wiki/<br />
Mersenne-Twister<br />
[6]ˇBruce Schneier, Applied Cryptography, Wiley &<br />
Sons 2nd ed. 1996, ISBN 0-471-12845-7<br />
[7]ˇKlaus Schmeh, Dr. Hubert Uebelacker, Zufallstreffer,<br />
Kryptographisch sichere Zufallsgeneratoren,<br />
c’t 14/97, S. 220<br />
[8]ˇVIA Nehemiah RNG Programming Guide:<br />
www.via.com.tw/en/downloads/whitepapers/<br />
initiatives/padlock/rng_prog_guide.pdf<br />
[9]ˇNIST Special Publication 800-22, A Statistical Test<br />
Suite for Random and Pseudorandom Number<br />
Generators: http://csrc.nist.gov/rng/SP800-22b.pdf<br />
[10]ˇClaude E. Shannon, A Mathematical Theory of<br />
Communication, 1948: http://cm.bell-labs.com/<br />
cm/ms/what/shannonday/shannon1948.pdf<br />
Soft-Link 0902172<br />
Tests auf Zufälligkeit<br />
Das wichtigste Instrument zur Beurteilung<br />
der Zufälligkeit einer Zahlenfolge sind statistische<br />
Tests. Im Laufe der Jahre wurden<br />
sie zu Dutzenden ausklamüsert. Zum Verständnis<br />
sind leider häufig profunde Mathematik-Kenntnisse<br />
vonnöten. Um sich ein<br />
bisschen hineinzudenken, genügt es glücklicherweise,<br />
sich mit ein paar der einfacheren<br />
Tests auseinanderzusetzen. Das Folgende<br />
geht davon aus, dass die betrachteten<br />
Zufallszahlenfolgen byteweise organisiert<br />
sind, also alle Werte aus dem ganzzahligen<br />
Bereich zwischen 0 und 255 stammen.<br />
Gleichverteilungstest<br />
Wie jede Augenzahl eines Würfels gleich<br />
häufig oben liegen soll, wenn man nur lange<br />
genug würfelt, so sollen auch Zufallszahlen<br />
möglichst fair sein. Bei byteweiser Organisation<br />
liegt die Wahrscheinlichkeit für das Auftreten<br />
einer jeder Zahl bei exakt 1/256.<br />
Einen Test auf Gleichverteilung kann man<br />
auf verschiedene Arten implementieren. In<br />
der Template-Funktion frequency_test() (test/<br />
frequency.h) geschieht das über die Einteilung<br />
des Wertebereichs in Klassen und das<br />
Zählen der Häufigkeiten, mit wie viel Zufallszahlen<br />
eine Klasse besetzt ist. Die Funktion<br />
liefert aus einem Chi-Quadrat-Anpassungstest<br />
einen p-Wert, der angibt, wie gut die beobachteten<br />
Häufigkeiten mit der erwarteten<br />
Gleichverteilung übereinstimmen. Diese<br />
Methode funktioniert mit Gleitkomma- und<br />
Ganzzahlen gleichermaßen gut.<br />
In der Monobit genannten Implementierung<br />
der NIST (test/monobit.h) werden<br />
stumpf die Häufigkeiten von 0- und 1-Bits in<br />
Blöcken à 20ˇ000 Bit gezählt. Fallen die Häufigkeiten<br />
ins Intervall zwischen 9654 und<br />
10ˇ346, gilt der Test als bestanden. Dieses<br />
Verfahren funktioniert demnach nur mit Zufallszahlen,<br />
die binär organisiert sind.<br />
Entropie<br />
Eine andere Sichtweise auf die Häufigkeitsverteilung<br />
liefert die sogenannte Entropie<br />
[10]. Sie gibt an, wie viel Bits Information<br />
durchschnittlich in jedem Byte einer Zahlenfolge<br />
stecken. Wird zum Beispiel das<br />
obere Nibble eines Bytes gar nicht verwendet,<br />
kann die Entropie nicht über 4 Bit pro<br />
Byte steigen. Kommen sämtliche Werte<br />
exakt gleich häufig vor, hat die Folge eine<br />
Entropie von 8 Bit pro Byte.<br />
Serientest<br />
Eine endlose Wiederholung des Alphabets<br />
ergäbe eine perfekte Gleichverteilung, was<br />
die Häufigkeit einzelner Buchstaben angeht,<br />
aber ein extremes Ungleichgewicht in Bezug<br />
auf Häufigkeit von Buchstabenpaaren (2-<br />
Tupel), -drillingen (3-Tupel) und so weiter.<br />
Der Serientest ermittelt die Häufigkeiten aller<br />
möglichen n-Tupel. Aus Performancegründen<br />
beschränkt sich die Implementierung in<br />
ct-rng-assessor auf Paare und Drillinge. Die<br />
Wahrscheinlichkeit für ein bestimmtes Byte-<br />
Paar beträgt also 1/256 2 , für einen bestimmten<br />
Drilling 1/256 3 . Der Test liefert einen p-<br />
Wert aus dem Chi-Quadrat-Anpassungstest.<br />
Gap-Test<br />
Von einer Zufallszahlenfolge darf man verlangen,<br />
dass es nicht zu lange dauert, bis ein<br />
Wert aus einem bestimmten Intervall erneut<br />
auftaucht. Der Gap-Test misst die Breite dieser<br />
Lücken und merkt sich, wie häufig jede<br />
Lückenbreite vorgekommen ist. Das tut er<br />
insgesamt sechs Mal: für Zahlen aus der unteren<br />
und oberen Hälfte des Wertebereichs<br />
(0–127 respektive 128–255) sowie für jedes<br />
Viertel (0–63, 64–127, 128–191, 192–255).<br />
Die Wahrscheinlichkeit für eine Lücke der<br />
Breite t sinkt exponentiell mit wachsendem<br />
t. Die beobachteten Häufigkeiten lassen sich<br />
also wieder bequem mit Hilfe des Chi-Quadrat-Anpassungstests<br />
mit den erwarteten<br />
vergleichen. Heraus kommt wie üblich ein p-<br />
Wert als Maß der Übereinstimmung.<br />
Poker-Test<br />
Tut man so, als seien die Zufallsbytes Spielkarten,<br />
so sollte eine Hand aus fünf Bytes<br />
mit einer bestimmten Wahrscheinlichkeit<br />
fünf unterschiedliche Zahlen enthalten, mit<br />
einer anderen, sehr viel geringeren Wahrscheinlichkeit<br />
fünf gleiche. Allgemein gesagt:<br />
Dass eine Gruppe aus k Zahlen mit d<br />
möglichen Werten r unterschiedliche enthält,<br />
ermittelt man mit der Formel:<br />
p r<br />
=<br />
d(d – 1) … (d – r + 1)<br />
d k ⋅ S{k, r}<br />
wobei S{k, r} die sogenannte Stirling-Zahl<br />
zweiter Art bezeichnet, die nach folgender<br />
rekursiver Vorschrift berechnet wird: S{n, k}<br />
= S{n – 1, k – 1} + k · S{n – 1, k}. Die Spezialfälle<br />
S{n, n} = 1 und S{n, 1} = 1 stellen die Anfangswerte.<br />
Die Implementierung des Tests findet sich<br />
in der Datei test/poker-knuth.h. Die Funktion<br />
poker_test_knuth() liefert als Ergebnis den<br />
p-Wert des Chi-Quadrat-Tests.<br />
Coupon-Collector’s-Test<br />
Es darf nicht beliebig lange dauern, bis alle<br />
möglichen Zahlen mindestens einmal „gezogen“<br />
wurden, also jede Nummer auf einem<br />
gedachten Kuponbogen abgehakt werden<br />
konnte. Die Anzahl der eingelesenen Bytes<br />
einer beliebig langen Zufallszahlenfolge, die<br />
erforderlich ist, damit jeder Wert zwischen 0<br />
und 255 mindestens einmal aufgetaucht ist,<br />
ermittelt der Coupon-Collector’s-Test und<br />
trägt sie in eine Häufigkeitstabelle ein. Ein Abschnitt<br />
der Länge r hat die Wahrscheinlichkeit<br />
p r = d!<br />
d r ⋅ S{r – 1, d – 1}<br />
wobei r naturgemäß größer oder gleich d<br />
(Anzahl möglicher Werte aus dem Zufallszahlengenerator)<br />
ist. Praktischerweise lässt<br />
man r nicht beliebig groß werden, sondern<br />
begrenzt seinen Wert auf ein frei wählbares t.<br />
Die Wahrscheinlichkeit dafür, dass man<br />
mindestens t Bytes einlesen muss, um den<br />
Kuponbogen voll zu bekommen, liegt bei<br />
p r =<br />
d!<br />
dt – 1 ⋅ S{t – 1, d}<br />
Die Funktion coupon_collector_test() in der Datei<br />
test/couponcollector.h führt das Verfahren vor.<br />
Run-Test<br />
Aufeinanderfolgende Werte einer Zufallszahlenfolge<br />
sollten sich nicht zu lange in<br />
einem bestimmten Intervall aufhalten, zum<br />
Beispiel in der oberen oder unteren Hälfte.<br />
Ebenso wenig ist es wünschenswert, dass<br />
sie über große Bereiche monoton steigen<br />
oder fallen. Die Länge dieser Läufe nimmt<br />
der Run-Test unter die Lupe.<br />
Die von der NIST ursprünglich vorgeschlagene<br />
Implementierung (siehe Datei test/<br />
run-fips-140-1.h) macht es noch ein bisschen<br />
anders: Bei ihr werden in Blöcken à<br />
20ˇ000 Bits Läufe von aufeinanderfolgenden<br />
Nullen oder Einsen mit einer Länge von<br />
maximal fünf gezählt, zusätzlich wird der<br />
längste Lauf ermittelt. Der Test gilt als bestanden,<br />
wenn es keinen Lauf gibt, der eine<br />
Länge von 35 überschreitet.<br />
c<br />
c’t 2009, Heft 2<br />
©<br />
Copyright by Heise Zeitschriften Verlag GmbH & Co. KG. Veröffentlichung und Vervielfältigung nur mit Genehmigung des Heise Zeitschriften Verlags.<br />
179