通过电子邮件掷骰子

时间:2011-02-02 15:57:31

标签: algorithm dice cryptography

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

Alice和Bob希望通过电子邮件玩棋盘游戏。他们需要找到一种不会让他们作弊的方式掷骰子。

这样做的好算法是什么。

7 个答案:

答案 0 :(得分:7)

这是密码学中的经典问题。

一篇这样的论文:Coin Flipping by Telephone

显然也有一些不可能的结果。

例如,本文中的参考文献[C86]:http://www.cs.columbia.edu/~dglasner/MyPapers/coin-cut.pdf

希望有所帮助。

答案 1 :(得分:4)

爱丽丝和鲍勃需要能够在他们揭示他们选择的号码之前向对方发送他们选择号码的证明。然后他们选择的号码需要根据证据进行验证。最后,这两个数字需要以某种方式结合在一起,不会让每个数字完全控制结果。

以下crypto_function可以是sha1summd5sum

第1步

需要使crypto_function的可能值范围足够大

  • Alice选择随机数Ra1Ra2并将Ra1发送给Bob。
  • Bob选择随机数Rb1Rb2并将Rb1发送给Alice。

第2步

创建证明Hx,现在价值Vx已修复,但阻止从该证明中推断出该值

  • Alice选择值Va(0 <= Va&lt; = 5),撰写字符串Sa="Va Ra2 Rb1",然后向Bob发送Ha=crypto_hash(Sa)
  • Bob选择值Vb(0 <= Vb&lt; = 5),撰写字符串Sb="Vb Rb2 Ra1",然后向Alice发送Hb=crypto_hash(Sb)

第3步

生成所需的结果V

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

<强>更新

根据@ Coin Flipping by Telephone建议的Moron,算法可以变为:

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

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

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

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

  5. ......如果我感觉好一点:

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

    然后要散列的字符串变为"Vb Q R"

答案 2 :(得分:4)

通过邮件玩的游戏 - 无论是否是电子邮件 - 用于使用公开的(伪)随机数 - 通常是股票列表中特定位置(不是特定股票)的股票价格列表中的最低有效数字。这无法预测,并且在事件发生后可以验证。玩家将在掷骰子之前交换细节 - 股票清单的位置(通常在营业时间结束时)应该用于下一个骰子卷。

答案 3 :(得分:4)

使用可信赖的第三方,例如http://rpglibrary.org/software/securedice,可以通过电子邮件发送骰子卷,其中包含序列号和可在线验证的哈希值。

答案 4 :(得分:2)

Alice和Bob同意使用Diffie-Hellman,SaSb之类的两个会话密钥。每个会话密钥都是随机数生成器的种子RaRb

RNG用作每个模具辊的一次性垫。如果Alice想要滚动,则取Ra[i],其中i是序列中的第i个随机数。 Alice将iRa[i]发送给Bob。 Bob可以使用自己的i副本验证Ra

这使Alice保持诚实,要求她使用可由Bob验证的i的顺序值。

答案 5 :(得分:1)

我收到了一个类似问题的回复,我问的是如何为R做骰子?除了“亲密骰子”节目之外,回应是R的节目。我不确定Alice和Bob对哪个模块感兴趣,但我建议除了远程桌面之外还使用R,这样每个玩家都可以看到对方没有作弊。

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

如果你想在统计程序中制作骰子,请先点击此处下载:http://cran.r-project.org/

要制作正常骰子,请使用以下脚本:     #Dice roll功能     RollDie = function(n)样本(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

答案 6 :(得分:0)

设置一个自动化的第三方服务器,每个服务器都会发送电子邮件以便骰子滚动并转发给其他玩家?

否则,玩这个游戏的工作太简单了,我就放弃了!