盲打扑克(盲人打扑克)

  两个象棋大师可以在浴室一边冲澡一边大喊“炮八平五”、“马八进七”,等澡洗完了,一盘精彩的棋局或许也就结束了。棋类游戏之所以可以“盲下&rd

本文最后更新时间:  2023-05-18 13:53:45

  两个象棋大师可以在浴室一边冲澡一边大喊“炮八平五”、“马八进七”,等澡洗完了,一盘精彩的棋局或许也就结束了。棋类游戏之所以可以“盲下”,就是因为在棋类游戏中,双方的局面信息都是完全公开的。

  现在两个人想通过一部电话打牌,但他们都不信任对方。打牌和下棋不一样,各人在开局时并不知道对方手里有哪些牌。因此如果你说出方块A,你如何证明自己手里有方块A,或者如何在牌局结束后证明自己没有作弊?也就是有没有可能仅通过一部电话实现某种扑克牌协议,该协议不仅能够实现随机的、隐蔽的、公平的发牌,而且不需要其他东西的帮助,并且保证游戏的公正性呢?

答案:下面以一手五张牌为例,说明如何随机、隐蔽、公平地实现“两人各摸五张牌”。 不妨用数字1~54来表示54张牌。发牌前,甲在每个数字前附加一个随机字符串前缀,然后给每个字符串都加上一把锁,把54张加密的扑克牌传给乙。乙收到了扑克牌一看,这些牌他一张也不认识,每张牌上面都有甲的锁。乙从里面挑选5张牌出来。他自己不知道这5张牌是什么,但是他也不能让甲知道,于是他在这5张牌上再各加一把锁,传给甲。甲可以解开自己当初上的那把锁,但牌上还有一把锁,甲拿它没办法,只能原封不动地传回去。乙把剩下的锁解开,得到自己的5张牌。然后呢,乙手上不是还剩了49张牌吗?乙从中随便挑5张出来给甲,由甲解开上面的锁,得到甲的5张牌。 听起来很完美,但实现起来并不简单。上锁开锁和加密解密并不完全相同:两把锁的地位是相同的,但两次加密则有先后的问题。要想把上述协议转换为密码学协议的话,我们需要采用这样一种加密方式:明文首先由甲加密,乙在这个密文的基础上再进行加密,此时甲还能够把里面那一层密码解开,而保持乙的那一层密码不动。 密码学上有一种复杂也安全的加密方法满足这种“交换律”:RSA算法。我们也可以用一种相对简单的加密方法是:甲、乙各想一个非常大的质数,加密过程就是把已有的数乘上这个质数,解密过程就是把得到的数除以这个质数。把两个很大的数相乘或相除是件很简单的事,但要分解一个很大的数则很困难。这样在时间有限的情况下就能保证对方不能破解出自己的质数来。这样下来,每个人都得到了自己的一手牌,而都不知道对方手里捏的是什么牌。以后如果还需要摸牌,则可以重复刚才的协议。游戏结束后,双方公开自己的质数,你可以验证看对方的质数与游戏中的数据是否吻合,以确定对方在游戏过程中是否作弊。这个协议可以轻易扩展到多个人的情况,也可以适用于更复杂的扑克牌游戏。

温馨提示:内容均由网友自行发布提供,仅用于学习交流,如有版权问题,请联系我们。