Public-Key

256位比特幣私鑰生成的d6二進制不會產生有偏差的結果嗎?

  • January 26, 2020

如果映射表如下所示:

1: 000

2: 001

3: 010

4: 011

5: 100

6: 101

然後,您可以保證您的密鑰永遠不會有 4 個或更多 1 的鏈,3 個 1 的鏈比真正隨機數生成所預期的要少得多,並且沒有 8 個或更多 0 的鏈。除非您使用從 d6 到二進制的不直覺映射(例如交替 0 和 1),否則您的骰子必須是 $ 2^n $ (2, 4, 8, 16, etc.) 邊以產生不可預測的二進制結果。在https://www.swansontec.com/bitcoin-dice.html上建議使用 d6 作為 Hex dice 的替代品,這不安全嗎?一副紙牌(1-10)不會有同樣的問題嗎?

是的,你上面描述的方法確實會產生一個只有大約 $ \frac{256}{3} \cdot \log_2 6 \approx 220.6 $ 一點點的熵。(我說“大約”是因為 256 不能被 3 整除,所以最後一次擲骰子只會對密鑰貢獻一位,而該位的熵量取決於您選擇的三位中的哪一位。)

但是,這不是您連結到的頁面上建議的腳本實際執行的操作。相反,它需要 100 次六面骰子(總熵為 $ 100 \cdot \log_2 6 \approx 258.5 $ 位),將它們解釋為以 6 為基數的數字(在將數字 1-6 移動到範圍 0-5 之後) $ 0 $ 和 $ 6^{100}-1 $ , 然後將此數字轉換為十六進制並取其最後 64 位十六進制數字(相當於將其取模 $ 16^{64} = 2^{256} $ ).

這種方法將產生一個具有近 256 位熵的密鑰。它只是幾乎的原因是因為 $ 6^{100} $ 不能被整除 $ 2^{256} $ ,所以模歸約會引入一些偏差。尤其是, $ 6^{100} \mathbin/ 2^{256} \approx 5.64 $ ,因此可能鍵範圍的較低 64% 將是選擇較高 36% 的可能性的 6 / 5 倍。因此,由這種方法生成的密鑰的實際熵將近似為$$ 0.64 \cdot 2^{256} \cdot \tfrac{6}{6^{100}} \log_2 \left( \tfrac{6^{100}}{6} \right) + 0.36 \cdot 2^{256} \cdot \tfrac{5}{6^{100}} \log_2 \left( \tfrac{6^{100}}{5} \right) \approx 255.995 \text{ bits}. $$

順便說一句,只需擲骰子 99 次即可生成一個介於 0 和 $ 6^{99} \approx 2^{255.91} $ 並且直接使用該數字作為密鑰將產生一個具有 255.91 位熵的密鑰,僅比腳本使用的方法少約 0.08 位。只是為了明確說明這一點,這種一小部分的差異是完全無關緊要的——出於所有實際目的,兩種方法都將產生與完全隨機的 256 位密鑰一樣好的密鑰。

在任何情況下,即使是由上述問題中描述的方法生成的具有 220 位熵的密鑰,仍然應該完全足以抵抗任何已知或可預見的對手的暴力猜測攻擊(至少使用經典電腦 - 但隨後,如果大規模量子計算起飛,無論密鑰大小如何,橢圓曲線加密都將是個壞消息)。

如果您擔心密鑰的特殊結構(即,在用八進制編寫時避免八位中的兩位)可能會導致某些未知類別的攻擊,只需在使用之前通過像 SHA-256 之類的散列函式將其輸入。就此而言,您不妨採取一系列 100 多個六面骰子並通過 SHA-256 將其輸入,以獲得與完全隨機的密鑰實際上無法區分的密鑰(假設 SHA-256 是安全的)。

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