[英]How to get truly random data, not random data fed into a PRNG seed like CSRNG's do?
據我了解,像 RNGCryptoServiceProvider 這樣的CSRNG仍然通過 PRNG 傳遞真正隨機的用戶數據,如鼠標移動等,以對 output 進行清理並使其均勻分布。 這些位需要完全獨立。
(這是針對理論上無限計算能力的攻擊者)如果 CSRNG 取 1KB 的真隨機數據並擴展為 1MB,攻擊者所要做的就是生成 1KB 數據的每個組合,展開它,看看是哪個 1MB 數據生成一個一次性墊,返回明智的英語 output。 我在某處讀到,如果一次性墊在 RNG 中的任何地方都有 PRNG,它只是一個美化的 stream 密碼。 我想知道真正隨機的起始數據是否足夠大,可以直接使用而不是加密擴展。 我需要真正隨機的 output 用於一次性墊,而不僅僅是加密安全的 RNG。 或者也許有其他方法可以以某種方式獲得真正的隨機數據,以便所有位相互獨立。 我正在考慮用鼠標坐標異或幾秒鍾,然后可能是 Environment.TickCount 的最后一個數字,然后可能還有麥克風輸入( 1、2、3、4 ) 。 但是,正如一些人在 stackoverflow 上指出的那樣,我真的應該讓操作系統來處理這一切。 不幸的是,這是不可能的,因為使用了 PSRNG。 我想避免使用硬件解決方案,因為這是一個易於使用的程序,並且也不使用 RDRAND,因為它也使用 PRNG(除非 RDRAND 可以在通過 PRNG 之前返回真正的隨機數據??) . 如果這樣的事情是可能的,將不勝感激; 我已經為此工作了數周,我的印象是 RNGCryptoServiceProvider 足以滿足一次性使用的需求。 謝謝。
(旁注:有人說對於大多數加密函數,你不需要真正的熵,只是不可預測性。對於一次性填充,它必須是隨機的,否則它不是一次性填充。)
如您所知,“真正隨機”意味着每個位都獨立於其他所有內容並且是均勻分布的。 然而,這個理想在實踐中很難實現,如果不是不可能的話。 一般來說,在實踐中獲得“真正隨機數據”的最接近的方法是從非確定性來源收集難以猜測的位,然后將這些位壓縮成一個隨機數據塊。
使這種接近“真正隨機數據”的問題涉及許多問題,包括以下內容:
一般來說,對於隨機數生成的目的,可用的資源越多越好。
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.