7

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

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

这样做的好算法是什么。

4

7 回答 7

7

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

一篇这样的论文:电话掷硬币

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

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

希望有帮助。

于 2011-02-02T20:40:45.200 回答
4

爱丽丝和鲍勃需要能够互相发送他们选择了一个号码的证明,然后才能透露他们选择了哪个号码。然后他们选择的数字需要根据证明进行验证。最后,这两个数字都需要以某种方式连接起来,不会让他们每个人都能完全控制结果。

在以下内容crypto_function中可能类似于sha1sumor md5sum

第 1 步

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

  • Alice 选择随机数Ra1并发Ra2送给Ra1Bob。
  • Bob 选择随机数Rb1并发Rb2送给Rb1Alice。

第 2 步

创建该HxVx现在已固定的证明,但防止从该证明中推断该值

  • Alice 选择一个值Va(0<= Va<=5),组成一个字符串Sa="Va Ra2 Rb1",并将 a 发送Ha=crypto_hash(Sa)给 Bob。
  • Bob 选择一个值Vb(0<= Vb<=5),组成一个字符串Sb="Vb Rb2 Ra1",并将 a 发送Hb=crypto_hash(Sb)给 Alice。

第 3 步

产生期望的结果V

  • 爱丽丝发送Sa给鲍勃。Bob 计算HaSa并与Ha步骤 2 进行比较。然后Va取出Sa,并计算值V=(Va+Vb)%6+1
  • Bob 发送Sb给 Alice。Alice 计算HbSb并与Hb步骤 2 进行比较。然后Vb取出Sb,并计算值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发送Vb和;R鲍勃计算V=(Va+Vb)%6+1

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

......虽然我会感觉更好,如果:

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

并且要散列的字符串变为 then "Vb Q R"

于 2011-02-02T16:12:34.950 回答
4

通过邮件玩的游戏 - 无论是否通过电子邮件 - 用于使用公开的(伪)随机数 - 通常是股票上市(不是特定股票)特定位置的股票价格上市的最低有效数字。这是无法预测的,并且在事件发生后可以验证。玩家将在掷骰子之前交换详细信息,说明股票上市的哪个位置(通常在交易结束时)应该用于下一次掷骰子。

于 2011-02-02T16:16:07.663 回答
4

使用受信任的第三方,例如http://rpglibrary.org/software/securedice,它可以通过电子邮件发送带有序列号和可在线验证的哈希的骰子卷。

于 2011-02-02T16:28:05.110 回答
2

Alice 和 Bob 就使用 Diffie-Hellman 之类的两个会话密钥达成一致,Sa并且Sb. 每个会话密钥都是随机数生成器的种子,Ra并且Rb.

RNG 用作每个模具辊的一次性垫。如果 Alice 想要滚动,则取序列中第 i 个随机数的Ra[i]位置。iAlice 将i和都发送Ra[i]给 Bob。Bob 可以i使用他自己的Ra.

这通过要求 Alice 使用iBob 可验证的顺序值来保持诚实。

于 2011-02-02T16:26:54.440 回答
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
于 2012-02-28T06:21:39.457 回答
0

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

否则玩这个游戏实在是太该死了,我退出了!

于 2011-02-02T16:21:07.307 回答