原始论文:https://www.cs.cmu.edu/~mblum/research/pdf/coin/
知乎讨论:https://www.zhihu.com/question/30824110
假设 Alice 抛,Bob 猜,只要 Alice 无法捏造,Bob 无法破解,那么应当认为是一个可以用来抛硬币的协议。
重点在于 Alice 和 Bob 要对抛硬币结果达成一致,不然就是「你猜正面是吧,我扔……诶,你输了」。
同时概率要确保是 50/50。
因此像同时向对方喊话、担心某人反悔之类的问题都是不被考虑进来的。
例如,根据知乎高赞思路,Alice 可以选择两个大质数/三个大质数相乘,然后得到一个长度固定的数字。
那么 Bob 基本上就无法破解这个数字到底是两个质数相乘还是三个质数相乘,他只能猜测这是前者还是后者。
而 Bob 做出猜测后,Alice 要给出相乘的几个数字。Bob 很快就能验证 Alice 的答案是否正确。
注意,我们要求的是对结果达成一致,所以不存在 Alice 说「我数字忘了,再来一局吧」这种反悔情形。
但是有人也提出这个是不是概率不是 50/50,毕竟这和剪刀石头布一样,如果对对方的取样习惯有研究,例如 Alice 习惯选俩质数,那么 Bob 还是有可能利用这一点。
不考虑缺陷,上面的做法也有更快的方式,例如 Alice 拿一个大数字求 sha256,然后让 Bob 猜测这个大数字是奇数/偶数。
显然,Alice 几乎不可能在有限时间内,在 Bob 猜对之后,拿另一个不符合 Bob 猜测的大数字去碰撞出同一个 sha256 值。
当然,高赞底下的一个答案就比较合理,因为这是 Alice 挑大质数 p, q,做乘积 = N 后给 Bob。
Bob 从 0 ~ N-1 挑一个数字 x ,计算之后给 Alice。
Alice 根据 Bob 的数字能解出两个结果,其中一个是 Bob 挑的数字 x,其中一个不是,记为 y。Alice 必须选一个发给 Bob。
若挑的是 y,那么 Bob 就能根据 x 和 y 解出 p, q。如果是,那么 Bob 就依然无法解出p, q。
这就去除了「根据对方习惯预判对方选择」的问题,因为 Bob 的选择空间太大,这是很难猜测出来的。