Cryptanalysis

是什麼導致了這個程序的隨機性差:LCG,還是程序邏輯本身?

  • September 6, 2014

(加密之神,我應該首先強調我並沒有失去理智:我不是在現實生活中這樣做,我只是想了解正在發生的事情背後的理論。在你的幫助下,希望我能做到.)

假設我選擇線性同餘生成器的參數 $ L $ ,並挑選一顆種子 $ L_0 $ . 然後我使用 LCG 生成順序偽隨機數 $ L_1, L_2 $ 對於以下程序(為了論證,它在 52 元素數組中選擇兩個不同的索引):

$ x := L_1 \bmod 52 $

$ y := (x + 1 + (L_2 \bmod 51)) \bmod 52 $

假設我選擇 $ m = 8192 $ , $ a = 4801 $ , 和 $ c = 83 $ . 通過查看價值 $ x $ , 我可以學到很多關於 $ y $ : 對於任何 $ x $ ,只有大約九到十個可能的後續 $ y $ s,而且它們的分佈非常不均勻。

然後我嘗試了其他值 $ a $ 和 $ c $ ,得到了非常不同的結果:例如, $ a = 2049 $ 和 $ c = 8141 $ 給出一個產生所有可能值的分佈 $ y $ 對於給定的 $ x $ , 分佈更加均勻。還是很差,但是和第一組參數相比,提升很大。

我的問題是:是什麼導致了這種劇烈的變化?我最初認為這可能是因為 $ m = 8192 $ , $ a = 4801 $ , 和 $ c = 83 $ 不滿足最大周期長度定理,但後來我意識到(a)它們確實如此,並且(b)無論如何都不太可能在這種規模上造成這種影響,因為我只按順序生成兩個數字。是使用 LCG 輸出的方式的某些屬性導致了這種行為,還是 LCG 本身固有的?如果是後者,是否有一個定理說明了為了聯合分佈而必須保持的一些性質 $ x $ 和 $ y $ 統一(盡可能,鑑於程序保證 $ x \neq y $ )?

假設我選擇 $ m = 8192 $ , $ a = 4801 $ , 和 $ c = 83 $ . 通過查看價值 $ x $ , 我可以學到很多關於 $ y $ : 對於任何 $ x $ ,只有大約九到十個可能的後續 $ y $ s,而且它們的分佈非常不均勻。

每一個 LCG $ L_1 $ 有一個可能 $ L_2 $ ,並且對於最大周期,反之亦然。每個都有你的公式 $ x $ 對應於大約 $ m/52 $ 可能的 $ L_1 $ , 因此 $ m/52 $ 可能的 $ L_2 $ .

的形式 $ L_1 $ 對於給定的 $ x $ 是 $ L_1 = x + 52n $ , 對於一些 $ n $ . 就這樣 $ L_2 $ 對於給定的 $ x $ 是:

$$ L_2 = (52an + ax + c) \mod m $$ 你想要的是不同的值 $ n $ 給予不同的 $ L_2 $ , 即它是一個體面的 LCG $ a’ = 52a $ 和 $ c’ = ax + c $ . 代替 $ a $ 你得到 $ a’ = 3892 = 2^2 \cdot 7 \cdot 139 $ . 最長期限 $ a’-1 = 3891 = 3 \cdot 1297 $ 必須能被 4 整除(由於 $ m $ 存在),但事實並非如此,因此正如您所觀察到的,這將產生非常糟糕的結果。

如果您解決了這個問題,例如通過選擇另一個值 $ m $ ,你還需要考慮一個條件 $ c’ $ 以及隨後的模組化減少和添加 $ x $ 影響它。此外,從範圍中減少一個隨機數 $ 0 \le x < m $ 模 52 將始終偏向小數字,除非 $ m $ 是 52 的倍數。

引用自:https://crypto.stackexchange.com/questions/19001