Random-Number-Generator
我的 OTP 程序有多安全?
我正在編寫一個一次性的加密程序,因為我對*“如果使用正確,加密已被證明是不可能破解的”*的想法非常感興趣。
我編寫程序只是為了好玩,因為程式和密碼學是我的愛好。因此,我不希望該程序用於高度易受攻擊的數據。我只是想知道我的程序有多安全,以及我可以改進什麼(考慮到黑客無法訪問密鑰文件)。
該程序開始於:
- 在程序開始時根據滑鼠移動座標製作一個包含 50 個數字的列表。
- 然後,該數字列表是 ISAAC 隨機數生成器的種子(更多資訊在這裡)。
- 根據要加密的文件的大小生成密鑰文件。密鑰文件由 ISAAC 隨機數生成器中的隨機數生成。
- 將要加密的文件和生成的密鑰文件進行異或運算並保存到一個新文件——密文文件中。
- (解密)通過對密鑰文件和密文文件進行異或運算,得到明文文件。
OTP 的完美安全性取決於這樣一個事實,即必須從所有可能的密鑰(即一定長度的所有位串)的域中真正隨機且均勻地選擇密鑰。您的方法的問題是您使用偽隨機數生成器來生成密鑰。
生成器有多好並不重要,因為可用於生成密鑰的熵受您使用的種子的限制。
讓我們假設您使用的 50 個數字是真正隨機且均勻分佈的——這至少對於滑鼠移動是值得商榷的。如果您在某個範圍內使用 50 個數字,可以說介於 $ 0 $ 和 $ x-1 $ ,那麼對於任何大小的文件,您最多只能生成 $ x^{50} $ 不同的鍵。
顯然,對於足夠大的文件,這遠小於所有可能密鑰的總數,因此,您的完美安全性不再成立。
例如,攻擊將包括決定兩條消息中的哪一條 $ m_1,m_2 $ 以密文加密(您的基本不可區分遊戲)。請記住,為了完美的安全性,攻擊者的執行時間是無限的。這意味著 $ \mathcal{A} $ 可以列舉所有 $ x^{50} $ 可能的密鑰並檢查其中是否有任何密鑰將密文解密為兩條消息之一。這基本上是可行的,因為可能的密鑰數量比它應該的要少得多,而且密文也可以被解密為另一條消息的機會非常小(對於足夠大的消息)。