Cryptanalysis
有什麼著名的分析數據隨機性的方法嗎?
我正在編寫一個函式,它允許我分析一些輸入數據的隨機性並返回一些關於這些數據是隨機機率的統計數據。
顯然它應該基於兩點:
- 找到/未找到每個字節值的頻率(隨機性/分佈)
- 我們有多少數據(確定性)
所以我的函式的輸出中有兩個值:
- “randomness” (0 - 100) 告訴字節看起來有多隨機(不管我們有多少數據)
- “randomlike” (0.001 - 99.999),它告訴整個數據是隨機的(隨機性和長度的組合)的一般可能性。
有沒有一種著名的方法,或者我必須從頭開始重新考慮整個邏輯?這可能是密碼學中廣泛使用的東西,因為這是我們可以測試密鑰的方式:解密的數據是高度隨機的,直到密鑰正確為止。
我不是在尋找任何特定的語言,只是數學/邏輯方法。
令我困惑的一件事是:50% 的隨機性對應於什麼?它是主觀的東西(如藝術……)還是數學有一些科學的方法來定義“50%隨機性”的含義。
就隨機性的度量而言,通常接受的度量是香農熵。在這個意義上,例如 00 1/2 時間、01 1/4 時間、10 1/8 時間和 11 1/8 時間的 2 個隨機位將代表 1.75 位隨機數(從 $ \frac12+2\times\frac14+3\times\frac18+3\times\frac18 $ ).
那麼在你的例子中,如果我們採樣 $ N $ 字節和字節 $ i $ 過來 $ b_i $ 我們計算的時間 $ p_i=b_i/N $ 然後總和 $$ -\sum_ip_i\log_{256}p_i $$ 這就是您從每個字節中獲得的一個字節的隨機值的“比例”。通過採取 $ N $ 越大,您的估計的信賴區間就越緊,我會在細節上聽從更好的統計學家。
但請注意,如果您僅通過將它們列出 0、1、2、…、255、0、1、2… 來生成字節,那麼即使大多數人會說這不是非常隨機。
為了衡量樣本產生統一隨機字節的可能性,您應該執行Pearson $ \chi^2 $ 對數據進行測試。
對於更一般的隨機性測試,還可以考慮Marsaglia 的 Diehard 測試。