2015-10-05 243 views
0

我需要在特定範圍內生成256位長的密碼安全隨機數。我使用適合於隨機數發生器的微控制器(生產商聲稱它是基於熱噪聲的真隨機數)。 要生成的數字的上限是以字節數組的形式給出的。我的問題是:會是安全的,得到由字節的隨機數字節,並執行:如何在嵌入式系統上產生一個範圍內的256位隨機數

n[i] = rand[i] mod limit[i] 

,其中n [i]是我的電話號碼等

+2

您應該使用* all *由硬件生成器提供的位,而不是特定的單個字節。 – Clifford

+0

請注意,如果原始隨機數的上限不是您需要的上限的偶數倍數,則將會存在模數偏差。要看到這一點,想象通過取出拋出的數字的模數來拋出一個骰子來生成1至5的數字。您可以很容易地看到1或6與1模5一致,其中每個其他可能的值只有一個模面。因此,在這個系統中,2,3,4或5中的每一個都有1/5的機會,但是2/5的機會是1。 – WDS

+0

有沒有辦法避免這種偏見? –

回答

0

的標準方法的第i個字節使用所有的位由RNG是:

number <- random() 
while (number outside range) 
    number <- random() 
endwhile 
return number 

有一些調整可能的,如果需要的範圍是RNG輸出的不到一半大小,但我認爲不是這樣的位置:它會降低輸出大小增加一位或多位。鑑於此,那麼while循環通常只會被輸入一次或兩次,如果有的話。

比較字節數組非常簡單,並且通常可以快速比較最重要的字節。如果最重要的字節不同,則根本不需要比較較不重要的字節。我們可以知道7,###,###,###大於5,###,###,###而不知道#代表什麼數字。

+0

RNG給我儘可能多的字節。也就是說,硬件有一個軟件庫,我不能避免。該API使我將隨機字節的RNG集中起來,我無法獲得儘可能多的我想要的。更多的是,我必須等待和未定義字節的時間。但你的解決方案可能會很好,謝謝 –

+0

你的alghoritm對我很好,謝謝:) –

相關問題