通过不受信任的沟通对不受信任的玩家进行回合制游戏

时间:2014-10-15 19:39:02

标签: cryptography communication

我认为这个问题与密码学有关。 假设玩家A和B想通过互联网玩Rock Paper Scissor游戏。 没有一台服务器既可以信任,也不会相互信任而不会作弊。 我想知道他们如何在给定场景下玩公平游戏。 更确切地说,如果两名球员都没有被骗,那么应该有一种机制让双方球员确保不会被骗。

这是一个天真的解决方案,不起作用: 首先,两个玩家都将他们的选择发送到服务器。在服务器收到两个选项后,它会向两个播放器发送选择。 这不起作用的原因是服务器可能是玩家A的帮凶。它将在接收玩家A的选择之前秘密地发送玩家B的选择。然后玩家A可以做出赢得玩家B的选择。在整个过程中,玩家B无法知道玩家A是否被欺骗。

1 个答案:

答案 0 :(得分:2)

您可以使用安全散列函数和随机数生成器,让玩家在显示之前致力于移动。

这样的事情:

  • 每个玩家生成一个随机字符串,并将其发送给其他玩家。

  • 每个玩家生成第二个随机字符串,并保密(暂时)。

  • 每个玩家选择他们的移动,并使用散列函数为其生成签名,并连接两个随机字符串以创建秘密。在伪代码中可能HMAC_SHA512( my_string + other_string, move ),其中第一个参数是MAC的秘密,而+我的意思是字符串连接。同样HMAC_SHA512( my_string, other_string + move )也可以。

  • 玩家互相发布签名。在这个阶段,他们公开承诺采取匹配的签名行动。

  • 然后玩家会互相展示他们的动作和第二个秘密字符串,以便验证签名。

这依赖于以下事实:如果很难找到哈希冲突(两个秘密,当与其他玩家和#34;盐"以及将创建相同签名的移动结合时)。从技术上讲,哈希函数需要collision resistancesecond preimage resistance才能在这种情况下运行良好 - 前者通常意味着后者,现代加密库中可用的大多数HMAC函数都具有这些属性,至少从没有已知攻击的实际观点比蛮力更好。一旦使用组合秘密与HMAC-SHA512签署的移动(将秘密与来自其他玩家的数据相结合意味着您必须在游戏期间查看,而不是提前搜索碰撞),玩家将发现无法宣布任何内容除了原先签名的移动而没有被注意到。

生成的随机字符串无法猜测或尝试所有可能性也很重要。它们应该很长(例如32个字节)并使用安全的随机数生成器生成。如果玩家可以简单地尝试所有可能的随机字符串,他们就可以找出正在签名的内容并使用正确的反向移动进行响应。

请注意,此方法不依赖于服务器。服务器或网络可以在这里创建一个中间人攻击(通过丢弃一个或两个玩家的通信,并用自己的替换 - 它不一定会控制游戏结果,但可能意味着玩家并没有真正互相玩,而是服务器),所以如果通信是安全地进行点对点的话,那就更好了。如果点对点成本很高,那么唯一必须以这种方式发送的是签名 - 如果玩家之间的任何组件然后尝试改变它将显示为签名与发布值不匹配的任何内容。