23.04.2014 Aufrufe

Kompakte Notebooks Kompakte Notebooks - Wuala

Kompakte Notebooks Kompakte Notebooks - Wuala

Kompakte Notebooks Kompakte Notebooks - Wuala

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!