通过电子邮件掷骰子

7

我被问到这个问题,但是没有找到一篇描述好方法的文章。相反,我想出了自己的方法(请参见下面的答案)。然而,也有可能我只是想出了一个我聪明不够无法破解的方法。所以我把这个问题转给你:

Alice和Bob希望通过电子邮件玩一个棋盘游戏。他们需要找到一种掷骰子的方法,以避免作弊。

有什么好的算法可以做到这一点。


1
@Justin Morgan:他只是两分钟前提出问题的,请给他一点时间... - Platinum Azure
看起来他只是忘记粘贴了,仅此而已 :) - Justin Morgan
我猜在背景中包含一个常见频道上的电视设置的卷视频不算数? - Matthieu M.
@matthiew 这如何防止多次滚动直到达到最佳结果? - Dr. belisarius
7个回答

7

4
Alice和Bob需要能够互相发送一个数字选择的证明,然后才揭示他们选择的数字。然后选择的数字需要与证明进行验证。最后,两个数字需要以某种方式结合在一起,使得他们都不能对结果拥有完全控制。
在下面的crypto_function中,可以使用类似于sha1sum或md5sum之类的函数:
第1步: 为了使下面的crypto_function可能的值范围足够大, - Alice随机选择数字Ra1和Ra2,并将Ra1发送给Bob。 - Bob随机选择数字Rb1和Rb2,并将Rb1发送给Alice。
第2步: 创建证明Hx,证明值Vx已经固定,但是防止从该证明推导出该值。
  • Alice选择一个值Va (0<=Va<=5),组成一个字符串Sa="Va Ra2 Rb1",并将Ha=crypto_hash(Sa)发送给Bob。
  • Bob选择一个值Vb (0<=Vb<=5),组成一个字符串Sb="Vb Rb2 Ra1",并将Hb=crypto_hash(Sb)发送给Alice。

步骤三:

生成所需的结果V

  • Alice向Bob发送Sa。Bob从Sa中计算Ha并将其与步骤2中的Ha进行比较。然后从Sa中取出Va,并计算值V=(Va+Vb)%6+1
  • Bob向Alice发送Sb。Alice从Sb中计算Hb并将其与步骤2中的Hb进行比较。然后从Sb中取出Vb,并计算值V=(Vb+Va)%6+1

更新:

根据@Moron提出的电话翻转硬币,算法可以变成以下形式:

  1. Bob随机选择一个数字R和值0 <= Vb <= 5, 计算哈希值H=crypto_hash("Vb R"),并将其发送给Alice。

  2. Alice选择值0 <= Va <= 5,并将其发送给Bob。

  3. Bob向Alice发送VbR; Bob计算V=(Va+Vb)%6+1

  4. Alice验证H=crypto_hash("Vb R"); Alice计算V=(Va+Vb)%6+1

...虽然如果:

0. Alice随机选择了一个数字Q并将其发送给Bob。

然后要进行哈希的字符串变为"Vb Q R"


听起来像是我会做的事情。虽然我认为你在最终计算中不需要-2。模数运算可以解决这个问题。我猜想你的随机数并不是要类似于掷骰子,但这是我第一次阅读时的想法,所以你可能需要澄清一下。 - Chris
1
在计算 V 的过程中,看起来您正在使用关于 VaVb 范围的假设。您能否明确这些假设? - Josh Lee
@Chriss,@jieedev,谢谢。我已经整合了你们的评论。 - Chen Levy

4

通过邮件玩的游戏 - 无论是电子邮件还是其他方式 - 曾经使用公开可见的(伪)随机数 - 典型的是股票价格清单上某个位置的最低有效数字(不是特定的股票)。这个数字是不可预测的,并且可以在事件发生后进行验证。玩家们会在掷骰子之前交换细节,确定下一次掷骰子应该使用股票清单的哪个位置(通常是营业结束时)。


2
现代版本可以类似于http://www.rpglibrary.org/software/securedice/,它可以通过电子邮件发送带有序列号和可在线验证的哈希值的骰子点数。 - Justin Morgan
1
@justin 把它作为答案发布!- 序列号是关键问题。 - Dr. belisarius
你还需要解决一个问题,即玩家可以通过选择何时掷骰子来选择其值。 - Chen Levy
1
@Chen - 是的,你需要,尽管这部分问题已经通过玩家不进行掷骰子选择位置和未来日期时间的列表来解决,供掷骰子使用。但它仍然无法解决多个骰子掷出用于不同目的的问题,而掷骰子者可以选择骰子掷出的顺序。因此并非完全防作弊,但对于棋盘游戏来说已经足够了,最终的解决方法是不与你怀疑作弊的人玩游戏。 - Chris Walton

4

2
艾丽斯和鲍勃使用Diffie-Hellman等协议来生成两个会话密钥,分别是SaSb。每个会话密钥都是随机数生成器RaRb的种子。
这些随机数生成器用作每次掷骰子的一次性密码本。如果艾丽斯想掷骰子,她取出序列中的第i个随机数Ra[i]。艾丽斯将Ra[i]发送给鲍勃。鲍勃可以使用自己的Ra验证
这使得艾丽斯必须使用可由鲍勃验证的顺序值,从而保持了艾丽斯的诚实。

如果Bob也有Ra并且知道接下来的i是什么,那么他不是可以在Alice发送骰子之前预测骰子的点数吗?这会让“谁先掷出六点”的游戏变得有些无聊... - Spacedman
这个游戏不是已经无聊了吗? ;) 是的,如果下一次掷骰子的不确定性很重要,那么这不是正确的解决方案。但在那并不重要的情况下,这可能是最简单的解决方案。 - Justin Morgan

1

我收到了一个类似的问题的回答,我的问题是如何为R制作骰子?回答是提供了一个R程序以及一个“亲密骰子”的程序。我不确定Alice和Bob对哪种骰子感兴趣,但我建议使用R加上远程桌面,这样每个玩家都可以看到另一个玩家没有作弊。

我不知道如何编写代码,所以我复制/粘贴了我收到的回答:

如果您想在统计程序R中制作骰子,请从这里开始下载:http://cran.r-project.org/

要制作普通骰子,请使用以下脚本: #Dice roll function RollDie = function(n) sample(1:6,n,replace=T) #use Die RollDie(n)

#If you'd like to spice things up a bit and make a dice for safe and consensual adult
#activities then use the following series of scripts:

#Creating the function, use this script:
#Intimate dice function

Actions= c("kiss","lick","suck","bite",
"spank","blow", "stroke",
"tickle","pinch",
"torment")

Body= c("lips","arms","chest","thighs",
"neck","ear", "wrist",
"navel","nipples",
"the good stuff")

Action= function(n) sample(Actions[1:10],n,replace=T)

Area= function(n) sample(Body[1:10],n,replace=T)

Action(1)

Area(1)

#If you'd like the dice saved to the R global environment so you can be ready for when
the mood is right use the following script:

#Save the following script as yourfile.R in something like this location "C:\\Documents           
and Settings\\yourfile.R"

#Intimate dice
Action(1)
Area(1)
#yes

#Now create the following function to save to R's global environment with the following:    

#Run all
source("C:\\Documents and Settings\\yourfile.R",echo=T)

hi<-function(){source("C:\\Documents and Settings\\yourfile.R",echo=T)}

#ok

#close and save your R workspace 
#upon opening run the following function:
hi()
#If this has been done properly then you should see something along the lines of this:
#Intimate dice
Action(1)
[1] "bite"

Area(1)
[1] "ear"

#yes

#Here's to one more reason for celebrating math & science

0

设置一个自动化的第三方服务器,每个人都可以将其骰子掷出的结果通过电子邮件发送给其他玩家?

否则,这个游戏就太麻烦了,我放弃了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接