一個大隨機數在密碼學上是否等同於多個較小隨機數的乘積?
假設我通過取一個隨機數來創建一個 256 位密鑰 $ 0 $ 和 $ 2^{256}-1 $ .
是否在密碼學上等效於生成 $ 8 $ 數字 $ r_1\dots r_8 $ 之間 $ 0 $ 和 $ 31 $ ,並以下列方式組合它們?
$$ \mathit{rand} = 2^{r_1} \cdot 2^{r_2} \cdot 2^{r_3} \cdot 2^{r_4} \cdot 2^{r_5} \cdot 2^{r_6} \cdot 2^{r_7} \cdot 2^{r_8} $$ 它仍然會加起來為 256 次方,但以這種方式生成它是否安全?如果沒有,那怎麼做,如何通過組合較小的隨機數來生成大隨機數?
如果在範圍內均勻隨機選擇一個數 $ [0, 31] $ , 那是 $ 32 $ 不同的價值觀,因此 $ log_2(32) = 5 $ 一點點的熵。如果你選擇 $ 8 $ 這樣的數字,那麼你有 $ 5 \times 8 = 40 $ 總熵位,意味著有 $ 2^{40} $ 你可以得到不同的組合。不管你如何組合它們,那已經遠遠不夠了 $ 2^{256} $ .
而且情況變得更糟,因為您正在乘以從您的八個選擇中計算出的數字:
$$ \mathit{rand} = 2^{r_1}\cdot 2^{r_2}\cdot 2^{r_3}\cdot 2^{r_4}\cdot 2^{r_5}\cdot 2^{r_6}\cdot 2^{r_7}\cdot 2^{r_8} $$
因為乘法是可交換的 ( $ a \times b = b \times a $ ) 和聯想 ( $ a \times (b \times c) = (a \times b) \times c $ ),這意味著這些之間的許多組合 $ 2^{40} $ 不同的選擇實際上在乘法之後產生相同的乘積。例如,如果兩個隨機選擇序列是彼此的排列,它們的乘積是相同的。在這種情況下,情況更糟,因為 $ \mathit{rand}=2^{r_1+\dots+r_8} $ 始終是 2 的冪:這意味著我們正在有效地採樣 $ 256 $ -位數字,只有一位設置,所以只有 $ 256=2^8 $ 可能的結果!
如果沒有,那麼怎麼做,如何通過將較小的隨機數組合來生成大隨機數?
基本上,通過在某個基數中隨機選擇數字。如果你有 $ n $ 隨機抽取的數字 $ d_0, …, d_{n-1} $ 在基地 $ b $ , 然後 $ d_0b^0 + … + d_{n-1}b^{n-1} $ 是范圍內的均勻隨機數 $ [0, b^n) $ . 例如,要隨機生成一個 256 位數字,您可以:
- 隨機選擇 256 個單獨的位 ( $ n = 256 $ , $ b = 2 $ );
- 隨機選擇 32 個字節 ( $ n = 32 $ , $ b = 8 $ );
- 隨機選擇 8 個 32 位機器字( $ n = 8 $ , $ b = 32 $ );
- 隨機選擇四個 64 位機器字( $ n = 4 $ , $ b = 64 $ ).
在實踐中,這是通過連接隨機選擇的字節或機器字來完成的。