Protocol-Design

生成共享秘密隨機排列

  • March 28, 2014

有三名盲牌遊戲玩家。每個玩家都不信任任何其他玩家,甚至偏見其他兩個玩家可能不是盲人,或者房間裡可能還有其他人在偷看他們的牌。

為了防止被偷看,每個玩家將他的每張牌分別放入單獨的上鎖盒子中,每個盒子都有自己的鑰匙。所有者知道哪個盒子裡有哪張卡,而其他人不知道。換句話說,玩家'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 已經提到的)

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