用于P2P卡游戏的密码学

so1*_*311 18 encryption cryptography playing-cards

我正在考虑改编半流行的纸牌游戏.我想让它在没有中央服务器的情况下运行,而我正试图想出一个不必信任客户就会让作弊变得不可能的方案.

我看到的基本问题是每个玩家都有几堆牌(平局牌,当前牌和弃牌牌).任何一个玩家都不可能改变这些桩的构成,除非游戏规则允许(即绘制或丢弃牌),玩家也不能知道他们或他们的对手的桩是什么.

我觉得应该有一些方法可以使用像公钥加密这样的东西来完成这个,但我一直在我的方案中找到漏洞.任何人都可以建议一个协议或指向我这个主题的一些资源?

[编辑]好的,所以我一直在考虑这个问题,这是我想出的一个想法.如果你可以戳它的任何漏洞,请告诉我.

在随机播放时,玩家有一堆牌,其价值为他们所知.他们采用这些值,将随机盐连接到每个值,然后哈希它们.他们记录盐,并将哈希传给他们的对手.

对手连接他们自己的盐,再次哈希,然后将哈希洗牌并将牌组传回原来的牌手.

我相信在这一点上,牌组已被随机化,玩家都无法了解这些价值观.然而,当一张牌被抽出时,对手可以揭示他们的盐,允许第一个玩家确定原始值是什么,并且当玩牌时玩家展示他们自己的盐,允许对手验证牌值.

Blu*_*eft 8

你的问题是密码学中着名的智力扑克问题(这是我在大学里最喜欢的加密课程之一).这可能的,并且已经解决(部分地,像Ron Rivest一样加密),只要你不介意一个巨大的性能打击.

查看维基页面了解更多详情.


How*_*ard 5

我想描述一个很快就出现在我心中的想法.我不知道它是否满足您的所有需求,所以请随时对此发表评论.

假设玩家A有卡A1,A2,A3,...从数表示一组0,1... N-1.这些卡也可能被分成堆,但这不会改变以下内容.

而不是处理这些卡与一个列表[A1, A2, A3, ...],您可以改用他们两个[A1_a, A2_a, A3_a, ...][A1_b, A2_b, A3_b, ...]其中一个是与球员A和其他与播放器B.他们以这样的方式产生的,每一个是随机的(在范围内0...N-1),但两者是相关的,使得A1_a + A1_b = A1,A2_a + A2_b = A2,...(所有操作模N).

  • 因此,没有玩家真正知道没有获得补充堆的牌(即他不能合理地改变他的牌)
  • 每当你需要知道一张牌时,两个玩家都会显示相应的值,然后你添加这些模数 N
  • 你可以很容易地实现"画一张牌"这样的东西,两个桩都必须以同样的方式对待


bmm*_*m6o 5

传统的心理扑克计划是过度的.由于没有共享套牌,您的情况实际上要容易得多.你可以这样做:

玩家A拿走他的牌并用钥匙Ka加密他们.他把他们送到B,他们将他们洗牌,用钥匙Kb加密.每次A想要打牌时,他都要求B对下一张卡进行(Kb)解密.A解密这个以找到他画的卡.最后,A和B显示Ka和Kb并将它们与游戏日志进行比较,这可以防止作弊.

更新:经过反思,这是一个更简单的解决方案:如上所述,玩家A加密他的牌并将其发送给B. B改组他们.每当A想要一张牌时,他就告诉B他正在画哪张牌.B从适当的堆中返回(加密)卡.