A couple days ago, I put up a post about using the Realtek SDR dongles as a hardware true random number generator. I only tested the randomness of a 512 MB file. I thought this time, I would but a bit more stock into it. In this case, I let it run for a while, until it was 1.8 GB in size. Interestingly enough, it stopped getting bigger after that point. Not sure why. However, I ran more tests on that 1.8 GB file. Creating this file took its time:
$ tail -f /run/rtl_entropy.fifo | dd of=random.img iflag=fullblock 3554130+0 records in 3554130+0 records out 1819714560 bytes (1.8 GB) copied, 3897.22 s, 467 kB/s
This filled up a bit faster than I had previously tested, going at a clip of about 3.826 Mbps.
Now it was time for the testing:
$ ent random.img Entropy = 8.000000 bits per byte. Optimum compression would reduce the size of this 1819714560 byte file by 0 percent. Chi square distribution for 1819714560 samples is 246.86, and randomly would exceed this value 63.11 percent of the times. Arithmetic mean value of data bytes is 127.4990 (127.5 = random). Monte Carlo value for Pi is 3.141611317 (error 0.00 percent). Serial correlation coefficient is 0.000013 (totally uncorrelated = 0.0).
It passes with flying colors on entropy estimation, compression, chi-square distributions, arithmetic mean, the Monte Carlo estimation for Pi, and serial correlation. Testing further, I ran it through the FIPS 140-2 tests:
$ rngtest < random.img 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: entropy source exhausted! rngtest: bits received from input: 14557716480 rngtest: FIPS 140-2 successes: 727288 rngtest: FIPS 140-2 failures: 597 rngtest: FIPS 140-2(2001-10-10) Monobit: 99 rngtest: FIPS 140-2(2001-10-10) Poker: 57 rngtest: FIPS 140-2(2001-10-10) Runs: 210 rngtest: FIPS 140-2(2001-10-10) Long run: 233 rngtest: FIPS 140-2(2001-10-10) Continuous run: 0 rngtest: input channel speed: (min=114.212; avg=6626.942; max=9536.743)Mibits/s rngtest: FIPS tests speed: (min=61.133; avg=147.877; max=151.377)Mibits/s rngtest: Program run time: 96034230 microseconds You have new mail. $ echo $? 1
Finally, the beast of beasts, I ran it through every Dieharder test. This took some time to complete. Here is a listing of the tests that it went through:
$ dieharder -l #=============================================================================# # 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
So here are the results:
$ dieharder -a < random.img #=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# rng_name |rands/second| Seed | mt19937| 1.25e+08 | 169223456| #=============================================================================# test_name |ntup| tsamples |psamples| p-value |Assessment #=============================================================================# diehard_birthdays| 0| 100| 100|0.91937112| PASSED diehard_operm5| 0| 1000000| 100|0.77213572| PASSED diehard_rank_32x32| 0| 40000| 100|0.04709503| PASSED diehard_rank_6x8| 0| 100000| 100|0.93031877| PASSED diehard_bitstream| 0| 2097152| 100|0.12183977| PASSED diehard_opso| 0| 2097152| 100|0.96023625| PASSED diehard_oqso| 0| 2097152| 100|0.61237304| PASSED diehard_dna| 0| 2097152| 100|0.66045974| PASSED diehard_count_1s_str| 0| 256000| 100|0.16999968| PASSED diehard_count_1s_byt| 0| 256000| 100|0.00992823| PASSED diehard_parking_lot| 0| 12000| 100|0.69592283| PASSED diehard_2dsphere| 2| 8000| 100|0.95358410| PASSED diehard_3dsphere| 3| 4000| 100|0.89028448| PASSED diehard_squeeze| 0| 100000| 100|0.81631204| PASSED diehard_sums| 0| 100| 100|0.03559934| PASSED diehard_runs| 0| 100000| 100|0.75027140| PASSED diehard_runs| 0| 100000| 100|0.43076351| PASSED diehard_craps| 0| 200000| 100|0.57749359| PASSED diehard_craps| 0| 200000| 100|0.00599436| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.60121369| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.04254338| PASSED sts_monobit| 1| 100000| 100|0.94352358| PASSED sts_runs| 2| 100000| 100|0.77549833| PASSED sts_serial| 1| 100000| 100|0.46198961| PASSED sts_serial| 2| 100000| 100|0.46002706| PASSED sts_serial| 3| 100000| 100|0.73076110| PASSED sts_serial| 3| 100000| 100|0.90967100| PASSED sts_serial| 4| 100000| 100|0.32002297| PASSED sts_serial| 4| 100000| 100|0.07478887| PASSED sts_serial| 5| 100000| 100|0.27486408| PASSED sts_serial| 5| 100000| 100|0.57409336| PASSED sts_serial| 6| 100000| 100|0.05095556| PASSED sts_serial| 6| 100000| 100|0.06341272| PASSED sts_serial| 7| 100000| 100|0.00941089| PASSED sts_serial| 7| 100000| 100|0.53679805| PASSED sts_serial| 8| 100000| 100|0.00122125| WEAK sts_serial| 8| 100000| 100|0.16239101| PASSED sts_serial| 9| 100000| 100|0.24007712| PASSED sts_serial| 9| 100000| 100|0.02659941| PASSED sts_serial| 10| 100000| 100|0.64616186| PASSED sts_serial| 10| 100000| 100|0.78783799| PASSED sts_serial| 11| 100000| 100|0.77618602| PASSED sts_serial| 11| 100000| 100|0.33875893| PASSED sts_serial| 12| 100000| 100|0.50423715| PASSED sts_serial| 12| 100000| 100|0.77528158| PASSED sts_serial| 13| 100000| 100|0.57625144| PASSED sts_serial| 13| 100000| 100|0.73422196| PASSED sts_serial| 14| 100000| 100|0.40891605| PASSED sts_serial| 14| 100000| 100|0.48542772| PASSED sts_serial| 15| 100000| 100|0.67319390| PASSED sts_serial| 15| 100000| 100|0.74730027| PASSED sts_serial| 16| 100000| 100|0.67519158| PASSED sts_serial| 16| 100000| 100|0.73171087| PASSED rgb_bitdist| 1| 100000| 100|0.87216594| PASSED rgb_bitdist| 2| 100000| 100|0.18831902| PASSED rgb_bitdist| 3| 100000| 100|0.16757216| PASSED rgb_bitdist| 4| 100000| 100|0.05327115| PASSED rgb_bitdist| 5| 100000| 100|0.75278396| PASSED rgb_bitdist| 6| 100000| 100|0.64749144| PASSED rgb_bitdist| 7| 100000| 100|0.20311557| PASSED rgb_bitdist| 8| 100000| 100|0.39994123| PASSED rgb_bitdist| 9| 100000| 100|0.52805289| PASSED rgb_bitdist| 10| 100000| 100|0.96091722| PASSED rgb_bitdist| 11| 100000| 100|0.97794399| PASSED rgb_bitdist| 12| 100000| 100|0.75009561| PASSED rgb_minimum_distance| 2| 10000| 1000|0.58923867| PASSED rgb_minimum_distance| 3| 10000| 1000|0.54294743| PASSED rgb_minimum_distance| 4| 10000| 1000|0.59446131| PASSED rgb_minimum_distance| 5| 10000| 1000|0.00047025| WEAK rgb_permutations| 2| 100000| 100|0.89040191| PASSED rgb_permutations| 3| 100000| 100|0.47917416| PASSED rgb_permutations| 4| 100000| 100|0.30964668| PASSED rgb_permutations| 5| 100000| 100|0.70217495| PASSED rgb_lagged_sum| 0| 1000000| 100|0.12796648| PASSED rgb_lagged_sum| 1| 1000000| 100|0.15077254| PASSED rgb_lagged_sum| 2| 1000000| 100|0.31141471| PASSED rgb_lagged_sum| 3| 1000000| 100|0.94974697| PASSED rgb_lagged_sum| 4| 1000000| 100|0.99256987| PASSED rgb_lagged_sum| 5| 1000000| 100|0.67854004| PASSED rgb_lagged_sum| 6| 1000000| 100|0.08600877| PASSED rgb_lagged_sum| 7| 1000000| 100|0.91633363| PASSED rgb_lagged_sum| 8| 1000000| 100|0.06794590| PASSED rgb_lagged_sum| 9| 1000000| 100|0.59024027| PASSED rgb_lagged_sum| 10| 1000000| 100|0.59285975| PASSED rgb_lagged_sum| 11| 1000000| 100|0.87178336| PASSED rgb_lagged_sum| 12| 1000000| 100|0.63401541| PASSED rgb_lagged_sum| 13| 1000000| 100|0.47202172| PASSED rgb_lagged_sum| 14| 1000000| 100|0.34616699| PASSED rgb_lagged_sum| 15| 1000000| 100|0.97221211| PASSED rgb_lagged_sum| 16| 1000000| 100|0.95576739| PASSED rgb_lagged_sum| 17| 1000000| 100|0.32367098| PASSED rgb_lagged_sum| 18| 1000000| 100|0.92792046| PASSED rgb_lagged_sum| 19| 1000000| 100|0.58128429| PASSED rgb_lagged_sum| 20| 1000000| 100|0.78197001| PASSED rgb_lagged_sum| 21| 1000000| 100|0.86068846| PASSED rgb_lagged_sum| 22| 1000000| 100|0.22496908| PASSED rgb_lagged_sum| 23| 1000000| 100|0.52387665| PASSED rgb_lagged_sum| 24| 1000000| 100|0.52748770| PASSED rgb_lagged_sum| 25| 1000000| 100|0.96442902| PASSED rgb_lagged_sum| 26| 1000000| 100|0.51298847| PASSED rgb_lagged_sum| 27| 1000000| 100|0.99123470| PASSED rgb_lagged_sum| 28| 1000000| 100|0.69774674| PASSED rgb_lagged_sum| 29| 1000000| 100|0.83646714| PASSED rgb_lagged_sum| 30| 1000000| 100|0.98573851| PASSED rgb_lagged_sum| 31| 1000000| 100|0.23580471| PASSED rgb_lagged_sum| 32| 1000000| 100|0.19150884| PASSED rgb_kstest_test| 0| 10000| 1000|0.67771558| PASSED dab_bytedistrib| 0| 51200000| 1|0.07152541| PASSED dab_dct| 256| 50000| 1|0.53841656| PASSED Preparing to run test 207. ntuple = 0 dab_filltree| 32| 15000000| 1|0.09092747| PASSED dab_filltree| 32| 15000000| 1|0.83382174| PASSED Preparing to run test 208. ntuple = 0 dab_filltree2| 0| 5000000| 1|0.37363586| PASSED dab_filltree2| 1| 5000000| 1|0.26890999| PASSED Preparing to run test 209. ntuple = 0 dab_monobit2| 12| 65000000| 1|0.80810458| PASSED
I don't have an image to look at to visually verify that there are no obvious patterns. At 1.8 GB, I feel that it would be just a bit too unwieldy anyway. So, I'll need to trust the previous tests for randomness that the data really is random. After these 3 series of tests, I can only conclude that using a Realtek SDR as a HWRNG will generate as "true random" data as you can hope for.
{ 2 } Comments