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.
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:
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:
https://pietro-lusso.de/wp-content/uploads/2016/11/random20161103145304.wav
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.