為什麼真隨機數生成器 (TRNG) 的輸出在壓縮後不安全?
我遇到了以下關於真隨機數生成器(TRNG)的聲明:
“P1 介質”$$ AIS31 $$由於密碼學原因,真隨機數生成器 (TRNG) 可能無法直接使用。即使是擁有高質量物理隨機源的智能卡或其他高級安全解決方案,通常也至少依賴於 TRNG 輸出的壓縮。
我的問題是,TRNG 輸出的壓縮導致它不安全的原因是什麼?我已經嘗試過搜尋,但在上述引用來自的規範或我在網上查看的任何地方,我都找不到關於這一點的更多資訊。
我唯一能想到的是,可以根據輸入以某種方式預測壓縮算法的結果。但是,如果輸入是隨機生成的,我不明白這有什麼關係。
我認為你誤解了來源。消息人士稱,TRNG“依賴”壓縮(加密散列將是壓縮函式,或者可能是一些更簡單的函式來增加吞吐量)。
隨機數據在壓縮後不是不安全的,在壓縮前是不安全的。
為什麼?
當你擲骰子時,它成為任何一個可能值的機率相同,但是假設骰子不是很完美 - 在自然界中,你會發現事物幾乎總是更像加權骰子而不是完美的 RNG。
如果輸出有偏差,則意味著它不太可能產生某些輸出,從而破壞了 RNG 的安全性——為了使 CSPRNG 安全,它必須以相等的機率產生每個輸出,並且 TRNG 不能免除該規則。
解決方案是使用比您計劃使用更多的隨機字節,然後使用壓縮函式來合併它們。它可以像對每對字節進行異或一樣簡單,也可以像加密雜湊一樣經過深思熟慮,但您需要一些東西來平衡機率。
也就是說,使用壓縮功能(例如用於縮小 ZIP 文件的壓縮功能)將是一種以您不想要的方式弄亂機率的簡單方法,因此應該避免這種情況,但這不是他們所指的。
tl;dr – 它實際上並不是一個真正的隨機生成器,而是一個物理來源的隨機生成器。底層物理過程可以具有壓縮有助於剝離的模式,從而提高生成器的質量。
在上下文中,“真正的”隨機性是指源自物理現象的隨機性,而不是源自確定性算法的偽隨機性。
我的建議是不要從字面上過度理解術語:它不是真正的“真正的”隨機性(否則它首先不應該是可行的可壓縮的),而是物理來源的隨機性。
壓縮實際上有助於提高生成的隨機性。從根本上說,壓縮是通過辨識模式並更簡潔地重新描述它們來工作的,因此,通過壓縮某些東西,您可以去除可預測的相關性。原則上,任何理論上最佳的壓縮算法都將確保(實際上)真正的隨機性——這是在加密數據之前壓縮數據的主要原因。
壓縮原始數據流的三個原因。
壓縮數據流有 3 個重要原因:
- 原始數據比熵還多。
- 很難將熵正確地分類為獨立的結果。
- 熵是主觀的,攻擊者可能會更好地對其建模。
原因 1:原始數據多於熵。
假設您正在使用硬幣翻轉生成隨機數據。
如果它是一個公平的硬幣,那麼每次翻轉都有一個熵 $$ \begin{alignat}{7} H ~=~ & - \sum_{\forall \text{outcomes}~i}{\left(P\left(x_i\right) \log_{2}{\left(P\left(x_i\right)\right)}\right)} \ ~=~ &
- \left( \frac{1}{2} \log_{2}{\left(\frac{1}{2}\right)}
- \frac{1}{2} \log_{2}{\left(\frac{1}{2}\right)} \right) \ ~=~ & 1 , \mathrm{bit} ,, \end{alignat} $$ 意思是有 $ 1 , \mathrm{bit} $ 的熵。
然而,有偏差的硬幣每次翻轉產生的熵更少。使用與上述相同的等式處理傾向於著陸單挑的硬幣: $$ {\def\Entry#1#2{ #1 % & #2 \[-25px] \hline }} { \begin{array}{|c|c|} \hline \begin{array}{c}\textbf{Odds of} \[-25px] \textbf{Heads}\end{array} & \begin{array}{c} \textbf{Entropy} \[-25px] \left(\frac{\mathrm{bit}}{\mathrm{flip}}\right) \end{array} \ \hline \Entry{50}{1\phantom{.000}} \Entry{55}{0.993} \Entry{60}{0.971} \Entry{65}{0.934} \Entry{70}{0.881} \Entry{75}{0.811} \Entry{80}{0.722} \Entry{85}{0.610} \Entry{90}{0.469} \Entry{95}{0.286} \Entry{100}{0\phantom{.000}} \end{array} }_{\Large{.}} $$
因此,除非您擁有理想的公平硬幣,否則您的熵將少於翻轉。
原因 2:難以將熵正確分類到獨立的 bin 中。
假設我們想要 2 位熵,所以我們用已知偏差擲硬幣:它會落在正面 $ 50.001 % $ 當時,大約 $ 0.9999999997 \frac{\mathrm{bit}}{\mathrm{flip}} , $ 或大約 $ 3 \times {10}^{-10} \frac{\mathrm{bit}}{\mathrm{flip}} $ 從完美。
擲硬幣三遍幾乎可以給我們 $ 3 , \mathrm{bits} $ 熵——超過 $ 2 , \mathrm{bits} $ 我們想要的。但是,不幸的是,3 次翻轉是不夠的。
問題是我們不能裝箱。3次拋硬幣有8種可能的結果, $$ { \begin{array}{ccc|c} \text{H} & \text{H} & \text{H} & h^3 t^0 \[-25px] \text{H} & \text{H} & \text{T} & h^2 t^1 \[-25px] \text{H} & \text{T} & \text{H} & h^2 t^1 \[-25px] \text{H} & \text{T} & \text{T} & h^1 t^2 \[-25px] \text{T} & \text{H} & \text{H} & h^2 t^1 \[-25px] \text{T} & \text{H} & \text{T} & h^1 t^2 \[-25px] \text{T} & \text{T} & \text{H} & h^1 t^2 \[-25px] \text{T} & \text{T} & \text{T} & h^0 t^3 \end{array} }_{\Large{,}} $$ 給我們8個不同的結果:
- 1 $ h^3 ; $
- 3 $ h^2 t ; $
- 3 $ h t^2 ; $
- 1 $ t^3 . $
為了獲得 2 位熵,我們希望將所有可能的結果分類為 $ 2^2=4 $ 等機率的 bins,其中每個 bin 代表一個可能的隨機結果流: $ \left{0,0\right}, $ $ \left{0,1\right}, $ $ \left{1,0\right}, $ 或者 $ \left{1,1\right}. $ 然後,一旦我們完成翻轉,我們選擇包含觀察到的結果的 bin,產生相應的隨機結果流。
原因3:熵的主觀性。
在現實生活中,我們沒有公平的硬幣,甚至沒有已知的均勻偏差的硬幣。
例如,假設您要使用硬幣生成隨機數據。你會怎麼做呢?可能最好從翻轉它開始嘗試猜測它的偏見,對吧?然後假設實驗偏差開始使用硬幣產生隨機數據?
如果攻擊者比你更了解拋硬幣模型怎麼辦?例如,如果硬幣往往磨損不均勻,或者拋硬幣的人/機器會隨著時間的推移改變他們的行為,而攻擊者知道但你不知道怎麼辦?或者如果攻擊者只是看著你翻轉足夠長的時間以獲得比你開始使用硬幣之前獲得的更多的數據怎麼辦?
這樣的攻擊者會預測拋硬幣結果的不同可能性。他們會計算不同的熵,並且可能會發現您建構的任何微調的分箱策略都是不完美的。也許他們會找到一種方法來利用這種缺陷來破解您在隨機預言假設下試圖隱藏的任何秘密。
簡而言之,這是第三個問題:雖然我們可以通過數學來微調我們的過程,如果我們假設我們完全了解基礎物理,但這不是現實世界的運作方式;攻擊者可以將您自己的隨機數據生成視為實驗性試驗,以對您的底層物理系統進行科學研究以更好地對其進行建模。
解決這3個問題。
所以我們發現了3個問題:
- 每次試驗的熵可能不太理想,這意味著我們無法生成與實驗數據一樣多的隨機數據。
- 合併可能的結果可能是有損失的,產生的熵比簡單計算所暗示的要少。這需要生成更多數據,即使這樣,分箱也可能並不完美。
- 所有這些模型都是經驗性的和不完善的。專門的或高級的攻擊者可能能夠比隨機數據生成器更好地模擬底層物理,從而打破隨機數據生成器的假設。
簡而言之,“真”隨機數生成器 (TRNG)(我真的不喜歡這個術語,但這是另一個咆哮)的輸出在被壓縮之前可能是不安全的。
這些壓縮方法解決了這些問題(無論如何,在實際意義上)。
- 通過減少產生的隨機數據以更符合實驗熵,隨機數據代表“真實”熵的想法對某些人來說似乎更合理。
- 加密雜湊函式可防止攻擊者試圖反算任何東西。
最終,這是一個笨拙的過程,可能並不像人們想像的那麼強大,但它給了每個人他們想要的東西。想要相信隨機數據是真正獨立的人可以通過具有實驗源熵的看似合理性來持有這種信念,而想要隨機數據的人可以由密碼散列函式的力量提供。
概括。
在生成所謂的“真實”隨機數據的常見實踐中存在很多理論問題,但是有損加密散列所有內容使其工作。
因此,您的消息來源可能意味著物理過程產生的實驗數據在有損加密散列(他們稱為“壓縮”)***之前是不安全的。***但正是這一步驟旨在解決所有這些問題。