« 在移动网络上创建更稳定的连接 | 返回首页 | 一起 select 引起的崩溃 »

如何让玩家相信游戏是公平的

去赌场参观过的同学应该都见过那种押大小的骰子游戏。庄家投掷三枚骰子,把骰盅盖住,玩家可以押大或小。开盅后,如果发现三个数字之和大于等于 11 就算大,小于等于 10 就算小。如果你猜对了,庄家就 1 赔 1 算给你筹码;否则输掉筹码。另外,还可以以不同赔率压数字,或压三个相同。

为了保障庄家利益,三个相同的数字算不大不小。从概率上讲,这让长时间内庄家必胜。概率分析见这里

如果把这个游戏搬到网络上如何呢?(注意:网上赌博在很多国家是被禁止的,这里只做技术分析而已)

如何让玩家相信庄家没有作弊,真的产生了随机的骰子呢?

记得网易泡泡曾经在聊天室中做过一个简单的赌大小的文字游戏。我一同学兴致勃勃的玩过,他告诉我系统一定作弊过的。他写了个程序监控每局游戏开盅前的下注情况,到最后一秒再下住,永远下注少的一边(也就是跟庄),只花了一天时间就刷了无数泡泡币。

其实这只是游戏实现者的贪心和无知而已。其实这个游戏的规则保证了庄家利益,庄家没有必要作弊。但有些游戏设计者就是脑子转不过弯来,的确考虑过作弊。不是连六合彩这种极大化庄家利益的游戏规则都有流言暴出庄家作弊么?

那么,是不是网络版的赌大小一定得不到玩家信任呢?

其实有一个简单的方法可以向玩家证明骰子的随机性:

  1. 每局游戏前,先随机三个 1-6 的数字,并同时生成三个足够长(比如 80 字符, 长度在屏幕方便显示的范围即可)的文本随机串,把数字附在随机串的两端。比如随机出 2,4,5 这三个数字,就同时生成形如 2xxxxxxxxxxxxxxx2 , 4xxxxxxxxxxxxxxx4, 5xxxxxxxxxxxxxxx5 (xxxx 每次随机) 的字符串。计算这三个字符串的 md5 值,并事先通过网络展示给玩家。

  2. 玩家收到三个秘密串后开始下注。下注时间有限,只有几分钟的时间。由于 md5 的不可逆性,在这么短时间内,不可能知道串的原文。注:网络上所谓的 md5 破解,都是基于收集有意义的字符串的 md5 值构成海量的数据库比对查找的,并非对 md5 结果做逆运算。纯随机串的 md5 值不可能在很短时间求逆。

  3. 下注时间过了后,系统通过网络公布事先的三个随机数字构成的随机串,也就相当于开盅。这时候,玩家应该认赌服输了。如果他认为系统作弊,可以自行校验系统公布的串的 md5 值是否和事先公开的值相等。

如此便可证明,骰子是在玩家下注前就确定下来的,而不是根据玩家下注的行为更改让庄家获利。

没错,现在有数学证明可以在有限时间构造出另一个符合规则的串有相同的 md5 值。但那也需要相当的计算能力。如果这个网上赌场开的时间足够长,是没有那么多计算能力支撑长期的作弊的。之所以不必选用可能更安全的同类算法,是因为 md5 的普及率和认知程度最高,计算工具也随手可得而已。

如果想进一步提高信任度,让玩家相信没有提前计算出 md5 碰撞值,可以在随机的 xxxxx 中进一步加上上一局游戏的骰子 md5 值,让每次随机量都是和上一次相关的。甚至可以加上上一局游戏参与玩家的赌注金额。这样几乎不可能提交计算某一次游戏的随机串的 md5 碰撞。

关于 MD5 的碰撞构造,多个 md5 chunk 比单个 chunk 要容易的多。单 chunk 的碰撞构造在 2012 年的这篇 paper Single-block collision attack on MD5 中提到的方法的计算复杂度在 2 的 50 次方 MD5 运算量级。不是现在普通的计算机计算能力所能承受的。

虽然不是所有玩家都可以理解这个规则,但规则容易直接在游戏中公示。服务器记录所有历史的数据供玩家备查。还是很容易取得玩家群体的信任的。

Comments

这种算法不适合比较简单的游戏-否则是可以破解的-比如简单的比大小那么结果只有2个或者3个 最多也就对于3个MD5码对不对

@Leo Forest

赌大小的玩法是,庄家 1 赔 2 赔给猜中的人。你开小号赢自己的钱有意义吗?

你这样没有提升庄家的信誉啊,庄家已经知道 2,4,5 这三个数字,他开几个小号去刷就能作弊了

说明了第三方认证工具的重要性。比如这里的MD5算法工具,或者Zip的加密解密,都是第三方的工具。

很少有人了解md5吧

这样好啊 政府人员就可以强制所有赌博类的游戏公司的提供这套机制

dddddddddddd

你这套程序很不错,技术流
北京翻译http://www.winteng.com

事先保存多个 md5有碰撞的 值,发布完md5后庄家按结果选择有利的一个值来用 不一样能作弊么

看了留言发现我已经out好久了。不过这个思路很好。

前提是不能有“庄家通吃”的规则,否则还是有可能作弊

想起见过一个论坛的抽奖,他们是把一个RAR压缩包,加了一串超级长的密码,供人下载,然后个把月之后公布压缩包密码,压缩包里的内容就是中奖信息,这是不是更简单直接啊

我想知道这个原理能不能运用到网络抽奖上面。。。因为感觉网络抽奖的概率会被控制而且信息更加不透明。。。

原理可行,在天朝的法律规定应该是游戏币不能反向兑换回RMB就不算开赌,所以开箱子,砸蛋,欢乐豆的都不算赌博

能理解这套规则的人真的会参与赌博吗??一般这类人都是当庄家的吧。

参加赌博的人一般不了解md5

@aaaa

增加信任度不算太难。我在文中补充了。

只需要让随机串是上下文相关的。每次产生的随机串必须附加上次的 md5 值以及上局玩家的注金。

那么计算能力在每局时间之内,就是可信任的。因为无法提交计算碰撞。

这种方法应用得挺多了,比如论坛上的楼层中奖,发帖时就把加密好的Excel文件放在加密附件里,活动结束时公布rar文件密码,大家都能查看。

JD的fair说得很清楚,还有个verifier: http://bitcoinmaniac.com/justdice/

MD5已经被破解了
构造一个碰撞的时间已经接近PC 的能力范围内了,还不算考虑并行计算

所以至少也应该换个 hash 函数,例如 SHA256 或者 Keccak

类似的东西,已经在比特币赌博上应用很久了, 比如BTC-Dice是一个比较大的国内山寨网站

Post a comment

非这个主题相关的留言请到:留言本