客戶端和伺服器使用的可證明公平的卡片組
假設伺服器與客戶端玩二十一點遊戲,並且由伺服器洗牌並發牌。洗牌本身可能公平也可能不公平,但需要證明的是,在遊戲過程中,發的牌沒有被改變,即:在手牌開始後,牌組中的牌並沒有秘密地擁有它們的牌。由伺服器更改的順序。
我正在考慮使用密碼學的以下解決方案,並希望獲得一些回饋,如果它可以被生產系統接受,如果不是,為什麼不:
第 1 步)伺服器會以某種順序秘密地洗一副牌,如下所示(為簡單起見,我們省略了花色):
$$ 3, 9, 2, …, A $$ 然後它將創建以下消息 M:
M = “Card shuffle:
$$ 3, 9, 2, …, A $$. 隨機編號:A96A…QT3” 隨機數是伺服器內部生成並保密的隨機數,直到遊戲結束。它的長度足夠長,以防止客戶端通過暴力破解散列(假設它的長度為 512 個字元)。
伺服器現在將使用 sha-256 或其他一些受信任的散列算法對 M 進行散列,例如:hash(M)
步驟 2) 在遊戲開始之前,伺服器將此雜湊 (M) 發送給客戶端,客戶端儲存該雜湊。客戶無法從我收集到的資訊中了解 M。
Step 3) 遊戲開始,按洗牌順序發牌,玩家做出決定,遊戲最終結束。
步驟 4) 客戶端現在想知道遊戲是公平的,即:伺服器沒有通過在手牌中更改牌來作弊。伺服器現在以明文形式向客戶端發送消息“M”以顯示這一點。
第 5 步)客戶端執行 hash(M) 並看到它與第 1 步中收到的 hash(M) 匹配。
這是證明遊戲公平的公平方式,客戶端或伺服器不能作弊,排除洗牌本身不是隨機的可能性?如果伺服器要在手牌過程中從原始洗牌中更改卡片,那麼客戶端將在第 5 步中看到這一點(順序對客戶端將透明地不同,或者在第 4 步中發送的消息的雜湊值將與步驟 2) 中發送的不同。此外,每手牌只發送一個散列,因此伺服器不能生成大量散列並單獨發送它們,然後在牌局過程中選擇最好的散列。
您已經創建了一個帶有隨機致盲因子的雜湊承諾。這將起作用,並且致盲因素是必要的,因此隨著牌逐漸向玩家展示,玩家不可能了解有關雜湊消息的有用資訊,以便能夠暴力破解洗好的牌組的其餘部分. 一個均勻隨機的 128 位致盲因子就足夠了。
您可以通過聲明 128 位“種子”而不是列出所有單獨的卡片位置來進一步壓縮它,然後使用基於此種子的確定性洗牌來洗牌。
如果您使用上面連結的 shuffle 方法執行此操作,則不需要使用致盲因子。這是因為,根據定義,CSPRNG可以承受“下一位測試”。了解 CSPRNG 的某些輸出不會更容易暴力破解種子或在猜測牌組中的下一張牌時提供任何優勢。
所以, $ commitment = hash(\texttt{128-bit seed}) $ .
請注意,真正隨機的洗牌將有 $ log_2(52!)\approxeq225 $ 位熵,它大於種子的熵。然而,甚至確定一個無法獲得的單一洗牌結果(大約在 $ 2^{225} $ 可能的洗牌),因此擁有大於 128 位的種子不會是一種改進。