Kryptographisch sicherer Zufallszahlengenerator mit dem Raspberry Pi und Hardware Random Number Generator (RNG)

Zufallszahlen kann man leicht online über random.org ermitteln. Es können da Münzen geworfen werden:

Es können verschiedene Währungen und Anzahl ausgewählt werden. Leider geht nicht Bitcoin. Aber die sind auch gut…

Auch Passwörter, Lotterie, Zeit, Zeichen, Wörter und andere Zufallszahlen können dort generiert werden.

Aber wie kann man Zufallszahlen generieren, die auch noch den hohen kryptografischen Anforderungen entsprechen? Mit Hardware (cryptographically secure pseudo-random number generator (CSPRNG)). Muss man da teure Crypto-Generatoren kaufen? Nein, ein kleiner Raspberry Pi reicht auch schon.

Der Raspberry Pi (Zero ua.) enthält, mit dem Chip BCM2708 / BCM2835 auch einen Hardware Random Number Generator (RNG). Welchen Chip der Pi hat, wird ausgegeben mit: cat /proc/cpuinfo.

Im Idealfall wird die Erstellung von Zufallszahlen durch eine nicht deterministische Entropiequelle gespeist. Das kann zum Beispiel ein hardwarebasierter Zufallsgenerator sein (PI) oder auch ein hybrider Generator. Für kryptologische Anwendungen sollten nicht-deterministische Generatoren verwendet werden, denn nur bei diesen kann garantiert werden, dass sie nicht reproduzierbar oder vorhersagbar sind.

Zugriff darauf erhält man über die Schnittstelle: /dev/hwrng ( und die blockende /dev/random und die nicht blockende /dev/urandom).

Wir aktivieren nun mal die rng-tools für den Zugriff auf den RNG. …

Nun erzeugen wir mal eine Datei mit zufälligen Inhalt von ca 200 KB Größe.

sudo cat /dev/hwrng | rawtoppm -rgb 256 256 | pnmtopng > random$(date +%Y%m%d%H%M%S).png

Cool:

Oder wer eine Datei mit zufälligen Testdaten braucht, kann sie mit dd erzeugen. Hier mal ca 10 MB:

sudo dd bs=1024 count=10000 if=/dev/hwrng of=hwrng-10mb-testdata.bin

Bisher haben wir immer per sudo auf die Schnittstelle zugegriffen. Wer es auch mit User rechten machen möchte, kann ein

sudo chmod a+r /dev/hwrng

ausführen. Dann wird ein dd: failed to open ‚/dev/hwrng‘: Permission denied verhindert. Nach dem nächsten reboot sind diese Rechte dann aber wieder entzogen.

Manchmal braucht man ein Seed für Crypto-Funktionen. Hier lesen wir mal 1024 byte aus der /dev/hwrng codieren es nach base58 und schneiden es auf 64 Zeichen oder 512 Bit:

Ergebniss:
4dxYQg73qczzM9fFAqYk785RXvNqPGimsohEqEjeYPtAAnKsZSHKE1nNcLhodQLz

Das dauert dann schon 3-5 Sekunden. Aber wir haben nun mit Hardware kryptografisch sichere Zufallszahlen von hoher Qualität erzeugt.

Nun können wir noch einen Test der Qualität der gelieferten Zufallszahlen ausführen. Es gibt eine gute Testsuit dieharder.

Quicktest in ca. 1 Min:

Und die ganze Testsuite mit:

dieharder -a

Die läuft dann auch ca. 3-4 Stunden auf meinem Pi Zero. Also nicht ungeduldig werden.Hier das Ergebnis:

Die CPU ist dann auch schon mit 100% ausgelastet:

Folgende Tests können auch separat ausgewählt werden: dieharder -l

Und hier die möglichen Testnamen der Generatoren: dieharder -g -1

Mit dem Goldstandard AES_OFB und Threefish_OFB. Mit 500 und 501 sind auch die beiden im Pi vorhandenen erreichbar. Aus /dev/urandom (von engl. unlimited random(ness)) können wie aus /dev/random Zufallszahlen gelesen werden. Im Gegensatz zu letzterem blockiert es jedoch nicht, wenn eine definierte Entropieschwelle unterschritten wird.

By my a coffee: bitcoin:bc1qj4grttyhk2h5wqask3nku70e3qtycssz5kvw5l