將偽隨機序列寫入二進製文件的正確方法?
我正在使用 Python 並創建了一個 BBS 實現,它將偽隨機正整數序列輸出到 Python 列表中。我想將此數據寫入二進製文件並通過 ENT 和 Diehard 傳遞以查看它的效果如何,但我不知道如何正確執行此操作。
到目前為止,我一直在將 python 列表中的這些偽隨機序列寫入帶有
struct
包的二進製文件中,但即使是像 BBS 這樣的 PRNG 也嚴重未能通過這些測試,所以我知道我必須將數據錯誤地寫入文件。誰能告訴我將
[85285422, 1065539406, 1143357354, 812899410, 796171749, 531684531, 771767949, 527982099, ...]
python列表中形式的偽隨機整數序列寫入文件以使用ENT和Dieharder進行測試的正確方法?
我想將此數據寫入二進製文件並通過 ENT 和 Diehard 傳遞它以查看它的效果如何
為了測試某件事的效果如何,我們必須對“好”有一個定義。對於 RNG,這幾乎是普遍的:輸出一些離散集合的獨立均勻隨機元素。該集合通常是整數 $ [0,m) $ 對於一些 $ m $ . 耳鼻喉科設計¹ $ m=2^8 $ ,因此是所有可能字節的集合。Diehard(er) 也可以測試,這就是
/dev/urandom
輸出,這是我的建議。問題的順序由²獲得: $ x_{i+1}\gets{x_i}^2\bmod1232592891 $ . 這違反了Blum Blum Shub生成器的安全原理,它要求
- 只有幾個低位 $ x_i $ 通過獲得 $ x_{i+1}\gets{x_i}^2\bmod n $ 應該輸出。
- $ n $ 是一個難以分解的整數³,這意味著 $ n $ 至少有 500 位,即使是溫和的硬度,它也至少有 150 位。
我們最初可以忽略第二個問題。首先,我們可以只取8位,即減少每個產生的模 256 的數字,然後將每個結果作為單獨的字節寫入以二進制模式打開的文件中open。或者將其作為 1 位,減少模 2 並將 8 個連續位分組為 oen 字節。在這兩種情況下,這都會丟棄大部分數據,但這是有一個可以通過的類似隨機序列的必要條件。
學習如何製作一個通過 ENT 和 Diehard(er) 的生成器很有趣。重要的是,應該意識到統計測試不能驗證 RNG,只能使其無效。如果這樣的測試始終產生失敗的結果,那麼測試的序列有一些嚴重的缺陷⁴。但如果它產生一個通過結果,那並不能驗證序列的加密質量。從序列中顯然不可能做到這一點。必須檢查生成序列的原因。
¹ 需要注意的是,ENT 的主要測試對其輸入中的字節順序不敏感:它甚至沒有嘗試評估“某些離散集合的獨立均勻隨機元素”的“獨立”部分。
² 該循環預測整個序列中的下一個值。我從問題的“BBS”中推斷出它的形式,並且輸出值看起來像 10 位十進制整數,第一個數字為 1 或 0 並被抑制。我通過計算找到了模數 $ \gcd({x_{i+1}}^2-x_i,\ {x_{i+2}}^2-x_{i+1}) $ 對於各種 $ i $ 在輸出序列中,然後除以 2。
³ 模數 $ n $ 可以公開,這是建設的顯著特點。
⁴ 或者,測試被濫用或有缺陷。