歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 樹莓派的硬件隨機數生成器

樹莓派的硬件隨機數生成器

日期:2017/2/28 14:45:35   编辑:Linux教程

大部分計算機不能生成真正的隨機數。他們使用生成很長偽隨機數流的公式,但是真正的隨機來自模擬元件的熱噪音。Raspberry Pi有這樣一個電子元件,它可以為安全傳輸提供種子數據(seed data)。直到最近才為這個電子元件提供了驅動。想要激活它(在Raspbian上):

  1. 確保你的系統是最新的
    sudo apt-get update
    sudo apt-get -y dist-upgrade
    sudo rpi-update
    and, if necessary, reboot.
  2. 安裝模組:
    sudo modprobe bcm2708-rng
  3. 想要確保它總是被加載,在/etc/modules中添加下述行(以root權限編輯):
    bcm2708-rng
  4. 對於一些RNG相關工作,安裝rng-tools:
    sudo apt-get install rng-tools

現在/dev/hwrng設備就可用了,但是只能以root用戶讀取。

隨機看起來是什麼樣子

隨機數看起來相當枯燥。這是隨機的RGB值:

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

(你需要安裝netpbm工具包才能執行上述命令)

隨機聽起來是什麼樣子

兩段簡短的WAV噪音樣本:

  • random20130603234239
  • random20130603234250

是的,聽起來像靜電干擾。這是使用rndsound.sh這個腳本做的。你需要安裝sox才能執行它。

這不隨機

如果聽起來像靜電干擾,即使有時候像靜電干擾,那麼它也有可能不是真正的隨機噪音。偽隨機數並不隨機的一個聲名狼藉的案例是RANDU,咋一看生成非常隨機的結果,但是仔細研究發現結果是可預測的。

我寫了(我認為是)一個C語言實現的RANDU:randu.c。雖然它可以生成聽起來近似隨機的音頻數據(randu17.wav),但是如果你以圖像的形式輸出:

這些條紋洩露了真像;本來是不應該有規律的。測試隨機數據是難的,然而——你確實需要大量的測試,即使其中某些測試對於真正的隨機輸出也可能會失敗。謝天謝地,當你安裝了rngtools,它包含rngtest,一個簡單的隨機數據檢測器:

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=67.969; avg=921.967; max=1953125.000)Kibits/s
rngtest: FIPS tests speed: (min=842.881; avg=3208.336; max=6407.890)Kibits/s
rngtest: Program run time: 27658884 microseconds

很幸運對於這次運行沒有測試失敗;有時會有一些失敗。但是對於RANDU,情況就很糟糕了:

./randu 17 | 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: 0
rngtest: FIPS 140-2 failures: 1000
rngtest: FIPS 140-2(2001-10-10) Monobit: 730
rngtest: FIPS 140-2(2001-10-10) Poker: 1000
rngtest: FIPS 140-2(2001-10-10) Runs: 289
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=45.630; avg=14255.221; max=19073.486)Mibits/s
rngtest: FIPS tests speed: (min=23.694; avg=154.238; max=176.606)Mibits/s
rngtest: Program run time: 141071 microseconds

看到了麼?好多失敗。它一點兒都不隨機。如果你真的想要測試隨機性,可以采用dieharder測試。雖然它需要執行很長時間。

Copyright © Linux教程網 All Rights Reserved