我被问到这个问题,但是没有找到一篇描述好方法的文章。相反,我想出了自己的方法(请参见下面的答案)。然而,也有可能我只是想出了一个我聪明不够无法破解的方法。所以我把这个问题转给你:
Alice和Bob希望通过电子邮件玩一个棋盘游戏。他们需要找到一种掷骰子的方法,以避免作弊。
有什么好的算法可以做到这一点。
我被问到这个问题,但是没有找到一篇描述好方法的文章。相反,我想出了自己的方法(请参见下面的答案)。然而,也有可能我只是想出了一个我聪明不够无法破解的方法。所以我把这个问题转给你:
Alice和Bob希望通过电子邮件玩一个棋盘游戏。他们需要找到一种掷骰子的方法,以避免作弊。
有什么好的算法可以做到这一点。
这是密码学中的一个经典问题。
其中一篇论文:Coin Flipping by Telephone。
也存在一些明显的不可能性结果。
例如,本文中的参考资料[C86]:http://www.cs.columbia.edu/~dglasner/MyPapers/coin-cut.pdf
希望这可以帮到您。
Va
(0<=Va
<=5),组成一个字符串Sa="Va Ra2 Rb1"
,并将Ha=crypto_hash(Sa)
发送给Bob。Vb
(0<=Vb
<=5),组成一个字符串Sb="Vb Rb2 Ra1"
,并将Hb=crypto_hash(Sb)
发送给Alice。步骤三:
生成所需的结果V
Sa
。Bob从Sa
中计算Ha
并将其与步骤2中的Ha
进行比较。然后从Sa
中取出Va
,并计算值V=(Va+Vb)%6+1
。Sb
。Alice从Sb
中计算Hb
并将其与步骤2中的Hb
进行比较。然后从Sb
中取出Vb
,并计算值V=(Vb+Va)%6+1
。更新:
Bob随机选择一个数字R
和值0 <= Vb <= 5
,
计算哈希值H=crypto_hash("Vb R")
,并将其发送给Alice。
Alice选择值0 <= Va <= 5
,并将其发送给Bob。
Bob向Alice发送Vb
和R
;
Bob计算V=(Va+Vb)%6+1
Alice验证H=crypto_hash("Vb R")
;
Alice计算V=(Va+Vb)%6+1
...虽然如果:
0. Alice随机选择了一个数字Q
并将其发送给Bob。
然后要进行哈希的字符串变为"Vb Q R"
。
V
的过程中,看起来您正在使用关于 Va
和 Vb
范围的假设。您能否明确这些假设? - Josh Lee通过邮件玩的游戏 - 无论是电子邮件还是其他方式 - 曾经使用公开可见的(伪)随机数 - 典型的是股票价格清单上某个位置的最低有效数字(不是特定的股票)。这个数字是不可预测的,并且可以在事件发生后进行验证。玩家们会在掷骰子之前交换细节,确定下一次掷骰子应该使用股票清单的哪个位置(通常是营业结束时)。
使用可信赖的第三方工具,例如http://rpglibrary.org/software/securedice,该工具可以通过电子邮件发送带有序列号和可在网上验证的哈希值的骰子点数。
Sa
和Sb
。每个会话密钥都是随机数生成器Ra
和Rb
的种子。Ra[i]
。艾丽斯将和Ra[i]
发送给鲍勃。鲍勃可以使用自己的Ra
验证。我收到了一个类似的问题的回答,我的问题是如何为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
设置一个自动化的第三方服务器,每个人都可以将其骰子掷出的结果通过电子邮件发送给其他玩家?
否则,这个游戏就太麻烦了,我放弃了!