没有裁判,两个人还能玩暗军棋吗?
暗军棋的关键难点在于:
- 双方棋子是扣着放的
- 碰撞时需要比较军衔大小
- 但双方又不想暴露自己的棋子身份
通常这需要一个可信裁判来:
- 偷偷看双方棋子
- 按规则判定输赢
- 只公布结果,不泄露信息
而这篇文章的核心观点是:
可以用密码学把“裁判”替换掉。
这就引出了一个更大的主题:
安全多方计算(Secure Multiparty Computation, MPC)
一、暗军棋问题的抽象
文章先把暗军棋的碰撞规则抽象成一个“比较函数”:
这里:
- 表示一方棋子的军阶
- 表示另一方棋子的军阶
例如:
- 我的军长是 10 级
- 对方连长是 3 级
- 因为 ,所以比较结果是 1
问题在于:
双方都想知道比较结果,但又都不想把自己的具体数字告诉对方。
这正好对应密码学中的一个经典问题。
二、百万富翁问题:比较大小,但不暴露各自的数
文章引入的经典问题是姚期智提出的“百万富翁问题”:
两个富翁如何在不透露自己财富具体数值的情况下,只比较出谁更富有?
这和暗军棋的本质完全一样:
- 都是比较两个私有数字大小
- 都只想公开结果
- 不想公开输入值本身
三、文章里讲的协议想解决什么
作者介绍的协议,本质目标是:
双方各自知道的东西
- 王知道自己的数
- 李知道自己的数
双方共同想得到的东西
- 只知道 和 谁更大
双方不想泄露的东西
- 王不想让李知道自己的具体数值
- 李也不想让王知道自己的具体数值
这就是安全多方计算的典型目标:
共同计算一个函数值,但不泄露各自输入。
四、这套思路的本质,不在细节公式,而在“只公开函数值”
原文用了一个基于公钥加密、随机数和模素数余数的协议,来说明这个思想如何实现。
即使不追细节,也可以抓住它的本质:
协议想达成的效果
- 双方都参与计算
- 双方都没有直接把自己的秘密说出来
- 计算完成后,只暴露“比较结果”
- 而不会暴露具体输入值
作者特别强调,这就是:
安全多方计算:在甲只知道 、乙只知道 的情况下,双方合作计算 ,最后只公开函数值,而不公开彼此输入。
五、回到暗军棋:为什么这个问题就能解决
一旦“比较大小但不泄露数字”的问题解决了,暗军棋就很好理解了。
当两枚棋子碰撞时:
- 双方把自己的军阶当作私有输入
- 共同运行一个安全比较协议
- 最后只得到“谁赢了”这个结果
- 而不暴露军阶本身
这样,密码学协议就替代了裁判。
六、一个现实问题:如果有人作弊怎么办?
作者也主动指出了一个漏洞:
参与者可能不按真实军阶输入,而是报一个更高的等级。
例如:
- 我实际棋子只有 2 级
- 但在协议中输入 10 级
- 对方也无法立刻看出来,因为最终公开的只有比较结果
这说明:
安全多方计算解决的是“隐私下的正确计算”,但不自动保证输入本身真实。
作者给出的补救办法是:
- 游戏结束后双方公开所有棋子
- 对照游戏记录复盘
- 检查每一步输入是否与真实棋子一致
这相当于:
- 计算过程保密
- 事后可验证
七、安全多方计算是什么
文章后半部分把问题从暗军棋推广开来。
安全多方计算(MPC)的核心可以记成一句话:
任意多个参与者,共同计算任意函数;除了函数结果之外,不额外泄露各自输入。
这其实是一个非常强的框架。
它解决的不是某一类特定问题
而是一个一般性问题:
- 你有你的秘密输入
- 我有我的秘密输入
- 我们又必须协作得出一个结果
- 但谁也不想把底牌直接亮出来
八、文中提到的典型应用
1. 拍卖
- 输入:每个人的出价
- 函数:取最大值
- 目标:只公布谁赢了 / 成交价,不暴露所有人的底价
2. 选举
- 输入:每个人投给谁
- 函数:求和计票
- 目标:票数统计公开,但个体投票保持私密
3. 共同好友
- 输入:两个人各自的好友集合
- 函数:取交集
- 目标:只知道共同好友,不暴露各自全部联系人
4. 合作机器学习
- 输入:不同参与方的数据集
- 函数:一个训练算法
- 目标:在不直接共享原始数据的前提下,共同训练模型
这也是近年来非常火的一条路线。
九、这篇文章真正想传达的直觉
这篇文章最有价值的地方,在于它把一个抽象密码学问题,讲成了一个非常直观的日常场景:
我们不是一定需要“可信中间人”,有时可以用协议来代替信任。
也就是说,密码学不只是“加密消息”,更是在设计规则:
- 让陌生人合作
- 让各方不必交出全部信息
- 让结果可信
- 让过程尽量不依赖某个绝对公正的第三方