簡體   English   中英

如何獲得真正的隨機數據,而不是像 CSRNG 那樣輸入 PRNG 種子的隨機數據?

[英]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 足以滿足一次性使用的需求。 謝謝。

(旁注:有人說對於大多數加密函數,你不需要真正的熵,只是不可預測性。對於一次性填充,它必須是隨機的,否則它不是一次性填充。)

如您所知,“真正隨機”意味着每個位都獨立於其他所有內容並且是均勻分布的。 然而,這個理想在實踐中很難實現,如果不是不可能的話。 一般來說,在實踐中獲得“真正隨機數據”的最接近的方法是從非確定性來源收集難以猜測的位,然后將這些位壓縮成一個隨機數據塊。

使這種接近“真正隨機數據”的問題涉及許多問題,包括以下內容:

  1. 源必須是不確定的,也就是說,它們的 output 不能由它們的輸入確定。 非確定性來源的例子包括輸入設備的時序; 熱噪聲; 以及麥克風和攝像頭輸出記錄的噪聲。
  2. 消息來源的 output 一定很難猜到。 這更正式地稱為,例如每 64 位 output 有 32 位熵。 然而,測量熵絕非易事。 如果您需要 1 MB(800 萬位)的真正隨機數據,則需要具有至少 800 萬位熵的數據(實際上,根據來源,熵的長度將超過 1 MB 的許多倍),然后將數據以某種方式轉換為 1 MB 的數據,同時保留該熵。
  3. 源必須相互獨立。
  4. 應該有兩個或多個獨立的來源。 這是因為不可能僅從一個來源中提取完全隨機性(參見 McInnes 和 Pinkas 1990)。 另一方面,從三個或更多獨立源中提取隨機性相對微不足道,但仍然存在選擇合適的隨機性提取器的問題,並且隨機性提取器的調查將超出此答案的 scope。

一般來說,對於隨機數生成的目的,可用的資源越多越好。

參考:

  • McInnes, JL 和 Pinkas, B.(1990 年 8 月)。 關於弱隨機密鑰的私鑰密碼學的不可能性。 在密碼學理論與應用會議上(第 421-435 頁)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM