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. …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
sudo apt-get update sudo apt-get upgrade sudo apt-get install -y rng-tools sudo apt-get install dieharder base58 netpbm // in der Datei /etc/default/rng-tools // diese Zeile einkommentieren HRNGDEVICE=/dev/hwrng // nach dem Speichern, den Service neustarten mit sudo service rng-tools restart // Check ob er läuft mit sudo service rng-tools status // Ergebnis: // rng-tools.service // Loaded: loaded (/etc/init.d/rng-tools; generated) // Active: active (running) since Mon 2021-03-08 11:54:43 GMT; 5h 24min ago // Docs: man:systemd-sysv-generator(8) // Process: 248 ExecStart=/etc/init.d/rng-tools start (code=exited, status=0/SUCCESS) // Tasks: 4 (limit: 881) // CGroup: /system.slice/rng-tools.service // └─252 /usr/sbin/rngd -r /dev/hwrng // //Mar 08 16:55:51 pi-zero rngd[252]: block failed FIPS test: 0x04 // nun fragen wir als 1. Test den RNG ab sudo cat /dev/hwrng | rngtest -c 1000 // Ergebnis: // 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=20.686; avg=1113.556; max=2170138.889)Kibits/s // rngtest: FIPS tests speed: (min=872.281; avg=6194.330; max=9199.835)Kibits/s // rngtest: Program run time: 21731808 microseconds |
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
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
1 2 3 4 |
Ergebnis: 10000+0 records in 10000+0 records out 10240000 bytes (10 MB, 9.8 MiB) copied, 76.3932 s, 134 kB/s |
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:
1 |
head --bytes 1024 /dev/hwrng | base58 | cut -b 1-64 |
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:
1 2 3 4 5 6 7 8 9 10 11 |
cat /dev/hwrng | dieharder -d 0 -vv # Verbose is now 0 #=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# rng_name |rands/second| Seed | mt19937| 6.71e+06 |2700364392| #=============================================================================# test_name |ntup| tsamples |psamples| p-value |Assessment #=============================================================================# diehard_birthdays| 0| 100| 100|0.96498159| PASSED |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
#=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# rng_name |rands/second| Seed | mt19937| 1.33e+07 |2176239946| #=============================================================================# test_name |ntup| tsamples |psamples| p-value |Assessment #=============================================================================# diehard_birthdays| 0| 100| 100|0.94314215| PASSED diehard_operm5| 0| 1000000| 100|0.05997730| PASSED diehard_rank_32x32| 0| 40000| 100|0.65551597| PASSED diehard_rank_6x8| 0| 100000| 100|0.81062048| PASSED diehard_bitstream| 0| 2097152| 100|0.91336368| PASSED diehard_opso| 0| 2097152| 100|0.73418898| PASSED diehard_oqso| 0| 2097152| 100|0.37598108| PASSED diehard_dna| 0| 2097152| 100|0.39502100| PASSED diehard_count_1s_str| 0| 256000| 100|0.36787773| PASSED diehard_count_1s_byt| 0| 256000| 100|0.17203648| PASSED diehard_parking_lot| 0| 12000| 100|0.38297064| PASSED diehard_2dsphere| 2| 8000| 100|0.70432781| PASSED diehard_3dsphere| 3| 4000| 100|0.04228828| PASSED diehard_squeeze| 0| 100000| 100|0.75737376| PASSED diehard_sums| 0| 100| 100|0.01408896| PASSED diehard_runs| 0| 100000| 100|0.34690220| PASSED diehard_runs| 0| 100000| 100|0.61328407| PASSED diehard_craps| 0| 200000| 100|0.45255130| PASSED diehard_craps| 0| 200000| 100|0.34140884| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.01356705| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.88725971| PASSED sts_monobit| 1| 100000| 100|0.92809349| PASSED sts_runs| 2| 100000| 100|0.70064044| PASSED sts_serial| 1| 100000| 100|0.30285544| PASSED sts_serial| 2| 100000| 100|0.11043619| PASSED sts_serial| 3| 100000| 100|0.04839608| PASSED sts_serial| 3| 100000| 100|0.17163469| PASSED sts_serial| 4| 100000| 100|0.27375082| PASSED sts_serial| 4| 100000| 100|0.56129471| PASSED sts_serial| 5| 100000| 100|0.10286056| PASSED sts_serial| 5| 100000| 100|0.70147404| PASSED sts_serial| 6| 100000| 100|0.02389873| PASSED sts_serial| 6| 100000| 100|0.22846499| PASSED sts_serial| 7| 100000| 100|0.16654779| PASSED sts_serial| 7| 100000| 100|0.94266382| PASSED sts_serial| 8| 100000| 100|0.64764909| PASSED sts_serial| 8| 100000| 100|0.35786024| PASSED sts_serial| 9| 100000| 100|0.11994060| PASSED sts_serial| 9| 100000| 100|0.01492777| PASSED sts_serial| 10| 100000| 100|0.28720292| PASSED sts_serial| 10| 100000| 100|0.57725105| PASSED sts_serial| 11| 100000| 100|0.22553762| PASSED sts_serial| 11| 100000| 100|0.95557506| PASSED sts_serial| 12| 100000| 100|0.01619734| PASSED sts_serial| 12| 100000| 100|0.65794787| PASSED sts_serial| 13| 100000| 100|0.97880352| PASSED sts_serial| 13| 100000| 100|0.68669486| PASSED sts_serial| 14| 100000| 100|0.82291291| PASSED sts_serial| 14| 100000| 100|0.23893454| PASSED sts_serial| 15| 100000| 100|0.23056594| PASSED sts_serial| 15| 100000| 100|0.29490170| PASSED sts_serial| 16| 100000| 100|0.20365937| PASSED sts_serial| 16| 100000| 100|0.43336972| PASSED rgb_bitdist| 1| 100000| 100|0.08378750| PASSED rgb_bitdist| 2| 100000| 100|0.96079219| PASSED rgb_bitdist| 3| 100000| 100|0.50520411| PASSED rgb_bitdist| 4| 100000| 100|0.93998074| PASSED rgb_bitdist| 5| 100000| 100|0.93667400| PASSED rgb_bitdist| 6| 100000| 100|0.63142518| PASSED rgb_bitdist| 7| 100000| 100|0.40546047| PASSED rgb_bitdist| 8| 100000| 100|0.80941715| PASSED rgb_bitdist| 9| 100000| 100|0.96942898| PASSED rgb_bitdist| 10| 100000| 100|0.75015991| PASSED rgb_bitdist| 11| 100000| 100|0.75802591| PASSED rgb_bitdist| 12| 100000| 100|0.65231510| PASSED rgb_minimum_distance| 2| 10000| 1000|0.77053230| PASSED rgb_minimum_distance| 3| 10000| 1000|0.84584118| PASSED rgb_minimum_distance| 4| 10000| 1000|0.11341000| PASSED rgb_minimum_distance| 5| 10000| 1000|0.23386456| PASSED rgb_permutations| 2| 100000| 100|0.40715742| PASSED rgb_permutations| 3| 100000| 100|0.81781070| PASSED rgb_permutations| 4| 100000| 100|0.68500477| PASSED rgb_permutations| 5| 100000| 100|0.99509897| WEAK rgb_lagged_sum| 0| 1000000| 100|0.99684194| WEAK rgb_lagged_sum| 1| 1000000| 100|0.76612769| PASSED rgb_lagged_sum| 2| 1000000| 100|0.90613954| PASSED rgb_lagged_sum| 3| 1000000| 100|0.46950076| PASSED rgb_lagged_sum| 4| 1000000| 100|0.59860291| PASSED rgb_lagged_sum| 5| 1000000| 100|0.29088298| PASSED rgb_lagged_sum| 6| 1000000| 100|0.23415810| PASSED rgb_lagged_sum| 7| 1000000| 100|0.06778911| PASSED rgb_lagged_sum| 8| 1000000| 100|0.61346229| PASSED rgb_lagged_sum| 9| 1000000| 100|0.92572538| PASSED rgb_lagged_sum| 10| 1000000| 100|0.99635081| WEAK rgb_lagged_sum| 11| 1000000| 100|0.66983969| PASSED rgb_lagged_sum| 12| 1000000| 100|0.25406935| PASSED rgb_lagged_sum| 13| 1000000| 100|0.26988533| PASSED rgb_lagged_sum| 14| 1000000| 100|0.75974901| PASSED rgb_lagged_sum| 15| 1000000| 100|0.05332157| PASSED rgb_lagged_sum| 16| 1000000| 100|0.05910817| PASSED rgb_lagged_sum| 17| 1000000| 100|0.20150036| PASSED rgb_lagged_sum| 18| 1000000| 100|0.96021771| PASSED rgb_lagged_sum| 19| 1000000| 100|0.82156303| PASSED rgb_lagged_sum| 20| 1000000| 100|0.74527528| PASSED rgb_lagged_sum| 21| 1000000| 100|0.59687986| PASSED rgb_lagged_sum| 22| 1000000| 100|0.53144197| PASSED rgb_lagged_sum| 23| 1000000| 100|0.70237709| PASSED rgb_lagged_sum| 24| 1000000| 100|0.26405926| PASSED rgb_lagged_sum| 25| 1000000| 100|0.27224957| PASSED rgb_lagged_sum| 26| 1000000| 100|0.85213972| PASSED rgb_lagged_sum| 27| 1000000| 100|0.32911915| PASSED rgb_lagged_sum| 28| 1000000| 100|0.02978336| PASSED rgb_lagged_sum| 29| 1000000| 100|0.45641913| PASSED rgb_lagged_sum| 30| 1000000| 100|0.26699683| PASSED rgb_lagged_sum| 31| 1000000| 100|0.08961364| PASSED rgb_lagged_sum| 32| 1000000| 100|0.54507637| PASSED rgb_kstest_test| 0| 10000| 1000|0.18089532| PASSED dab_bytedistrib| 0| 51200000| 1|0.22617824| PASSED dab_dct| 256| 50000| 1|0.34197275| PASSED Preparing to run test 207. ntuple = 0 dab_filltree| 32| 15000000| 1|0.19837555| PASSED dab_filltree| 32| 15000000| 1|0.71066904| PASSED Preparing to run test 208. ntuple = 0 dab_filltree2| 0| 5000000| 1|0.86902555| PASSED dab_filltree2| 1| 5000000| 1|0.66198816| PASSED Preparing to run test 209. ntuple = 0 dab_monobit2| 12| 65000000| 1|0.18372317| PASSED |
Die CPU ist dann auch schon mit 100% ausgelastet:
Folgende Tests können auch separat ausgewählt werden: dieharder -l
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# Installed dieharder tests: Test Number Test Name Test Reliability =============================================================================== -d 0 Diehard Birthdays Test Good -d 1 Diehard OPERM5 Test Good -d 2 Diehard 32x32 Binary Rank Test Good -d 3 Diehard 6x8 Binary Rank Test Good -d 4 Diehard Bitstream Test Good -d 5 Diehard OPSO Suspect -d 6 Diehard OQSO Test Suspect -d 7 Diehard DNA Test Suspect -d 8 Diehard Count the 1s (stream) Test Good -d 9 Diehard Count the 1s Test (byte) Good -d 10 Diehard Parking Lot Test Good -d 11 Diehard Minimum Distance (2d Circle) Test Good -d 12 Diehard 3d Sphere (Minimum Distance) Test Good -d 13 Diehard Squeeze Test Good -d 14 Diehard Sums Test Do Not Use -d 15 Diehard Runs Test Good -d 16 Diehard Craps Test Good -d 17 Marsaglia and Tsang GCD Test Good -d 100 STS Monobit Test Good -d 101 STS Runs Test Good -d 102 STS Serial Test (Generalized) Good -d 200 RGB Bit Distribution Test Good -d 201 RGB Generalized Minimum Distance Test Good -d 202 RGB Permutations Test Good -d 203 RGB Lagged Sum Test Good -d 204 RGB Kolmogorov-Smirnov Test Test Good -d 205 Byte Distribution Good -d 206 DAB DCT Good -d 207 DAB Fill Tree Test Good -d 208 DAB Fill Tree 2 Test Good -d 209 DAB Monobit 2 Test Good |
Und hier die möglichen Testnamen der Generatoren: dieharder -g -1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# # Id Test Name | Id Test Name | Id Test Name # #=============================================================================# | 000 borosh13 |001 cmrg |002 coveyou | | 003 fishman18 |004 fishman20 |005 fishman2x | | 006 gfsr4 |007 knuthran |008 knuthran2 | | 009 knuthran2002 |010 lecuyer21 |011 minstd | | 012 mrg |013 mt19937 |014 mt19937_1999 | | 015 mt19937_1998 |016 r250 |017 ran0 | | 018 ran1 |019 ran2 |020 ran3 | | 021 rand |022 rand48 |023 random128-bsd | | 024 random128-glibc2 |025 random128-libc5 |026 random256-bsd | | 027 random256-glibc2 |028 random256-libc5 |029 random32-bsd | | 030 random32-glibc2 |031 random32-libc5 |032 random64-bsd | | 033 random64-glibc2 |034 random64-libc5 |035 random8-bsd | | 036 random8-glibc2 |037 random8-libc5 |038 random-bsd | | 039 random-glibc2 |040 random-libc5 |041 randu | | 042 ranf |043 ranlux |044 ranlux389 | | 045 ranlxd1 |046 ranlxd2 |047 ranlxs0 | | 048 ranlxs1 |049 ranlxs2 |050 ranmar | | 051 slatec |052 taus |053 taus2 | | 054 taus113 |055 transputer |056 tt800 | | 057 uni |058 uni32 |059 vax | | 060 waterman14 |061 zuf | | #=============================================================================# | 200 stdin_input_raw |201 file_input_raw |202 file_input | | 203 ca |204 uvag |205 AES_OFB | | 206 Threefish_OFB |207 XOR (supergenerator)|208 kiss | | 209 superkiss | | | #=============================================================================# | 400 R_wichmann_hill |401 R_marsaglia_multic. |402 R_super_duper | | 403 R_mersenne_twister |404 R_knuth_taocp |405 R_knuth_taocp2 | #=============================================================================# | 500 /dev/random |501 /dev/urandom | | #=============================================================================# #=============================================================================# |
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