Protocol-Design

如何在不信任第三方的情況下公平地為遊戲選擇隨機數?

  • April 30, 2012

有幾個人正在玩一個帶有隨機事件的遊戲,並且需要一種產生隨機數的方法。(例如擲骰子或彩票。)

這樣做是否可以使每個玩家都有能力合理地確定隨機數是公平選擇的,而不必信任其他任何人?

這個問題源於對我對比特幣 SE的回答的評論中的討論。我想出了一個協議,但其他人發現了一個缺陷。這個網站似乎更合適。

請隨時使用我對該問題的回答。

您發布的答案實際上是正確的(或多或少,見下文):讓每個參與者都承諾他們的隨機數 $ r_i $ 通過出版,例如, $ \mathcal{H}(r_i) $ 在第一輪。然後在第二輪中,每個參與者通過發布打開承諾 $ r_i $ 每個人都通過散列來檢查它是否與送出的值匹配。最終的隨機數是每個的 XOR $ r_i $ .

如果發生碰撞,那裡的評論者建議進行攻擊。然而,安全散列函式的定義是它的抗碰撞性。對於像 SHA256 這樣的良好的現代散列函式,情況就是如此。

有兩個微妙之處。

首先是您的方案僅適用於大隨機數,大到足以讓攻擊者無法嘗試所有可能的值 $ r_i $ ,散列它,看看它是否匹配。為了送出小值,您需要一個隨機送出函式。良好的隨機承諾基於離散對數,但您可以使用散列函式通過生成大隨機值來構造一個(具有合理安全性) $ a_i $ 然後將您的承諾計算為 $ \mathcal{H}(r_i||a_i) $ . 要打開,請同時顯示 $ r_i $ 和 $ a_i $ . 改變 $ r_i $ ,你必須找到一個不同的 $ a_i $ 所以雜湊是相同的:這很難基於碰撞阻力。兩者的位長 $ r_i $ 和 $ a_i $ 必須預先確定,以便從 $ r_i||a_i $ 將值拆分到哪裡 $ r_i $ 和 $ a_i $ (否則,您可以通過簡單地在不同的位置拆分來將其打開為不同的值)。

第二個微妙之處是,最後一個透露他的值的參與者將在他透露他的號碼之前學習累積的隨機數(他可以看到其他人的號碼並且他知道自己的號碼)。如果他不喜歡結果,這可能會導致他中止。你可以做更複雜的事情來提供公平性,但通常如果任何參與者拒絕公開他們的承諾,協議應該從頭開始重新啟動,排除該參與者。

另請閱讀@DW 上關於另一個問題的答案,其中(s)他解釋了相同的協議。

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