Raspberry Pi und Echte Zufallszahlen

Es sollte eigentlich zur Grundausstattung eines jeden PCs gehören, aber leider ist das nicht der Fall. Die Rede ist von einer Möglichkeit schnell und effektiv “Echte Zufallszahlen” zu generieren. Der Nutzen ist vielfältig. Unter anderem benötigt man TRNG (true random number generators) für die Verschlüsselung. TRNG ist jedoch auch ein Werkzeug für die Forschung in der Alternativen Wissenschaft, wie z.B. PSI.

Zum Glück liefert der Raspberry hier eine sehr gute Möglichkeit.

pi3

Es folgt ein Extrakt aus der Anleitung vom Blog “Well, that was unexpected…”: The Raspberry Pi’s Hardware Random Number Generator

sudo apt-get update
sudo apt-get -y dist-upgrade
sudo rpi-update
sudo reboot
sudo apt-get install netpbm
sudo apt-get install rng-tools

Nachdem alle Werkzeuge installiert worden sind, kann man ein PNG Random Picture erzeugen mit folgender Anweisung:

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

Und das Resultat sieht absolut zufällig aus:

random20161103131136

Dieses Bild zeigt zumindest, dass eine Zufälligkeit ohne besondere Muster existiert. Das ist ausreichend für einen Schnelltest.
Will man die Zufälligkeit programmatisch sicherstellen, dann ist der Befehl rngtest zu empfehlen:

sudo cat /dev/hwrng  | rngtest -c 1000
rngtest 2-unofficial-mt.14
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 1000
rngtest: FIPS 140-2 failures: 0
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 0
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=18.640; avg=981.258; max=9765625.000)Kibits/s
rngtest: FIPS tests speed: (min=1.677; avg=12.971; max=14.341)Mibits/s
rngtest: Program run time: 22501456 microseconds

Die Anzahl der “Failures” ist 0, was sehr gut ist.

Will man die Zufälligkeit auch hören, dann wandelt man die Bytes in eine Wav-Datei um.
Dazu muss man zuvor SOX installieren, ein Tool für die Audiobearbeitung über die Commandozeile:

sudo apt-get install sox libsox-fmt-all

Auf meinem Raspberry hatte VIM gefehlt, daher auch das noch installieren:

sudo apt-get install vim

Die Umwandlung erfolgt über einen Script:

vim rndsound.sh
#!/bin/bash
# rndsound.sh - make a wav from the RNG source
# must be run as root: sudo ./rndsound.sh
# needs sox toolkit:   sudo apt-get install sox libsox-fmt-all
# created by scruss on Mon Jun  3 23:07:54 EDT 2013

# length of sample, seconds
DURATION=5
# output file
OUTFILE=random$(date +%Y%m%d%H%M%S).wav
dd if=/dev/hwrng status=noxfer | sox -t u16 -c 1 -r 48000 - -c 1 $OUTFILE trim 0 $DURATION
# make the file world writeable so it's easier to delete
chmod a+w $OUTFILE
echo Wrote $OUTFILE

Nicht vergessen dem Script eine gewisse Berechtigung zu geben und dann kann es auch gleich losgehen:

chmod 770 rndsound.sh

sudo ./rndsound.sh

Das Resultat ist weißes Rauschen vom Feinsten, absolut entropisch, voller Zufälliger Bits:

Nachtrag vom 11.04.2017:
Für meine Experimente habe ich eine Server-Applikation mit einer REST Schnittstelle geschrieben. Zufallszahlen werden in größeren Mengen zwischengespeichert und ein Mustererkennungsprogramm analysiert diese Daten in bestimmten Intervallen (ein altes Hobby von mir).

Sollte es vorkommen, dass ein Programm nicht mehr auf den /dev/hwrng Verzeichnis zugreifen kann (permission denied), dann liegt es daran, dass es nicht mit dem sudo Befehl gestartet wurde.

Leave a Reply