Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption P2P纸牌游戏的密码学_Encryption_Cryptography_Playing Cards - Fatal编程技术网

Encryption P2P纸牌游戏的密码学

Encryption P2P纸牌游戏的密码学,encryption,cryptography,playing-cards,Encryption,Cryptography,Playing Cards,我正在考虑用电脑改编一款半流行的纸牌游戏。我想让它在没有中央服务器的情况下正常工作,我正试图想出一个方案,在不必信任客户机的情况下,使作弊成为不可能 我看到的基本问题是每个玩家都有几堆牌(抽牌组、当前牌组和弃牌组)。除非游戏规则允许(即抽牌或弃牌),否则任何一位玩家都不可能改变这些牌堆的组成,玩家也不应该知道自己或对手的牌堆中有什么 我觉得应该有一些方法来使用公钥加密来实现这一点,但我一直在我的方案中寻找漏洞。有人能给我推荐一个协议或者给我指一些关于这个主题的资源吗 [编辑] 好的,我一直在考虑

我正在考虑用电脑改编一款半流行的纸牌游戏。我想让它在没有中央服务器的情况下正常工作,我正试图想出一个方案,在不必信任客户机的情况下,使作弊成为不可能

我看到的基本问题是每个玩家都有几堆牌(抽牌组、当前牌组和弃牌组)。除非游戏规则允许(即抽牌或弃牌),否则任何一位玩家都不可能改变这些牌堆的组成,玩家也不应该知道自己或对手的牌堆中有什么

我觉得应该有一些方法来使用公钥加密来实现这一点,但我一直在我的方案中寻找漏洞。有人能给我推荐一个协议或者给我指一些关于这个主题的资源吗

[编辑] 好的,我一直在考虑这个问题,我想出了一个主意。如果你能在上面戳点洞,请告诉我

在洗牌时,玩家有一堆价值已知的牌。它们获取这些值,将随机盐连接到每个值,然后对它们进行散列。他们记录盐分,并将哈希值传递给对手

对手将自己的盐串接在一起,再次散列,然后洗牌,并将牌组传递回原始玩家


我相信在这一点上,牌组是随机的,没有一个玩家可以知道任何价值观。然而,当抽到一张牌时,对手可以展示他们的盐,让第一个玩家确定原始值是多少,当玩这张牌时,玩家展示他们自己的盐,让对手验证牌的值。

也许玩家可以在游戏开始时交换他们的牌堆哈希

然后,当游戏结束时,玩家交换他们的桩在游戏开始时的实际组成。现在,玩家的客户端可以检查它是否与他们之前得到的哈希匹配,然后检查所有的移动是否与这些牌组一起工作

唯一的问题是最初如何洗牌。你需要确保玩家不能按照他选择的任何顺序开始他的牌组

也许玩家可以通过从特定来源获得随机性来生成他们的初始牌组顺序。。但在某种程度上,另一名玩家直到游戏结束时才知道另一名玩家的牌组顺序是什么,但仍然可以检查该玩家没有摆弄他们的牌组。我不知道你是怎么做到的

编辑:

另一个想法。也许不需要在游戏开始时生成随机牌组,而是可以在游戏进行时生成

每当玩家需要从牌堆中取出一张新牌时,他们的对手都会随机发送一些种子,用于选择下一张牌

这样,用户就无法知道牌组中牌的顺序


我不知道你如何才能阻止其他玩家说出他们将为对手挑选什么牌。如果种子用于从某种随机排列的牌列表中选择一张牌,则对手需要验证散列。。他们可以检查所有可能的牌的组合,找出哪一张与散列匹配,从而能够通过发送种子命令他们希望另一位玩家抽哪张牌,这将导致该牌被选中。

我想描述一个想法,它很快进入我的脑海。我不知道它是否满足您的所有需求,所以请随时对此发表评论

假设玩家
A
拥有卡片
A1
A2
A3
。。。从由数字表示的集合中,
0
1
<代码>N-1。这些卡片也可以分成若干堆,但这不会改变以下内容

您可以使用其中两张来处理这些卡,而不是使用单个列表
[A1,A2,A3,…]
,其中一张与玩家
a
,另一张与玩家
b
。它们是以这样的方式生成的,即每一个都是随机的(范围为
0…N-1
),但两者都是相关的,
A1_a+A1_b=A1
A2_a+A2_b=A2
。。。(所有操作都是模
N

  • 因此,没有一个玩家在没有进入互补牌堆的情况下真正知道牌(即,他不能合理地更改他的牌)
  • 当你需要知道一张牌的时候,两个玩家都会显示他们相应的值,然后你加上那些模
    N
  • 你可以很容易地实现像“抽一张牌”这样的事情,两个堆都必须以相同的方式处理

虽然中央服务器可能是最简单的方法,但如果你想避免它,你可以使用分布式系统,其中每个玩游戏的人都是其他玩家牌组的存储主机(不是他自己或他的对手,而是其他任何人)。我相信Limewire和Bittorrent都是这样工作的,因此您可以通过研究这些来源获得一些想法。

这是对Acorns方法的一种改编:

设置:

每个玩家都有自己的牌组(完全有序的牌组)。。。这些甲板是公共的,并且是自然的秩序

每个玩家都需要一个不对称(签名)密钥对,即交换的公钥

现在谈谈随机性问题:

由于玩家可能无法提前看到他们将抽到什么牌,因此对手将是我们随机性的来源:

当我们需要一些随机值时,我们会问我们的对手。。。随机值将与稍后要检查的移动一起存储

由于我们的对手可能无法操纵我们的牌的顺序,我们将接收到的随机值与我们的私钥进行签名。。。该签名的值将是我们的RNG se