Random-Number-Generator

關於樸素偽隨機數發生器的可接受性

  • September 12, 2020

我的問題可能既是哲學問題又是技術問題。

背景

我正在開發一個 CSPRNG,我需要在算法中間一步洗牌——任何簡單的洗牌就足夠了。

我心裡有這個問題:

如果一個人選擇限制在“洗牌”算法(見下文)而不是我的整個複雜算法,為什麼會有任何區別?老實說,這讓我感到害怕。


天真的方法

我創建了一個池 $ 10^6 $ 其中 1 正好佔 50% 並連續分佈的位。

$ 1111……0000 $

然後使用非常簡單的 Fisher-Yates 洗牌算法來洗牌。


結果

嘗試不同的種子和序列長度,除了Next Bit Test之外,上述幼稚方法還通過了ALL NISTDieHarder測試。它甚至優於urandomMersenne Twister的結果(我知道後者不是 CSPRNG,但它被廣泛用作 PRNG)。


問題

我相信,如果有人提出上述幼稚的 shuffle 算法,即使其在文獻中的出色結果得到支持,它也會立即被拒絕(儘管我在這裡願意更正)。

那麼讓我困惑的問題是:為什麼?我的意思是“為什麼”在兩個方面:

為什麼這麼幼稚和簡單的事情沒有吸引力**,**為什麼這麼幼稚和簡單的方法會通過所有測試,甚至在上述測試的基礎上超越 urandom 和 MT 算法(在文獻中被用作所提出算法的證據) .

什麼是“真正的”指南針?

為什麼這麼幼稚和簡單的事情沒有吸引力

如果您正在談論一種在內部生成 500,000 0 位和 500,000 1 位的方法,將它們(通過某種方法)洗牌,然後輸出它們,那將不被視為 CSRNG。

什麼是“真正的”指南針?

指南針是“我們能否設計一個有效的測試來區分提議的 CSRNG 的輸出與真正隨機數生成器的輸出(例如,由某人擲硬幣生成)”。該測試將採用一個序列(由 CSRNG 或隨機源生成)並生成 0 或 1 答案;當給定來自 CSRNG 的樣本與來自隨機源的樣本時,如果它以非平凡的不同機率生成 1 個答案,則它被認為是一個區分器。

在 shuffle-rng 情況下,是的;可以要求輸出 1,000,000 位併計算“1”位。對於 shuffle rng,您將得到 500,000 個“1”位;對於真正的隨機源,您很少會得到 500,000 個“1”位(很有可能 $ c 10^{-3} $ 對於一些 $ c $ 離 1 不遠,我懶得抬頭看)。這給了我們一個區分器,因此 shuffle RNG 不是 CSRNG。

此外,您聲明:

上述測試

$$ NIST, Dieharder, Next Bit Test $$(這在文獻中被用作所提出算法的證據)。

實際上,當涉及到 CSRNG 時,這些測試很少被用作證據(而且,坦率地說,當我們遇到將它們作為證據的提案時,這將被視為作者在涉及密碼學)。製作一個通過所有這些測試的生成器很容易,但很容易製作一個區分器(因此不是 CSRNG)。

如果您想確保您正在考慮的 RNG 具有良好的統計特性,那麼這些測試可能就足夠了,因此對於非加密工作可能是合理的;但是在加密貨幣中,我們有相當嚴格的要求。

引用自:https://crypto.stackexchange.com/questions/83892