生成共享秘密隨機排列
有三名盲牌遊戲玩家。每個玩家都不信任任何其他玩家,甚至偏見其他兩個玩家可能不是盲人,或者房間裡可能還有其他人在偷看他們的牌。
為了防止被偷看,每個玩家將他的每張牌分別放入單獨的上鎖盒子中,每個盒子都有自己的鑰匙。所有者知道哪個盒子裡有哪張卡,而其他人不知道。換句話說,玩家
'card_value:commonly_agreed_public_salt'
用隨機密鑰為每張牌製作一個 HMAC-SHA256 字元串散列,然後互相宣布他們擁有的散列列表。當玩家移動時,他將自己擁有的一個上鎖的盒子移動到桌子中間並公開鑰匙,這樣每個人都可以看到裡面是什麼牌。換句話說,在下棋時,玩家會公開用於雜湊卡值的 HMAC 密鑰,以及卡值本身。這樣其他玩家就可以驗證這張卡是否真的歸他所有。
我希望這種方法使房間裡的所有觀察者(如果有的話)都無法獲得任何資訊,除了每個玩家擁有的牌數之外,我錯過了什麼嗎?
現在我被困在我應該如何設計從甲板上檢索附加或初始卡的問題。我想我應該使用類似於 Mersenne Twister 的 preseed PRNG,以避免重複,但是如何使種子都保密,所以不能簡單地遍歷所有牌組來了解未來的所有牌,或者知道哪些牌被選中由其他玩家共享,因此每個人在從牌組中抓牌時都會得到相同的結果。
對此有什麼想法嗎?
您的方法使得獲取除
每個玩家擁有的牌數之外的資訊至少與打破 HMAC 的PRF ness 一樣難。
為了使其資訊理論上不可能“對所有……每個玩家”,
$ ;; $ 如果不同
card_value
的 s 有不同的長度,那麼使用$ ;; $
SHA256(commonly_agreed_public_salt:card_value)
$ ;; $ 而不是
card_value
接下來的$ ;; $ 一開始,每個玩家選擇一個強提取器,其輸出長度等於
$ ;; $ each ,為該提取器
card_value
選擇一個隨機數,並將這兩個發送給每個人seed
$ ;; $ (這些選擇可以重複使用)
$ ;; $ 玩家計算
SHA256(commonly_agreed_public_salt:secret_random_value)
$ ;; $ 和
Extract(secret_random_value,seed) xor card_value
$ ;; $
secret_random_value
為每張卡片 獨立選擇,$ ;; $ 然後互相宣布他們擁有的配對名單
.
要從牌組中檢索額外的牌,您需要使用
多方計算;特別是心理撲克協議。
(正如 bmm6o 已經提到的)