在使用 NIST 套件或像 dieharder 之類的工具測試它們之前連接(偽)隨機字節值是否正確?
假設我有數千個(偽)隨機 4 字節值。這些值是黑盒設備給我的 4 字節隨機值。我通過請求獲得了這些值。在其他人之間也可能要求他們(我不知道)。現在我想測試它們的隨機性。有一些工具可以解決這個問題,例如dieharder或NIST Statistical Test Suite。
僅連接數千個 4 字節值是否有效,以便最終得到一個非常長的字節(n * 1000 * 4 字節)流,然後將其輸入這些工具?
單個值(4字節)之前的測試時間無關緊要是否正確?(因為測試工具一開始就不知道我有 4 字節的值,一旦我將它們連接起來?)。
編輯:這個問題是一個一般性問題。實際的潛在問題是如何檢查隨機性的種子值,這是我通過 UDS 安全訪問獲得的(參見https://en.wikipedia.org/wiki/Unified_Diagnostic_Services#Services $27)。
對於任何強大的統計測試來說,數千字節的樣本都遠遠不夠。您擁有的樣本越少,給定測試的靈敏度就越低。
如果您連接統計上獨立的統一樣本,那麼測試應該通過生成的字節流。只要順序不取決於這些位的值,如何重新排列這些位並不重要。(反轉和位交織,但不將字節重新排列為升序。)
一些統計測試對順序不敏感。例如,基本頻率測試和基於均值、中值、變異數的測試。然而,測試套件包括許多不同類型的測試,其中一些是順序敏感的。來自理想隨機源的重新排列的位應該通過順序敏感和順序不敏感的測試。
涉及重新排序的不同方法用於測試非加密 RNG。對測試數據單次通過的一項改進是重複測試,每個 32 位字內的位順序顛倒。這在 Sebastiano Vigna 的涉及RNG 測試的論文中有所記載。這樣做是因為測試對低位中的模式不太敏感,還因為非加密 RNG 通常在高位中“更多”隨機而在低位中“更少”隨機。
來自多個生成器的樣本的循環交織是在一篇論文中完成的,“更好的可拆分偽隨機數生成器(和幾乎一樣快) ”作為測試來自同一家族的 RNG 的相關性的技巧。它不是檢測這種相關性的完全可靠的方法。
只要不引入偏差,對測試套件輸入的其他類型的修改將具有與重新排序相同的效果。例如,對輸出的每一位求反,通過常量對流進行異或運算,或者使用帶常量的模加法。
無論您如何改變(無偏見)其輸出,一個好的 RNG 都會通過。一個壞的 RNG在以某種方式轉換(加擾)其輸出之前或之後可能會失敗或可能不會。
這種轉換不會將不安全的 RNG 變成安全的 RNG。一個糟糕的 RNG 在應用各種突變後可以通過全部或部分統計測試。這並不意味著輸入實際上是隨機的或不可預測的。
積極的 RNG 測試套件結果(未通過“隨機性”測試)通常表明數據不是隨機的。存在誤報,但可以通過使用不同數據多次執行測試來檢測它們。然而,假陰性是 RNG 測試套件中的一個非常嚴重的缺陷。
通過任何數量的統計測試都不會告訴您 RNG 或密碼是否安全。製作具有足夠明顯隨機性的算法以通過您對其進行的任何黑盒統計測試非常容易,但設計安全算法要困難得多。
這同樣適用於硬體 TRNG 的輸出。事實上,您無法區分真正的隨機輸出和生成的輸出之間的區別,例如,使用只有設備製造商知道的密鑰加密的計數器。(就像在後門的 RNG 中一樣。)統計測試無法告訴您硬體 RNG 產生了多少熵。他們也不能告訴你雜訊源是否實際上是不可預測的。
總之:
- 通過 RNG 測試並不意味著輸出實際上是無模式的、統計上無偏的或安全的。
- 持續失敗的測試表明存在明確的問題。
- 應用於統一 IID 位串的無偏變換會產生一個同樣無偏的新字元串。
- 加擾輸出可以隱藏統計偽影,但它不能將不安全的 RNG 轉換為安全的 RNG。
- RNG 測試套件實際上對密碼學毫無用處
- 某些事情可能表面上是隨機的,但實際上卻是不可預測的。
僅連接數千個 4 字節值是否有效,以便最終得到一個非常長的字節(n * 1000 * 4 字節)流,然後將其輸入這些工具?
單個值(4字節)之前的測試時間無關緊要是否正確?
兩者都是。其他人可能在採樣時從源中獲得(並消除了)隨機性,或/和样本以某種特定方式分組以進行測試的事實並不妨礙測試所獲得的內容。這不會導致有效測試更頻繁地失敗,假設源的完整輸出與隨機無法區分(包括其他試圖使測試通過或失敗的人)。
另一方面,這些相同的事實可能會使測試任意地降低檢測某些故障的能力。作為一個極端的例子,如果我們對它的輸出進行二次採樣,保留每個奇數字節,那麼總是重複它輸出的每個字節的源可能與真正的隨機無法區分。
實際的潛在問題是如何檢查種子值的隨機性。
Dieharder 或 NIST Statistical Test Suite本身無法對此做出任何保證。充其量,他們可以高度自信地指示失敗,這可以避免執行進一步的工作(除了檢查測試是否正確執行/工作)。如果它們表示通過,則僅憑此無法得出其他確定的結論。需要知道種子值是如何生成的,而這不能通過種子值的測試來確定。
為了證明這些測試無法驗證未知建構源的加密目的的適用性,請考慮具有以下特性的 RNG:
- 以秒為單位的實時時鐘,在啟動時初始化 128 位寄存器,延遲 1 秒
- 然後使用 AES-256 和密鑰對寄存器進行反復加密以產生下一個寄存器值,該值連接 128 位值形成輸出的大部分,通過千兆乙太網介面查詢。
只要測試不使用 AES-256 和正確的密鑰,此源將通過任何不拒絕良好發生器的黑盒測試,包括檢查開機的測試。
但從密碼學的角度來看,這個來源是災難性的。給定密鑰和黑匣子何時啟動,其輸出是可預測的。給定序列的鍵和片段,可以計算所有其餘部分。一些在後台從源中吃字節的一方甚至可以決定使用源的另一方將得到什麼!
正如其他人所指出的,許多統計測試,包括一些 DieHarder 套件,都需要兆字節的輸入。完整的 Dieharder 需要千兆字節。
然而,在適當結構的加密 RNG 的上下文中,不需要這些需要大量輸入的測試。有意義的測試是那些在無條件(或輕微條件)熵源上的測試,用於播種 CSPRNG。源通過測試驗證,目的是確保它提供一些熵。CSPRNG 通過檢查其設計和已知答案測試來驗證。RNG 中的一些監控應該檢測到源中的故障,在這種情況下會阻止輸出。可以通過對整個事物的額外測試來檢查組合,但這只有在有某種保證時才有意義,否則會獲得整體結構確實是 CSPRNG 的源頭,並受到監控。