關於隨機性的問題:如果隨機看起來“人”怎麼辦?
我讀了很多關於熵/隨機性的東西。但是**,如果隨機生成器(數字或字元串)一旦輸出“人類”模式怎麼辦?**
我知道這不太可能發生,但**如果隨機碼密碼生成器生成“1 2 3 4”密碼,我們會說什麼?**它將由隨機生成器(或考慮)生成,但不幸的是,這並不像我們預期的那樣隨機?
我知道這是一個奇怪的問題,但我很想听到有人說隨機輸出看起來並不隨機。
簡短回答/ tl;博士:是的,這可能發生,但大多數情況下沒問題。
序列“1234”對於輸出從 0 到 9 的 4 個數字的模式的生成器來說是一個完全正常的輸出。如果每個可能的序列都具有相同的被用作輸出的機率(稱為均勻分佈),則比“1234”與“7392”甚至“0000”一樣可能。可能序列的數量是 $ 10^4 = 10000 \approx 2^{13} $ , 約 13 位。
但是,如果我們知道攻擊者會從“0000”開始猜測序列並在每次下一次猜測時遞增它呢?序列“0010”只需要 10 次嘗試就可以被猜到。如果它低於“1000”,我們可以生成一個序列並拒絕它。對於攻擊者來說,每個序列至少需要 1000 次猜測。但是如果他命令她知道我們這樣做呢?從“1000”而不是“0000”開始沒有問題,我們將輸出的整體空間減少了 1000。這不好。我們刪除了 10% 的初始密鑰空間。即使我們接受這一點,10000 或 9000 種可能性也不足以應對幾乎所有類型的攻擊。
如果我們有更好的隨機輸出呢?像“bA3-)#kjeGER3s!H”這樣的東西?這是 16 個字元的隨機序列。生成器是均勻分佈的,並且具有以下可能的字元:所有小寫和大寫字母,從 0 到 10 的數字,以及特殊字元 /?’!#",.;:%&=()
$$ $${}<>-_ 和美元符號。總而言之 $ 26+26+10+25 = 87 $ 可能性。包含 16 個字元的序列 $ 87^{16} \approx 10^{31} \approx 2^{103} $ , 約 103 位。用作分組密碼的密鑰,它應該可以抵禦任何攻擊,即使是來自 NSA 或任何其他政府機構的攻擊。(這裡不再贅述,與題目無關。) 不好的部分是,如果我們的序列現在類似於“aaaaaaaaaaaaaaaa”怎麼辦?嘗試每個字元,重複 16 次,沒什麼特別的。它可以在幾毫秒內完成。(使用一個好的密鑰派生函式會有所幫助,但這不是重點。)我們可以拒絕每個“可疑的”序列並重複序列的生成。如果我們刪除更多像“secretpassword11”這樣的東西,我們會損失一些位熵,但 80 位(非常悲觀的估計)仍然足夠高。
我們應該這樣做嗎?好吧,我們為什麼要這樣做?獲得(隨機)其中之一的機會 $ 2^{23} $ 的 $ 2^{103} $ 可能性接近於 0。( $ \frac{2^{23}}{2^{103}} \approx 10^{-24} $ ) 我們必須生成數百萬個序列才能獲得其中一個“壞數字”的可能性很小。永遠記住:攻擊者可以調整他或她的攻擊,甚至不測試這個特殊數字。
可能會出現“人類”輸出。它只是發生了,甚至是意料之中的。這是評估隨機數生成器的基本問題之一。“現在輸出 0000 正常還是我的發電機壞了?” - 我們無法回答這個問題。是的,可能沒問題,或者你的發電機壞了。我們不知道。
總而言之,您不必擔心這一點。在小範圍內,您還有其他問題,而在較大範圍內,統計機率小到幾乎不會發生。
密碼學以外的其他主題:如果您使用更大範圍的均勻分佈數字進行科學研究,請不要減少輸入範圍!您會扭曲輸出統計數據,從而使您的整個工作無法使用。