為什麼 ISAAC 不是偽隨機數生成器?
我被指責混淆了 ISAAC 算法的性質。大量證據表明它是一個加密性強的偽隨機數生成器。批量是指Google搜尋“isaac prng cipher”所指向的權威參考文獻的數量。我提供:-
事實上,唯一將 ISAAC 描述為絕對密碼的地方是 crypto.SE 和 Wikipedia 文章,我們都知道可以歸因於 Wikipedia 的權威。
袁的書也許是最能說明問題的。它清楚地將 ISAAC 歸類為 PRNG,然後繼續建構一個使用它作為密鑰流生成器的密碼系統。Yuen 詳細介紹瞭如何創建播種機制,因為沒有官方密鑰條目,並編寫了 XOR 機制進行加密。這種方法在 ISAAC 的Rosetta Code 條目中重複出現,就像將 ISAAC 描述為 PRNG 一樣。
ISAAC 似乎是 PRNG。因此,正如任何 PRNG 一樣,這使它有資格成為密碼的建構塊。在這方面,如果您在末尾添加一些 XOR 程式碼,那麼中間平方方法也可以用作密碼系統中的構造。我認為這是所有混亂的基礎。但 ISAAC 首先是 PRNG,不是嗎?
嘗試將同步流密碼與 CSPRNG 區分開來在我看來有點像嘗試將冰與冷凍水區分開來。任何安全流密碼都是 CSPRNG,任何 CSPRNG 都可以用作流密碼。
只要有任何區別,它主要歸結為預期目的和 API 設計。典型的 CSPRNG API 可能採用初始種子值(相當於流密碼的密鑰),並允許使用者請求小塊隨機輸出位,而典型的流密碼 API 將使用密鑰和(通常,對於現代密碼設計)IV / nonce,並允許使用者傳遞明文或密文以與輸出密鑰流進行異或。
此外,速度對於一般 CSPRNG 的設計標準可能不像流密碼那樣重要,因為除非將其用作加密的密鑰流,否則很少需要快速大量偽隨機性。
現在,ISAAC 參考實現肯定提供了一個 PRNG 風格的 API:你傳入一個由 256 個 32 位整數組成的種子數組,然後請求以 32 位塊的形式輸出(一次一個,或者一次 256 個塊)直接訪問輸入/輸出緩衝區)。C API 確實允許將種子/輸出緩衝區視為 1024 字節的數組(如 ISAAC 質詢程式碼中所示,它使用 ASCII 字元串為生成器提供種子),但轉換是隱式的並且依賴於平台(由於字節序問題)。
然而,雖然 ISAAC API 是 PRNG 的 API,但算法本身的設計顯然考慮了性能,並且旨在與早期的流密碼設計(如 RC4)競爭。所以,是的,Jenkins 提出的 ISAAC 主要是一個 PRNG,但它可以用作流密碼。