我的袖子有多少自由度?
既然我們知道了 MD2 S-box 是如何構造的,我發現自己想知道它到底有多好。它來源於*_* $ \pi $ ,但不是很明顯,即使回想起來也是如此。
你如何估計可能的數量 $ \pi $ 衍生出的 S-box 並不比實際的複雜或可疑?
例如,“從基數為 256 的第 96723 位開始的 pi 的唯一字節”(可以說)更簡單,但更可疑。另一方面,更長的描述/算法將被視為更複雜。
或更籠統地說:您如何評估我的袖子號碼的綁定程度?
實際上,鑑於MD2 S-box 需要是一個排列,使用Fisher-Yates shuffle對我來說似乎是一個相當明顯的選擇。(這幾乎是生成統一選擇的隨機排列的標準算法。)
rand()
用於轉換數字的函式 $ \pi $ 從給定的區間變成隨機數看起來很複雜,但也是一種相當標準的方法。(IIRC,它與Fisher 和 Yates 1938 年的原著中描述的基本相同。)也就是說,您詢問了可用自由度的數量,所以讓我嘗試計算一個人在生成排列時可能做出的各種合理選擇:
- 第一個明顯的選擇是基礎 $ \pi $ 被表達。Rivest 程式碼使用以 10 為基數的數字,但由於我們使用的是電腦,因此至少以 2、16 和 256 為基數是有意義的(使用 base-256 甚至
rand()
可以簡化函式)。那是四個選擇,或兩個自由。- 此外,僅使用小數部分 $ \pi $ (即跳過第一個數字)可能是一個合理的選擇。那是一點自由。人們甚至可以證明使用 $ \tau = 2\pi $ ,或其小數部分,以獲得另一位自由。
- 顯然,除了 $ \pi $ 本來可以選擇的。 DJ Bernstein等人的這篇優秀論文。,Seth 在上面的評論中提到,列出了 17 個這樣的常量: $ \pi $ , $ e $ , $ \gamma $ , $ \sqrt2 $ , $ \sqrt3 $ , $ \sqrt5 $ , $ \sqrt7 $ , $ \log(2) $ , $ \varphi = (1+\sqrt5)/2 $ , $ \zeta(3) $ , $ \zeta(5) $ , $ \sin(1) $ , $ \sin(2) $ , $ \cos(1) $ , $ \cos(2) $ , $ \tan(1) $ 和 $ \tan(2) $ . (添加 $ \tau $ 使它成為 18。)其中每一個都有一個倒數,並且原始常數或倒數都有一個可以刪除的非零整數部分,將可能的常數的數量乘以三,總共 $ 18 \times 3 = 54 $ 可能的選擇,或 $ \log_2 54 \approx 5.8 $ 位自由(包括前一個要點中的兩個位)。
- Fisher-Yates shuffle 有一個“由內而外”的版本,它為相同的輸入產生不同的排列。此外,任何一種變體都可以從陣列的頂端或底端開始,產生不同的結果。那是另外兩個自由。
- 中使用的拒絕抽樣
rand()
可以通過表達來避免 $ \pi $ 在混合基數係統中(每個數字的基數增加或減少一個)。這種選擇(本質上相當於算術解碼的一種形式)可以通過它最小化生成所需偽隨機數字所需的輸入“隨機性”的數量來證明是合理的。由於至少有兩種合理自然的方法可以做到這一點(增加或減少基數),我們可以將可能的基數從 4 個增加到 6 個,給我們額外的 0.6 位自由度。將所有這些選擇放在一起,我們有 $ 4 \times 54 \times 6 = 1296 $ 合理合理的組合可供選擇,至少給我們 $ \log_2 1296 \approx 10.3 $ 一點點的自由。
當然,如果這還不夠,我們還可以嘗試各種其他方法,例如“意外地”實現Sattolo 算法或Durstenfeld-Knuth-Fisher-Yates的許多其他帶有微妙偏見(但仍然非常隨機)的變體之一洗牌。
我們甚至可以訴諸傳統,使用Fisher 和 Yates 的原始算法而不是 Durstenfeld 變體,也許結合前半部分的簡單拒絕抽樣(如 Fisher 和 Yates 最初建議的那樣),或者可能是 CR Rao 的算法在他們書中的後續版本中進行了描述。或者我們甚至可以只使用純拒絕採樣(即取 base-256 位的 $ \pi $ 並丟棄重複項),或者可能是生成排列的偽隨機鍵排序方法的某種變體(這應該允許在如何生成密鑰方面有足夠的自由度)。