Random-Number-Generator

如何從秘密字母數字密鑰生成非週期性的、理論上無限的數字序列

  • December 26, 2020

是否有算法可以基於字母數字密鑰創建非週期性的、理論上無限的數字序列?這個想法是從一個秘密的字母數字密鑰中產生始終相同的唯一序列,其中該序列不會洩漏有關使用的密鑰的資訊,並且從加密的立場看起來足夠隨機。如果密鑰只改變一點,則模式完全不同。有沒有一種已知的安全方法來產生這個?

這裡有很多選項,因為您基本上可以使用任何具有單個鍵輸入和可配置輸出量的算法:

  1. 一個 DRBG(或 CSPRNG),例如Hash_DRBG 或 CTR_DRBG
  2. 流模式下的流密碼或分組密碼,例如計數器模式下的 Salsa20 或 AES;
  3. KBKDF,例如 HKDF;
  4. XOF,例如 SHAKE256 (SHA-3)。

原則上,DRBG(確定性隨機位生成器)似乎是最佳選擇。DRBG 基本上將種子轉換為隨機字節流。然而,它可能會要求重新播種,這可能是個問題。要解決此問題,只需在流中的同一點繼續為其提供相同的值或零字節,就可以了。此外,DRBG 需要明確定義;一些程式 API 會在沒有通知的情況下更改算法。這可能意味著幾乎沒有可用的實現——如果有的話,因為它們中的大多數只是為了返回不可預測的隨機數而設計的。請注意,DRBG 也稱為 CSPRNG - 一種加密安全的隨機數生成器,有時也稱為 PRNG。

流密碼採用對稱密鑰(可能還有 IV)並將其轉換為由幾乎無限量的字節組成的偽隨機密鑰流。這是完全確定的,不需要重新播種。請注意,此密鑰流是為加密而不是隨機創建的。計數器(CTR 或 SIC)模式加密的一個奇怪特性是它從不重複一個塊,這將它與隨機字節流區分開來。然而,隨機創建例如兩個相同的 128 位塊的機會無限小,因此這不應該造成問題。

KBKDF - 基於密鑰的密鑰派生函式 - 例如 HKDF 通常可以被視為具有提取和擴展階段。首先在提取過程中將初始密鑰中的熵放入狀態。然後使用此狀態生成幾乎無限量的字節。這稱為擴展階段。這種方法的問題是大多數 KDF 都希望預先定義輸出大小。

XOF - 可擴展輸出函式 - 可以通過使用密鑰作為 XOF 的輸入並將隨機流定義為 XOF 的輸出來使用。這可能是最容易使用的功能。輸入不必是特定的大小,並且該函式被定義為流出資訊。然而,主要的已知 XOF、SHAKE128 和 SHAKE256 是 SHA-3 規範的一部分,可能不適用於所有執行時。


要使用您的字母數字鍵,您首先需要將其轉換為您決定使用的功能可接受的鍵。首先,您將使用字元編碼(如 ASCII(或 UTF-8,相當於同一件事))將其轉換為二進制。

您可能需要使用 KDF 或散列來生成正確大小的密鑰,以防您的 DRBG 或密碼需要特定大小的密鑰。一般來說,散列的最左邊字節也足夠了。


通常,上述所有功能都是單向功能,因此您無法將它們轉換回您的字母數字鍵*,除非強制使用字母數字鍵*。它們都使用確定性(因此是可重複的)算法來生成字節流。


XOF 函式似乎是主要的競爭者,因為它們是為流式傳輸而設計的,並且可以接受任何大小的輸入數據。

計數器模式下的 AES + 作為 KDF 的散列來創建密鑰 - 是一個非常好的競爭者,如果僅僅是因為它幾乎普遍可用,那麼絕對不可能檢索密鑰並且輸出可能足夠好

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