防欺诈在线扑克加密算法

时间:2020-11-12 01:42:43

标签: algorithm encryption

我正在尝试创建一个在线扑克游戏,您不必在其中相信服务器不会操纵该游戏。两位玩家的客户端都在0到51之间创建一个随机数,对其进行加密并共享加密后的数字,而这两个数字的总和mod 52对应于一张扑克牌。该卡将是随机确定的,但在对方提供未加密的号码之前,任何玩家都无法看到该卡。

此算法的问题在于它允许复制同一张卡。我该如何修改此算法,以便对手在不知道自己拥有该卡的情况下,也无法依靠自己赢得相同的卡,或者依靠信任别人而不作弊?这有可能吗?

2 个答案:

答案 0 :(得分:0)

每个玩家都可以:

  1. 创建数字0,...,51的排列
  2. 加密并共享每个号码

通过这种方式,每个播放器都以两个列表的形式拥有相同版本的加密卡组(一个拥有密钥,另一个没有密钥)。对应数字模52的总和就是卡。

当玩家抓牌时:

  1. 对方向他发送了相应的密钥
  2. 然后他可以用它来计算他所抓的牌。

在游戏结束时,所有密钥都被共享,每个玩家都可以验证游戏。

答案 1 :(得分:0)

这类似于@DimitriosPanagopoulos提出的内容。但是由于客户无法查看其他客户拥有的卡。

每个客户端产生一个随机数。他们加密它,并将其发送到服务器。 (从而锁定他们的选择。)然后,服务器将加密版本发送给所有人。然后,每个客户端将其密钥发送到服务器。

现在,服务器将数字解密,然后将其以2^19937−1为模,并将其用作https://en.wikipedia.org/wiki/Mersenne_Twister的种子。然后,服务器使用该伪随机数生成器告诉每个客户端,他们按照标准的决定顺序获得了哪些卡。

一旦处理完所有卡,服务器将发送密钥,并且所有客户端都可以根据客户端选择的号码来验证是否正确处理了所有卡。 (请记住,只要任何客户端信任其自己的随机数生成器,合并结果就不会被其他任何客户端强加。)在此之前,任何客户端都无法猜测其他任何客户端具有哪些底牌。 / p>

如果曾经达到https://en.wikipedia.org/wiki/Indistinguishability_obfuscation,则有可能从组合中删除受信任的服务器。


一个问题。由于服务器具有未加密的密钥,因此您必须相信它没有将其共享给客户端。通过以下更改,我们甚至可以消除该问题。

每个客户端选择其种子,然后将其加密后发送到服务器。服务器共享加密的种子。然后,对于服务器生成的每个随机数,它会向每个客户端请求一个从0到1的随机数,服务器会将随机数加到mod 1,然后将其用于决策。卡片全部公开后,每个人都将其密钥发送到服务器,服务器将密钥和从每个客户端获得的随机数的日志记录下来。如果服务器认为没有任何客户端应该发送他们发送的号码,则该游戏无效。每个客户都可以验证游戏是否公平。

现在,服务器无法过早地显示它没有的信息。没有客户可以改变他们的选择。即使客户端试图与服务器串通,而没有客户端保留的信息,您也无法知道必须发送什么响应才能获得特定的期望结果。

您甚至可以将来自服务器的两条消息保存到文件中,并附带一个开源程序来验证游戏。该程序可以很容易地被公开证明的任何人查看。并为不信任您的客户端并希望构建自己的服务器以供您的服务器使用的用户提供一个测试套件。