Pseudo-Random-Generator
從輸入種子(相同種子的固定值)輸出一個填充(無鍵,可變長度)
我想要一個函式 $ y = f(x, len) $ :
- $ x $ 是種子。 $ y $ 是輸出。 $ len \in \mathbb{Z^+} $ 是長度(字節) $ y $
- 選擇一個種子字元串 $ x $ 生成一個字元串 $ y $ .
- 對於每一對相同的 $ x $ 和 $ len $ , 的價值 $ y $ 是同樣的。
- 種子應該有一個合理的短長度。 $ y $ 的長度可能支持一定範圍(*備註)
- 每個字節值 $ y $ 應該均勻(或接近均勻)分佈
備註 4 - 請考慮兩個可能的功能:
- $ y $ 長度是的倍數 $ 16 $ (塊長度 $ 16 $ )。如果我使用散列函式,問題是長度選項是有限的並且不是連續的(例如, $ 16 \cdot n $ , $ n=1, 2, 3,\ldots $ ).
- $ y $ 可以是范圍內的任意長度
(無需保護 $ f(x) $ 作為秘密)
聽起來SHAKE功能(有兩種口味,SHAKE-128 和 SHAKE-256)旨在完全滿足您的要求。
SHAKE 取一個值 ( $ x $ 在您的情況下),並從中生成任意長的輸出。你可以拿第一個 $ len $ 來自它的字節,那是你的 $ y $
至於你的要求:
- 對於每一對相同的 $ x $ 和 $ len $ , 的價值 $ y $ 是同樣的。
對於任何輸入種子 $ x $ , SHAKE 總是生成相同的密鑰流。這確實意味著(例如) $ \text{SHAKE}( \text{“abc”}, 128 ) $ 是前綴 $ \text{SHAKE}( \text{“abc”}, 256 ) $ . 您的要求沒有提到這是一個問題,但如果是,您可以隨時使用 $ x || len $ 作為 SHAKE 的輸入
- 種子應該有一個合理的短長度。
SHAKE 可以處理您想要的任何種子長度。
4a。 $ y $ 的長度可能支持一定範圍(*備註)
SHAKE 可以生成任意長度的輸出
- 每個字節值 $ y $ 應該均勻(或接近均勻)分佈
據我們所知,SHAKE 的輸出是均勻分佈的。
雖然從固定長度的散列函式生成相同的功能一點也不難,但 SHAKE 的好處是所有關於生成多個散列和截斷最後一個散列的邏輯都已經為您完成了。
這是 SHAKE 的標準實現(以及一些相關功能)