Algorithm 在任何一方都不知道方框内容的情况下使用加密技术进行洗牌

Algorithm 在任何一方都不知道方框内容的情况下使用加密技术进行洗牌,algorithm,cryptography,shuffle,Algorithm,Cryptography,Shuffle,我正在寻找一种方法,在两个互不信任的客户之间洗牌一系列已知值(如一副牌),这种方法可以被双方验证,并且不会获得任何优势 到目前为止我在想 for each item in array: A tells B random number to use (Ra1) <~ prevent B from using pre-calculated password B creates secret random number, and shows hash to A <~ can pro

我正在寻找一种方法,在两个互不信任的客户之间洗牌一系列已知值(如一副牌),这种方法可以被双方验证,并且不会获得任何优势

到目前为止我在想

for each item in array:
  A tells B random number to use (Ra1) <~ prevent B from using pre-calculated password
  B creates secret random number, and shows hash to A <~ can prove this number is used
  B adds his own secret random number (Ra1+Rb1) <~ prevent A from using pre-calculated password
  B encrypts a random array value using the combined password (Ra1+Rb1), removing from the stack
  B gives encrypted value to A
  A re-encrypts the value <~ prevent B from recognizing his package later
  A stores at random index in new array of unknown items

A shows the full array to B <~ B can be confident that the array will not be tampered with
A does not know what is in each package, nor does B
B can now choose a package for himself, and A can then provide the password for that package, allowing B to recognize his package, and know the contents.
A can also choose a package, and request the key to unlock it form B.

After all transactions are agreed, and secrecy is no longer required, all secrets are revealed by both parties, who can both then verify the contents of the boxes
对于数组中的每个项目:
A告诉B使用随机数(Ra1)这是著名的。一种解决方案涉及加密(即E1(E2(M))==E2(E1(M)))

从维基文章:

  • 爱丽丝和鲍勃在一副牌上意见一致。实际上,这意味着他们在一组数字或其他数据上达成一致,使得该组的每个元素代表一张卡
  • Alice选择一个加密密钥A,并使用它来加密卡组中的每一张卡
  • 爱丽丝洗牌
  • Alice将经过加密和洗牌的牌组传递给Bob。加密到位后,Bob无法知道哪张卡是哪张卡
  • Bob选择一个加密密钥B,并使用它加密加密和洗牌牌组中的每张卡
  • 鲍勃洗牌
  • 鲍勃把经过双重加密和洗牌的牌组传给爱丽丝
  • Alice使用她的密钥A解密每张卡。这仍然保留Bob的加密,因此她无法知道哪张卡是哪张卡
  • Alice为每一张卡(A1、A2等)选择一个加密密钥并分别加密
  • 爱丽丝把甲板递给鲍勃
  • Bob使用他的密钥B解密每张卡。这仍然保留Alice的单独加密,因此他无法知道哪张卡是哪张卡
  • Bob为每张卡(B1、B2等)选择一个加密密钥,并分别加密
  • 鲍勃把甲板递给爱丽丝
  • Alice为每个玩游戏的人发布一副牌。
    […]
    该算法可以扩展到任意数量的玩家
  • 这允许洗牌,不允许任何一方作弊,也不允许任何一方知道另一方有什么牌(如果您取消最后一个要求,只需要公平洗牌,问题就会变得容易得多)


    使用的加密必须是安全的。

    这是什么?研究?这解决了什么安全要求?“B现在可以为自己选择一个包,a然后可以为该包提供密码”-您的想法几乎是正确的,但这里有一个问题。如果A和B都无法区分这些卡,A如何知道为该卡提供哪个密码?这就是下面的协议(见我的答案)需要交换加密的原因,也是为什么它需要每个玩家执行两个加密步骤的原因——一个是为了防止两个玩家都知道哪张卡是哪张卡,另一个是为了允许对卡进行单独解密。你会得到一个更好的答案,不知道为什么这张卡会被关闭?这对于这个网站来说是一个完美的问题。@BlueRaja DannyPflughoeft我也是,我认为这是一个好问题,我相信我得到了一个非常好的答案:)我想这正是我想要的。虽然——我很惊讶没有一个更简单的方法了。@Billymon:这仍然是一个悬而未决的问题。尽管这个问题(以及上面的解决方案)已经有40多年的历史了,但很多研究都只是从理论上进行的。我认为不仅仅是一个简单的解决方案,很多人都希望有一个快速的解决方案——上述解决方案涉及大量昂贵的加密以及每次洗牌或使用卡时来回的网络流量。我认为没有人知道是否有更好的解决方案。有趣的问题。我想知道这副牌有三张牌的场景有没有简化?这种情况似乎更容易分析,因为只有六种可能的排列。不幸的是,由于置换是不可交换的,所以不太清楚哪种“可交换加密”最合适,以及需要多少额外信息。我的猜测是,交换加密函数应该是一个六路置换(实际上是三路置换的置换)。@supercat:置换不是加密;记住,加密必须有密钥。更重要的是,即使是“密钥置换”(即2位分组密码)也不起作用——问题是,在B为卡请求a的密钥后,B可以强行使用密钥空间使卡解密为他想要的任何内容,然后就密钥是什么向a撒谎。因此,即使输入空间只需要两位,输出空间也必须足够大,以防止暴力。@BlueRaja DannyPflughoeft:64位块上的加密是2^64个可能的64位块之间的置换。事实上有(2^64)!可能在64位块上加密,而三向选择为6位,这意味着后一个键空间可以更容易地搜索(显然太容易了)。显然,需要某种程度的混淆,但是为了分析这个问题,我认为找出三卡问题的最低要求是很有趣的。