市中心的巷子深处有家奇特的私房菜馆。大厨老王一天只做四道招牌菜,顾客小赵嘴馋,却想守住一个秘密:他今天想尝哪一道。老王也有一层顾虑:四道菜各有家传秘方,小赵只能尝自己选的那一道,其余三道得连味道都猜不出。问题来了——两人不愿请裁判,老王的菜馆又装不起玻璃厨房。于是他们请来一位“数学魔法师”:一道看不见的隔味门,让小赵蒙眼舀菜,老王看不出他舀的是哪锅,小赵也学不到其他锅的秘方。这道门,就是遗忘传输(Oblivious Transfer,OT)。遗忘传输是隐私计算世界最基础的积木:隐私求交、联邦学习、安全多方计算的底层,几乎都踩着它。本文就用老王的盲选私房菜作比喻,带零基础读者建立直觉,再看懂它的协议变体、安全模型、核心算法与工程落地。

岗位关联

遗忘传输是隐私计算的“原子操作”:读懂它,你就拿到了隐私求交、隐私机器学习等热门方向的入场券,是数据工程与 AI 开发者进阶隐私计算领域的必修第一课。

目录
  1. 可视化演示
  2. 基本概念
  3. 协议变体
  4. 安全模型
  5. 核心算法
  6. 工程实践
  7. 应用场景
  8. 未来趋势
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

基本概念

老王想出的“盲选规则”很简单:四道招牌菜装在四只一模一样的砂锅里,小赵蒙上眼罩,用一只长柄勺探进其中一只锅,舀一勺尝。规则有两条底线——第一,老王不能偷看小赵的勺子伸进哪只锅;第二,小赵的勺子只能碰到自己选的那道菜,其他锅的盖子纹丝不动。大家发现,这个规则最难的地方在于:没有服务员当裁判,老王的厨房也没有监控。也就是说,规则只能靠“门”本身的魔力来维持。

把这个场景抽象成计算机语言,就是遗忘传输的雏形。发送者(老王)手里握着 n 条消息(菜谱),接收者(小赵)握着选择编号 b(想尝哪道),协议结束后,接收者恰好得到第 b 条消息,而发送者看不出 b 是几,接收者也学不到其他任何一条消息。这套流程在密码学里记为 OTₙ¹,读作“1-out-of-N 遗忘传输”——从 N 个里遗忘式地传 1 个。

最小、也最常被当成积木的单元是 1-out-of-2 遗忘传输:发送者持 m₀、m₁,接收者持 b ∈ {0,1},输出恰好是 m_b。这里有两个方向相反的隐私条款:接收者隐私要求发送者看不出 b;发送者隐私要求接收者拿不到 m_{1-b}。注意,它和普通的“加密传输”根本不是一回事——加密传输假设发送者值得信任,只是防外部窃听;而遗忘传输假设发送者和接收者互相提防,谁都不肯让步半分。

回到菜馆:小赵尝完菜,心满意足地擦嘴。老王在厨房里收拾,看见的只是一只空锅和一把勺子——他不知道刚才端出去的是清蒸鲈鱼还是红烧肉。而小赵舌尖上也只有那一口鲜味,另外三口锅的香气,像被这门魔法吸走了一般,与他彻底无关。

OT21:  (m0, m1)×b  ⟼  mb\mathsf{OT}^{1}_{2}:\; \left(m_0,\, m_1\right) \times b \;\longmapsto\; m_b
这个式子读作:两条消息与一个选择位进入协议,结束时接收者只拿到自己选中的那一条。
  1. 输入消息对发送者手里的两道秘方,一道都不能被对方同时拿到。
    (m0, m1)\displaystyle (m_0,\, m_1)
  2. 选择位b 是接收者心里的小算盘,只属于接收者本人,发送者看不见。
    b∈{0, 1}\displaystyle b \in \{0,\, 1\}
  3. 输出结果协议结束,接收者恰好得到 m_b,另一条消息始终是雾里看花。
    ⟼mb\displaystyle \longmapsto m_b

协议变体

老王后来发现,光有两口锅不够用。熟客的口味越来越刁,有人想从四道菜里选,有人想要一张“万能券”——今天不想决定,明天凭券再来选一次。于是老王把盲选规则做成了三款套餐,对应遗忘传输的三种重要变体。

第一款是最小的“对赌套餐”,即 1-out-of-2 OT,两道菜选一道,前面的公式描述的就是它。第二款是“满汉全席盲选”,即 1-out-of-N OT,一长排砂锅任选其一。第三款是“魔法券”,学名叫不经意伪随机函数(OPRF):顾客手持一个数 x,厨房持密钥 k,双方共同算出 F(k, x),但厨房不知道 x 是什么,顾客也学不到 k——下次来,凭这张券还能接着选。

1-out-of-N 不需要真的造 N 道魔法门。如果 N = 2^ℓ,只需 ℓ 个 1-out-of-2 门嵌套在一起:把选择下标 b 写成二进制,每一位比特对应一道门,逐层收窄范围。比如 4 道菜写成两位二进制:第一位决定“左半还是右半”,第二位决定“上半还是下半”,两次盲选后答案就锁定了。这种“用 log 级别的门办成 N 选 1”的组合法,是协议设计里最常见的省钱思路。

小赵对着满汉全席的一百零八道菜微微一笑:他只需回答“左边还是右边”七次——因为 2⁷ = 128 足够覆盖 108 道菜。每一次回答都在蒙眼状态下完成,老王听了一串“左、右、右、左……”的暗语,却怎么也拼不出最终答案。

OTN1  ⟶  ⌈log⁡2N⌉×OT21\mathsf{OT}^{1}_{N} \;\longrightarrow\; \lceil \log_2 N \rceil \times \mathsf{OT}^{1}_{2}
含义:一道 1-out-of-N 门,等价于 ⌈log₂N⌉ 道 1-out-of-2 门串成的一条流水线。
  1. 二进制位数把 N 写成二进制需要的比特数——4 道菜是 2 bit,108 道菜是 7 bit。
    ⌈log⁡2N⌉\displaystyle \lceil \log_2 N \rceil
  2. 门组合每道 1-of-2 门负责收窄一个比特,ℓ 道门嵌套后等效于一道 1-of-N 门。
    ×  OT21\displaystyle \times \;\mathsf{OT}^{1}_{2}

安全模型

老王最担心两件事:小赵会不会偷偷掀眼罩?会不会用花言巧语套他的秘方?这两种担心,恰好对应密码学里的两个安全模型——半诚实模型和恶意模型。它们是所有隐私协议都必须回答的“考卷”。

半诚实模型里,双方“规矩但好奇”:严格按协议流程执行每一步,但在协议结束后,会翻看所有聊天记录和中间结果,试图推断对方的秘密。这就像小赵全程老实蒙着眼,但散场后悄悄问服务员:“刚才老王往哪只锅里加了葱花?”恶意模型则严酷得多:参与方可能随时篡改消息、提前中止协议、派替身发言,甚至故意发送错误数据污染结果——这相当于小赵直接掀掉眼罩抢菜单。

密码学用什么证明协议在这两种考卷面前都及格?答案是“模拟器”思想:构造一个理想世界,里面有一位绝对可信的裁判替双方完成计算;再与现实世界(没有裁判、只有数学魔法)对比。如果任何对手都能看出两场戏的区别,说明协议泄密;如果区别小到可忽略,就说明现实世界的魔法门和理想裁判一样可靠。这里的“可忽略”用安全参数 λ 来衡量,λ 越大,失败概率越小。

半诚实的及格线是“小赵蒙着眼但忍不住偷听”,恶意的优秀线是“小赵直接掀眼罩还要抢菜单”。好的遗忘传输协议必须两道坎都迈过去:前者是所有新协议的第一版标配,后者是落地到真实系统前的终极考验。

Adv(A)=∣Pr⁡[Real]−Pr⁡[Ideal]∣≤negl(λ)\mathsf{Adv}(\mathcal{A}) = \left|\Pr[\mathrm{Real}] - \Pr[\mathrm{Ideal}]\right| \le \mathsf{negl}(\lambda)
对手的优势等于“现实协议”与“理想裁判”两场戏的可区分程度,必须小到随安全参数增长而趋近于零。
  1. 两场戏Real 是真实协议,Ideal 是理想裁判下的协议,两个概率分别代表对手以为自己在哪场戏里。
    Pr⁡[Real],  Pr⁡[Ideal]\displaystyle \Pr[\mathrm{Real}],\; \Pr[\mathrm{Ideal}]
  2. 区分优势对手猜错场景的概率差,就是他的“优势”。
    ∣Pr⁡[Real]−Pr⁡[Ideal]∣\displaystyle \left|\Pr[\mathrm{Real}] - \Pr[\mathrm{Ideal}]\right|
  3. 可忽略函数随 λ 增大急速趋零,比如 2⁻¹²⁸,工程上等于不可能。
    negl(λ)\displaystyle \mathsf{negl}(\lambda)

核心算法

隔味门的“建造图纸”直到 1985 年才被三位工匠画出来——Even、Goldreich 和 Lempel,他们用的材料是一种叫 RSA 的密码锁。理解这段历史,就能理解遗忘传输为什么“只能靠公钥密码学”。

RSA 锁的特点是单向:公钥 (N, e) 是“扣锁按钮”,谁都能把锁扣上;私钥 d 是“万能钥匙”,只有持有者能打开。扣锁容易开锁难,没钥匙的人只能干瞪眼。遗忘传输正是借这个“单向落差”搭起隔味门。具体流程分三步:老王(发送者)生成 RSA 密钥,把公钥公开;小赵(接收者)随手挑一个随机数 x 当“真身”,再造一个随机数 k 当“障眼法”;然后按自己的选择位决定顺序——如果 b=0,就把 x^e 放进 0 号盒、k^e 放进 1 号盒,反过来亦然。

两个盒子寄到厨房后,关键魔术登场:在 RSA 假设下,x^e 和 k^e 都是均匀分布的随机数,老王用公钥怎么也看不出哪个盒子藏着 x。他用私钥 d 把两个盒子都打开,得到 y₀、y₁,再把两道菜的秘方分别异或上 H(y₀)、H(y₁) 寄回。小赵收到后,因为自己知道其中一个 y 就是 x,用 H(x) 一异或,正好还原出 m_b;而另一个 y 他算不出来,m_{1-b} 便永远裹在雾里。现代实现往往把 RSA 换成椭圆曲线(如 X25519),结构完全一致,只是把“取模幂”换成“点乘”,同等安全强度下钥匙更短、运算更快;协议结束时还能验证:接收者确实只拿到了 m_b,其余消息则差之毫厘谬以千里。

回到菜馆:小赵把两口砂锅盖得严严实实寄进厨房,老王挨个掀盖——两只锅的香味一模一样,他永远猜不出哪只锅里藏着 x。小赵呢?他用自己手里的 x 当钥匙,只打开属于自己那封信,另一封信烧成了灰。

ci=vie mod N,yi=cid mod N,zi=mi⊕H(yi)c_i = v_i^{e} \bmod N,\qquad y_i = c_i^{d} \bmod N,\qquad z_i = m_i \oplus H(y_i)
接收者用公钥上锁、发送者用私钥开锁、再用异或信封裹消息——这是 RSA 基础 OT 的三大动作。
  1. 上锁动作接收者把随机数 v_i(x 或 k)用公钥 e 扣进锁里,外人看不出哪个是 x。
    vie mod N\displaystyle v_i^{e} \bmod N
  2. 开锁动作发送者用私钥 d 同时打开两把锁,得到两个群元素 y₀、y₁。
    cid mod N\displaystyle c_i^{d} \bmod N
  3. 异或信封消息和群元素的哈希做异或,像把纸条裹进只有对应钥匙能开的信封。
    mi⊕H(yi)\displaystyle m_i \oplus H(y_i)

工程实践

每做一次 OT 就要开一次 RSA 的大火,菜价贵得离谱。老王后来想通了:能不能先花重金熬一锅浓汤底,之后每道菜只用小火快炒?这个思路在密码学里被称为“OT 扩展”,是遗忘传输从论文走进生产系统的分水岭。

2003 年,Ishai、Kilian、Nissim 和 Petrank 四人给出了著名的 IKNP 方案。核心思想是:先用 κ 次“真金白银”的基础 OT(公钥运算)建立一张随机相关性矩阵,然后借助“相关鲁棒哈希”把这份相关性成百上千倍地放大,一次性派生出 n 个廉价的 OT。放大阶段只调用哈希函数和伪随机生成器,全是流水线友好的轻量运算。

工程落地时还有三件事要盯紧。第一是参数选型:基础 OT 的安全参数 κ 通常取 128,消息定长、选什么椭圆曲线(如 Curve25519)都直接影响性能。第二是性能优化:把上万个 OT 打包成矩阵运算并发执行,通信量压缩到每 OT 仅几百比特。第三是安全实现:随机源必须是密码学安全随机数生成器,历史上因随机数污染导致 OT 泄密的案例不在少数。综合下来,一次扩展能把成本压到:公钥运算只剩 O(κ) 次、对称运算 O(n) 次,而 n 可以轻松到百万级。

一锅浓汤底能撑起一百桌盲选宴席,每桌只花几毛钱的燃气费——这就是 OT 扩展的魔法所在。如今工业级隐私计算平台里跑的 OT,几乎都是“底料 + 小火”的扩展结构,而不是笨重的一锅一锅现烧。

Cost(n)=O(κ)⋅PKE  +  O(n)⋅Hash,κ≪n\mathrm{Cost}(n) = O(\kappa)\cdot \mathrm{PKE} \;+\; O(n)\cdot \mathrm{Hash},\qquad \kappa \ll n
公钥运算次数只由安全参数决定、与消息规模无关;哈希等对称运算虽然随 n 增长,但单价极便宜。
  1. 公钥开销昂贵的 RSA/椭圆曲线运算只做 κ 次,不再随消息数 n 增长。
    O(κ)⋅PKE\displaystyle O(\kappa)\cdot \mathrm{PKE}
  2. 对称开销哈希与伪随机生成随 n 线性增长,但每个都极其廉价。
    O(n)⋅Hash\displaystyle O(n)\cdot \mathrm{Hash}
  3. 规模悬殊κ 远比 n 小,正是扩展方案能大幅省钱的根源。
    κ≪n\displaystyle \kappa \ll n

应用场景

老王的盲选魔法很快传遍了美食江湖。两家餐厅想搞联名活动,先得知道有多少顾客是两家的共同熟客,但谁都不肯把完整客户名单交给对方——这份名单可是立店之本。老王拍板:用盲选门来算交集!

这个场景在隐私计算里叫隐私求交(PSI)。做法是:双方先把各自的客户手机号哈希成“匿名代号”,装进布谷鸟哈希表的格子里,再对每一格执行一次 OT 式的安全比较。比较的结果只有“这格上的代号两边都有”或“没有”两种情况,非交集的代号在对方眼里永远是乱码。同理,遗忘传输也是 GMW 等安全多方计算协议的地基:布尔电路里每个“与门”的求值,都可以用一次 OT 实现秘密分享下的安全计算。

隐私机器学习是另一个重镇:两家机构联合训练逻辑回归,梯度交换时用 OT 相关原语做安全聚合,保证“对方只得到聚合结果,得不到你的原始梯度”;联邦学习的样本对齐阶段,也常常先用 OT 构造的 PSI 找到共同样本 ID,再开始训练。可以说,凡是“既要合作、又要保密”的数据协作,OT 都有出场机会。

两家老板在小黑屋里各自报出用代号写的名单,最后只知道“这 300 人是共同的”,却不知道对方还有哪些别的高端客户——OT 让这场联名活动既热闹又体面,谁的面子都没丢。

X∩Y={x∈X  |  H(x)∈H(Y)}\mathcal{X} \cap \mathcal{Y} = \left\{ x \in \mathcal{X} \;\middle|\; H(x) \in H(\mathcal{Y}) \right\}
隐私求交的本质:双方只公布交集元素,交集之外的信息在哈希与 OT 的双重遮挡下原样保密。
  1. 匿名代号哈希把真实手机号变成“代号”,对方无法从代号反推真人。
    H(x),  H(Y)\displaystyle H(x),\; H(\mathcal{Y})
  2. 交集判定只有两边代号一致的元素才落入交集,其余全部落空。
    X∩Y\displaystyle \mathcal{X} \cap \mathcal{Y}

未来趋势

江湖上流传着一个传说:有一台量子计算机即将问世,RSA 那套魔法锁在它面前像纸糊的。老王坐不住了——如果锁匠的手艺过时,整座盲选菜馆都得关门。遗忘传输的未来,正在于换锁、提速与铺路。

换锁的方向叫后量子密码。目前最被看好的候选是格密码(LWE 问题):把秘密配方藏在带噪声的线性方程组里,已知公开矩阵 A 和结果 b,想反推出秘密 s 极其困难——连量子计算机也只能望洋兴叹。基于 LWE 的 OT 已经出现在学术界和标准化草案中,安全模型也从“可忽略优势”升级到“后量子不可区分”。提速的方向是硬件加速:FPGA 和专用芯片把哈希与多项式乘法做成流水线,OT 吞吐量提升了几个数量级。铺路的方向是产业落地:隐私计算平台把 OT 封装成 SDK,数据工程师只需调用两行接口,就能完成一次安全的盲选。

产业界的动作比想象中更快:主流隐私计算厂商的 PSI 产品已能处理亿级数据,联邦学习框架内置 OT 安全聚合,医疗、金融、政务领域纷纷试点。遗忘传输不再是论文里的玩具,而是数据要素流通时代的地下管道。

老王换上新式“量子锁”,依然是那道看不穿、尝不全的隔味魔法门。盲选的规则没变,变的只是锁匠的手艺——从 RSA 的铜锁,到格密码的合金锁,再到芯片里流淌的电流。只要“合作又要保密”的需求还在,这道门就会一直立在巷子深处。

b=As+e\mathbf{b} = \mathbf{A}\mathbf{s} + \mathbf{e}
格密码用“带噪声的方程组”当魔法锁:给出现在公开的方程组和结果,反推秘密解在计算上不可行。
  1. 噪声方程组A 是公开的做法清单,s 是秘密配方,e 是刻意加入的噪声。
    As+e\displaystyle \mathbf{A}\mathbf{s} + \mathbf{e}
  2. 反推困难已知 A 和 b 求 s,像从炒好的菜反推每一撮盐的量——几乎不可能。
    已知 A,b 求 s 困难\displaystyle \text{已知 } \mathbf{A}, \mathbf{b} \text{ 求 } \mathbf{s} \text{ 困难}

AI 应用场景

场景一:广告平台隐私求交(PSI)

阶段:数据融合与特征对齐(数据准备阶段)

解决的问题:两家广告平台要做联合建模,却无法共享完整用户名单。传统做法是把名单交给可信第三方比对,但第三方泄露风险大且不合规(如《个人信息保护法》)。用遗忘传输构造 PSI,双方在密文上完成交集计算,只输出交集结果,非交集用户彼此不可见。

具体案例:某电商平台与视频平台要统计“重叠高消费用户”做联合营销。工程师把用户 ID 哈希后装入布谷鸟哈希表,再用批量 OT 逐桶比对,最终只输出交集 ID 列表;全流程跑在隐私计算平台上,通算时间从数小时降到分钟级。

场景二:联邦学习中的样本对齐与安全聚合

阶段:模型训练与推理

解决的问题:医院和药企联合训练疾病预测模型,样本 ID 必须对齐,但病例数据不能出域。联邦学习常用 OT 做“样本对齐”(PSI),并在安全聚合中用 OT 相关原语保护梯度,防止恶意服务器通过梯度反推单条样本。

具体案例:某三甲医院与科研机构联合训练糖尿病并发症预测模型,双方用 OT 完成 5 万条样本的隐私求交,对齐后各自在本地训练,只上传加密梯度;模型 AUC 提升 8%,并通过第三方安全审计。

场景三:安全多方计算(MPC)的基础原语

阶段:计算执行阶段

解决的问题:多个机构要联合统计(如平均薪资、共债客户数),又互不信任。GMW、姚氏混淆电路等 MPC 协议把计算拆成布尔电路,每个“与门”的求值都调用一次 OT,遗忘传输是整个 MPC 大厦的地基。

具体案例:四家银行联合统计“共债客户”数量,每家输入本地借款人列表,MPC 引擎底层调用 OT 扩展生成随机相关值,完成秘密分享下的电路求值,最终只输出统计数字。审计日志显示 OT 调用量达千万级,但整体延迟控制在秒级。

Python 演示

python109 行
"""基于 RSA 的 1-out-of-2 遗忘传输教学演示(小素数版,仅供学习)。"""import hashlibimport random  def _is_prime(x):    if x < 2:        return False    for d in range(2, int(x ** 0.5) + 1):        if x % d == 0:            return False    return True  def _rand_prime(lo, hi):    while True:        p = random.randint(lo, hi)        if _is_prime(p):            return p  def _gcd(a, b):    while b:        a, b = b, a % b    return a  def _inv(a, m):    r0, r1 = a, m    s0, s1 = 1, 0    while r1:        q = r0 // r1        r0, r1 = r1, r0 - q * r1        s0, s1 = s1, s0 - q * s1    return s0 % m  def _kdf(x, length):    h = int(hashlib.sha256(str(x).encode('ascii')).hexdigest(), 16)    return h.to_bytes(length, 'big')[:length]  def _xor(a, b):    return bytes(x ^ y for x, y in zip(a, b))  class Sender:    """厨师老王:持有 m0/m1,生成 RSA 密钥,解密后发回密文。"""     def __init__(self, m0, m1):        self.m0 = m0        self.m1 = m1        p = _rand_prime(200, 400)        q = _rand_prime(200, 400)        while q == p:            q = _rand_prime(200, 400)        self.n = p * q        self.phi = (p - 1) * (q - 1)        self.e = 3        while _gcd(self.e, self.phi) != 1:            self.e += 2        self.d = _inv(self.e, self.phi)     def public_key(self):        return self.n, self.e     def send(self, c0, c1):        y0 = pow(c0, self.d, self.n)        y1 = pow(c1, self.d, self.n)        z0 = _xor(self.m0, _kdf(y0, len(self.m0)))        z1 = _xor(self.m1, _kdf(y1, len(self.m1)))        return z0, z1  class Receiver:    """顾客小赵:持选择位 b,构造两个盒子并还原 m_b。"""     def __init__(self, b):        self.b = b     def choose(self, n, e):        x = random.randint(2, n - 2)        k = random.randint(2, n - 2)        c0 = pow(x if self.b == 0 else k, e, n)        c1 = pow(x if self.b == 1 else k, e, n)        return c0, c1, x     def recover(self, z0, z1, x):        zb = z1 if self.b == 1 else z0        return _xor(zb, _kdf(x, len(zb)))  def main():    m0 = b'Dish A: Steamed Fish  '    m1 = b'Dish B: Braised Pork  '    sender = Sender(m0, m1)    b = random.randint(0, 1)    receiver = Receiver(b)    c0, c1, x = receiver.choose(*sender.public_key())    z0, z1 = sender.send(c0, c1)    got = receiver.recover(z0, z1, x)    print('小赵想选:', '菜谱 B' if b else '菜谱 A')    print('小赵收到:', got.decode('ascii'))    assert got == (m1 if b else m0)    print('厨师视角: 两个盒子都是随机数,选择位 b 完全隐藏')  if __name__ == '__main__':    main()
目的:用 60 行代码完整复现 RSA 基础 1-out-of-2 遗忘传输——发送者不知道选择位,接收者只得到选中的那条消息。
  1. self.d = _inv(self.e, self.phi)求出 RSA 私钥,这把“万能钥匙”只握在厨师手里。
  2. c0 = pow(x if self.b == 0 else k, e, n)顾客按选择位把 x 或 k 扣进锁里,两个盒子从外面看毫无差别。
  3. z0 = _xor(self.m0, _kdf(y0, len(self.m0)))厨师用解密出的群元素哈希做信封,把秘方裹进去寄回。
  4. got = receiver.recover(z0, z1, x)顾客只用自己的 x 还原答案,另一封信永远拆不开。
  5. assert got == (m1 if b else m0)校验正确性:拿到的确实是选中的那道菜。

常见误区

误区遗忘传输是不是说传完之后,发送者和接收者都忘了消息内容?那接收者还怎么用数据?

正解OT 的“遗忘”是相对普通传输而言的:发送者对“接收者选了哪条”选择性失忆,接收者对“其他消息”永久失忆。接收者清清楚楚拿到 m_b,发送者只知道“有人拿走了一条”,但不知道是哪一条。就像小赵尝完菜记得那口鲜味,老王却不知道他尝的是哪道菜。

为何常见:“遗忘”这个词太形象,字面理解成“大家都忘了”,混淆了“隐私保护”与“数据删除”两个概念。

误区没有可信第三方怎么保证公平?是不是所有 OT 系统背后都得有一个裁判或中介机构?

正解OT 的全部意义恰恰是去掉裁判。公钥密码学(RSA、椭圆曲线、格)充当“数学裁判”:单向性让发送者无法区分两个盒子,计算困难性让接收者凿不开第二扇门。引入中心化第三方反而破坏了隐私计算的信任模型——那正是 OT 要消灭的东西。

为何常见:生活中“公平”通常靠第三方(法院、公证处)维持,直觉上很难接受“一张数学试卷也能当裁判”。

误区发送者把 m₀⊕r 和 m₁⊕r 发过去,接收者拿自己的 r 解开,这不就实现双向保密了吗?

正解不行。发送者手里有 m₀、m₁ 和 r,随手一算就能推出接收者选了哪条。OT 的接收者隐私要求“选择信息在发送者眼里计算不可区分”,必须靠带陷门的单向函数(公钥运算)构造;纯对称的异或没有单向性,做不出双向隐私的 OT。

为何常见:XOR 是密码课上最常用的“伪装术”,初学者容易以为“包一层随机数”就安全了,忽略了发送者本身也能看到密文。

误区OT 扩展是不是做了几百次基础 OT 之后,就能零成本导出无限多次 OT?

正解扩展把代价从“每次公钥运算”摊薄为“每次哈希/伪随机调用”,但基础 OT 的次数由安全参数 κ 决定(如 128 次),底层主密钥一旦泄露,全部扩展 OT 作废。安全等级、通信量、消息长度都有下限,没有免费午餐。

为何常见:“扩展”听起来像“复制拷贝”,让人忽略了底层随机相关性的安全边界和无泄漏约束。

误区遗忘传输是学术界的玩具协议,离我写的业务系统太远了,学了也用不上。

正解工业界早已大规模消费 OT:隐私求交、联邦学习样本对齐、MPC 平台底层都在调用它。蚂蚁、微众等隐私计算平台把 OT 封装成 C++ 库,单次 PSI 可处理亿级数据。数据/AI 工程师在隐私计算方案里几乎必然遇到 OT 接口。

为何常见:密码学原语大多藏在库的最底层,业务工程师看不到它,就误以为“不存在、不重要”。

面试题

Q1. “遗忘传输”中“遗忘”的核心含义是什么?

单选题 · easy

  • A.双方都忘记消息内容
  • B.发送者不知道接收者选了哪条← 正确答案
  • C.接收者忘记自己选过什么
  • D.传输结束后消息自动删除

答案:B。遗忘指发送者不知道接收者的选择位 b(接收者隐私),同时接收者学不到其他消息。小赵清楚记得自己尝的菜,老王却不知道他尝的是哪道。A 和 D 是字面误解,C 违背协议正确性。

Q2. 1-out-of-N OT 最常用的构造思路是什么?

单选题 · easy

  • A.连续执行 N 次 1-out-of-2 OT
  • B.用 ⌈log₂N⌉ 个 1-out-of-2 OT 组合← 正确答案
  • C.提前把全部消息发给接收者
  • D.依赖可信第三方分发密钥

答案:B。把选择下标写成二进制,每个比特对应一道 1-of-2 门,ℓ 道门嵌套即得 1-of-N。连续执行 N 次会让发送者逐步窥见选择信息,消息全发违背发送者隐私,第三方分发违背去中心化设计目标。

Q3. 在 RSA 基础 OT 中,接收者发送 c₀=x^e、c₁=k^e,发送者为什么无法判断哪个对应 x?

单选题 · mid

  • A.因为 x 与 k 取值恰好相等
  • B.因为模数 N 是公开的公开值
  • C.因为 RSA 加密结果不可区分← 正确答案
  • D.因为公钥指数 e 取值很小

答案:C。x 和 k 都是接收者随机挑选的,两者在 e 次幂后都均匀分布在模 N 的群中;发送者只有公钥 (N,e),在 RSA 假设下无法区分哪个盒子里藏的是 x。若看得穿,接收者隐私就被攻破了,所以随机源质量至关重要。

Q4. 半诚实模型与恶意模型的本质区别是什么?

单选题 · mid

  • A.半诚实模型允许使用更大的安全参数
  • B.恶意模型允许参与方偏离协议任意操作← 正确答案
  • C.半诚实模型不保护发送者隐私
  • D.恶意模型不需要密码学假设

答案:B。半诚实假设参与方严格照协议执行,只是事后想从记录里推断秘密;恶意对手则可以篡改消息、提前中止、伪造身份。真实系统常用“编译器”把半诚实协议升级为恶意安全,但成本更高。

Q5. OT 扩展(如 IKNP)主要用什么替代大量公钥运算?

单选题 · mid

  • A.对称哈希与伪随机生成← 正确答案
  • B.更复杂的椭圆曲线
  • C.增加一轮 RSA 签名
  • D.大规模并行网络传输

答案:A。IKNP 先用 κ 次基础 OT 建立相关矩阵,再用相关鲁棒哈希把相关性放大到 n 个 OT,使公钥运算只剩 O(κ) 次、对称运算 O(n) 次。密钥协商仍然用椭圆曲线或 RSA,但扩展阶段全部换成哈希等轻量运算。

Q6. 隐私求交(PSI)利用 OT 主要实现了哪种保护?

单选题 · mid

  • A.保护哈希函数的单向性
  • B.双方只获得交集不泄露其余元素← 正确答案
  • C.保护网络传输带宽不泄露
  • D.保证交集至少包含一个元素

答案:B。PSI 是 OT 的招牌应用:双方把集合元素哈希后装入布谷鸟哈希表,用 OT 做逐格安全比较,最终只输出 X∩Y,交集之外的元素对方一无所知。哈希单向性只是辅助工具,网络带宽和交集非空都不是 PSI 的保护目标。

Q7. 在 RSA 基础 OT 协议中,接收者最终如何还原出 m_b?

单选题 · hard

  • A.用私钥 d 解密 z_b 得到明文
  • B.用随机数 x 算 H(x) 异或 z_b← 正确答案
  • C.解密 z0 和 z1 后做比对
  • D.向发送者索要完整的密钥

答案:B。接收者知道 y_b = x(因为 c_b = x^e),故用 H(x) 异或 z_b = m_b ⊕ H(x) 即得 m_b。它没有私钥 d,也算不出 y_{1-b}。若向发送者索要密钥,发送者就能反推选择位,协议里绝不允许这一步。

Q8. 遗忘传输需要满足哪些隐私性质?(多选)

多选题 · mid

  • A.发送者不知道接收者的选择位← 正确答案
  • B.接收者学不到未被选中的消息← 正确答案
  • C.双方都能看到完整消息集合
  • D.接收者的选择位对第三方可见

答案:AB。OT 的双向隐私就是“发送者隐私 + 接收者隐私”:小赵尝菜不被老王看见、选择也不让旁人知道,而其他菜的做法对他永远是机密。C 违背发送者隐私,D 违背接收者隐私。

Q9. 关于 RSA 基础 OT 协议,下列说法正确的有?(多选)

多选题 · hard

  • A.发送者用私钥 d 解密 c0 和 c1← 正确答案
  • B.接收者可以恢复 m_b 但得不到 m_{1-b}← 正确答案
  • C.接收者需要可信第三方帮忙解密
  • D.该协议的安全依赖大整数分解难题← 正确答案

答案:ABD。发送者用 d 打开两个盒子;接收者只有 x 这一把钥匙,只能还原选中的那条;整个协议没有任何第三方。RSA 的安全性建立在大整数分解困难之上——这正是量子计算机威胁它的原因。C 既多余又违背设计初衷。

Q10. IKNP OT 扩展方案使用了哪些组件?(多选)

多选题 · mid

  • A.κ 个基础 OT← 正确答案
  • B.相关鲁棒哈希函数← 正确答案
  • C.伪随机生成器← 正确答案
  • D.可信执行环境芯片

答案:ABC。IKNP 的原料是基础 OT + 相关鲁棒哈希 + PRG,公钥运算只做 κ 次,其余全是对称密码操作。可信硬件(TEE)是另一条独立的技术路线,不属于 IKNP 的密码组件,两者可以并行发展,但方案内部不应混淆。