假设你和同事都拿到了年终奖数字,一个六位数,一个七位数。两个人谁都不肯先报数,又都想在饭桌上证明“我更高”。如果有一台不透明的盲算盒子:你们各自把数字写进信封投进去,盒子内部布满齿轮和锁,不展示任何信封内容,只在出口亮起一盏灯——左边亮表示你更高,右边亮表示他更高。这台盒子,就是混淆电路的通俗形象。 它解决的问题在密码学里叫“安全多方计算”:多个参与方各自持有秘密输入,想共同计算某个函数,除了最终结果外,谁也不愿泄露自己的原始数据。混淆电路是其中最经典、也最常被用作底座的构造方法。它的做法是:先把要计算的函数翻译成一张“布尔电路图”,再把电路里每个门都加密并打乱。真实数据被换成随机乱码标签,像一群戴着面具的人走进迷宫,最后只有出口处亮灯,告诉你结论。 学懂混淆电路,等于拿到隐私计算最基础的一块积木。联邦学习、隐私求交、联合统计等产品里,很多都藏着它的影子。

岗位关联

对 AI 从业者来说,混淆电路是理解隐私增强技术的关键入口:它能帮你把“数据可用不可见”从口号变成可实现的工程方案,也是数据工程师、算法工程师与架构师协作时的重要知识底座。

目录
  1. 可视化演示
  2. 基本概念
  3. 核心机制
  4. 混淆表生成
  5. 求值与传输
  6. 安全模型
  7. 性能优化
  8. 工程落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示混淆电路技术原理与实现的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。

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

混淆电路技术原理与实现:混淆电路 混淆电路与姚期智的安全双方计算 布尔电路表示与函数到电路的转换 核心机制可视化 混淆电路技术原理与实现整体架构与关键组件

基本概念

年底公司开奖,你中了六位数年终奖,旁边同事也中了六位数。两个人想证明“我比你多”,但谁都不肯先报数。这时你们可以造一台盲算盒子:每个人把自己的数字用乱码信封投进盒子,盒子经过内部计算后,只在出口亮灯——左边亮表示你高,右边亮表示他高。这个场景就是著名的“百万富翁问题”,而数学家姚期智给出的构造方案,后来被称为姚氏混淆电路,也就是混淆电路的最初形态。

这个故事背后是一个更大的密码学领域:安全多方计算。它解决的是多个参与方各自持有秘密输入,想共同计算某个函数的问题。除了约定的结果,参与方不希望泄露自己的输入。混淆电路正是面向两方场景的经典构造,它把“互相不信任但愿意合作”的关系,变成一台可验证的盲算盒子。

技术上的实现思路是:先将要计算的函数翻译成布尔电路,也就是由与门、或门、非门等基本逻辑门组成的网。随后,电路里的每一条线、每一个门都被“混淆”处理:真值表被加密,输入值被替换成随机标签。数据就像戴着面具走进迷宫,外面的人看不到任何一个中间数值。

回到年终奖的例子:你们不需要信任对方,只需要相信这台盒子的构造规则。盒子不撒谎,也不偷看。这正是混淆电路最迷人的地方:信任从“人”转移到了“数学”。

核心机制

做一桌菜,没人会把整桌菜一步炒出来,而是先拆成洗菜、切菜、调味、翻炒等小动作。盲算盒子也一样,它不会直接吞下一个“复杂函数”,而是先把函数拆成无数个最小逻辑动作——逻辑门。

布尔电路由输入端、输出端和逻辑门组成。与门要求两个输入同时为 1 才输出 1;或门只要有一个输入为 1 就输出 1;非门则把输入取反。只要把足够多的门按顺序连接起来,就能模拟任何一种可计算函数。这也是混淆电路被称为“通用”的原因。

在混淆电路里,真实数据不会直接出现在线上。电路中的每条电线都有两个随机字符串标签:标签 \(k^0\) 表示 0,标签 \(k^1\) 表示 1。发送方构造电路时,把每个门的真值表都加密成乱码;接收方只获得与自己真实输入相对应的标签。执行时,标签在门与门之间传递,像齿轮一节一节地咬合,外人却看不到任何明文比特。

这套设计最巧妙的地方在于:没有人需要看见中间的“配料”,最终只要用解码表把输出标签翻译回 0 或 1,结论就自动出现了。复杂的计算,就在这样一层层小齿轮的暗箱里安全完成。

混淆表生成

每家私房菜馆都有秘密配方。如果直接把配料表写在墙上,任何人都能偷师。混淆表生成,就像是把一张真值表抄进四个上锁信封,再把这些信封随机打乱放进吧台抽屉。

对一个逻辑门 \(g\),我们为它的两条输入线 \(A,B\) 和输出线 \(C\) 各准备两个随机标签:\(k_A^0,k_A^1,k_B^0,k_B^1,k_C^0,k_C^1\)。随后遍历所有输入组合,把每条真值表行“锁”进一个密文。具体形式如下:

四个信封乱序躺在抽屉里,每个看起来都差不多。只有同时拿对两把钥匙的人,才能打开其中属于自己的那一封。这就是混淆表的核心作用:门不再是一张透明真值表,而是一排乱序的加密锁。

G~=π({EkA0,kB0(kCf(0,0)),  EkA0,kB1(kCf(0,1)),  EkA1,kB0(kCf(1,0)),  EkA1,kB1(kCf(1,1))})\displaystyle \widetilde G = \pi\left(\left\{ E_{k_A^0,k_B^0}(k_C^{f(0,0)}),\; E_{k_A^0,k_B^1}(k_C^{f(0,1)}),\; E_{k_A^1,k_B^0}(k_C^{f(1,0)}),\; E_{k_A^1,k_B^1}(k_C^{f(1,1)}) \right\}\right)
这个公式的意思是:把门对应的四行真值表分别用输入标签作“钥匙”加密,再把四行密文的顺序随机打乱。任何没有钥匙的人,都只能看到四行乱码。
  1. 准备标签\(k_A^0,k_A^1,k_B^0,k_B^1,k_C^0,k_C^1\) 是随机生成的长字符串,分别代替两条输入线和输出线上的 0/1。
    kA0,kA1,kB0,kB1,kC0,kC1k_A^0, k_A^1, k_B^0, k_B^1, k_C^0, k_C^1
  2. 计算明文输出\(f(a,b)\) 表示该门在输入组合 \((a,b)\) 下的真实输出,由门类型决定。
    f(a,b)f(a,b)
  3. 加密输出标签\(E_{k_A^a,k_B^b}(k_C^{f(a,b)})\) 用两条输入标签当钥匙,把对应输出标签锁进密文。
    EkAa,kBb(kCf(a,b))E_{k_A^a,k_B^b}(k_C^{f(a,b)})
  4. 随机置换\(\pi(\cdot)\) 把四行记录的顺序打乱,防止对方从行位置猜到输入组合。
    π(⋅)\pi(\cdot)

求值与传输

你把乱码信封交给同事后,同事还需要拿到属于自己的那把钥匙,但又不能让你知道他选的是哪一把。这就像自助餐厅里的不透明取餐盒:他端走一份,你完全猜不到他选的是辣味还是甜味。

这里使用的密码学工具叫“不经意传输”(Oblivious Transfer,OT)。发送方手里有两个标签 \(k_B^0\) 和 \(k_B^1\);接收方心里有一个选择位 \(b\in\{0,1\}\)。协议结束后,接收方只得到 \(k_B^b\),发送方不知道 \(b\),接收方也拿不到另一个标签。这样一来,Bob 就能取走与自己输入对应的标签,同时不泄露自己输入到底是什么。

整个求值流程可以概括为四步:

1. Alice 构造整个混淆电路,发送混淆表、输出解码表,并把自己输入对应的标签直接交给 Bob。

2. Bob 通过不经意传输,获得与自己输入对应的标签。

3. Bob 在每个门中,用两个输入标签对混淆表逐行尝试解密。

4. 解密成功的标签被送到下一级门,直到输出端;最终用解码表把输出标签还原成明文结果。

这个过程可以写成:

一个门解出的标签会成为下一个门的“输入原料”,一路传递到出口。最终灯亮起,结论公开,而谁也没有看到对方的原始数字。

k^=DkAa,kBb(G~i),out={0,k^=kC01,k^=kC1\displaystyle \hat{k} = D_{k_A^a,k_B^b}(\widetilde G_i), \qquad \text{out} = \begin{cases} 0, & \hat{k} = k_C^{0} \\ 1, & \hat{k} = k_C^{1} \end{cases}
接收方不需要知道真实输入,只需知道自己手上的标签。他会尝试解密每一行,只有真正匹配的那一行能解出合法的输出标签。
  1. 拿到标签接收方持有自己输入对应的两个标签 \(k_A^a\) 和 \(k_B^b\)。
    kAa,kBbk_A^a, k_B^b
  2. 解密一行\(D\) 是对应加密算法的解密函数,\(\widetilde G_i\) 是混淆表中的第 \(i\) 行密文。
    DkAa,kBb(G~i)D_{k_A^a,k_B^b}(\widetilde G_i)
  3. 判定成功解密结果 \(\hat{k}\) 如果等于输出线上两个候选标签之一,就说明当前行与自己的输入组合相匹配。
    k^∈{kC0,kC1}\hat{k} \in \{k_C^0, k_C^1\}
  4. 映射明文最后通过分段函数,把标签还原成明文比特 0 或 1。
    out=0 或 1\text{out} = 0 \text{ 或 } 1

安全模型

盲算盒子虽然带锁,但你也得想清楚:坐在对面的是哪种人?是好奇但守规矩的邻居,还是可能偷偷拆箱换锁的小偷?

混淆电路最常分析的安全环境叫“半诚实模型”:双方会老老实实执行协议,但会保存所有中间消息,试图从中推理出对方的隐私。这个假设适合许多商业合作场景——合作方通常不会冒着违约风险篡改协议,但一定会尽力收集和分析数据。经典 Yao 协议在半诚实模型下,被证明是安全的。

证明安全的标准思路是“模拟器范式”:无论接收方如何偷看自己的视角,他的视角都能被一个没有真实输入的模拟器生成,并且二者不可区分。用公式表示就是:

如果面对的是可能恶意篡改输入或中途修改协议的参与者,就需要额外叠加零知识证明、承诺、可验证混淆等机制。换句话说,混淆电路不是万能防护罩,它首先是一把适合“诚实但好奇”场景的密码锁。

RealB(x,y)  ≈c  SimB(x,f(x,y))\displaystyle \text{Real}_B(x,y) \;\approx_c\; \text{Sim}_B(x, f(x,y))
也就是说,真实协议中 Bob 能看到的东西,和模拟器只根据 Bob 自己输入及最终输出伪造出来的东西,在计算上几乎无法分辨。
  1. 真实视角\(\text{Real}_B(x,y)\) 表示 Bob 在真实协议执行中看到的所有消息。
    RealB(x,y)\text{Real}_B(x,y)
  2. 模拟视角\(\text{Sim}_B(x, f(x,y))\) 表示模拟器只拿到 Bob 的输入 \(x\) 和最终函数输出 \(f(x,y)\),构造出的假消息集合。
    SimB(x,f(x,y))\text{Sim}_B(x, f(x,y))
  3. 不可区分\(\approx_c\) 表示“计算不可区分”,任何高效算法都很难判断自己看到的是真实视角还是模拟视角。
    ≈c\approx_c

性能优化

初代盲算盒子每个门都要四行密文,接收方还要逐行试锁,像一家新餐厅为了四道菜准备了几十口锅。工程落地前,必须给这套方案装上省力齿轮。

第一个省力齿轮叫“点与置换”(Point-and-Permute)。它给每个输入标签附带一个随机指针比特,Bob 拿到标签后可以直接通过指针定位到对应行,把“试四把锁”降为“直接开锁”。传输量没变,但计算量大幅下降。

第二个省力齿轮叫“免费 XOR”(Free XOR)。它让输入线标签满足 \(k^1 = k^0 \oplus \Delta\) 的关系,这样 XOR 门根本不需要生成混淆表,直接对两个输入标签做异或运算,就能得到输出标签。第三个是“行规约”(Row Reduction):利用随机数把四行中某一行的密文固定为全零,存储量从四行降到三行。再加上并行批处理和 OT 扩展,盲算盒子终于从论文里的玩具变成了生产线上的工具。

餐厅后厨不再每道菜配一口锅:同一批菜可以共用调理台,省下的空间和时间,让隐私计算真正能承受百万级数据量。

工程落地

优化后的盲算盒子,从一个数学玩具变成了隐私保护产品的基础设施。现实中的隐私求交、联合统计、联邦学习,本质上都在把它当作公共底盘。

隐私求交(PSI)是最常见的应用之一:两家公司各自持有用户 ID,想找出重叠客户,却不想把完整名单暴露给对方。可以把用户 ID 编码成电路的输入,用混淆电路比较“两边是否相等”,最终只输出交集数量或交集结果,而不泄露未重合部分。

联合统计与联邦学习也同样受益:多家医院想统计某款药物对患者的效果,但患者数据不能离开医院。系统把统计函数编译成电路,各医院在本地输入加密标签,汇总端只得到统计结果。今天的隐私计算平台,已经把求交、求和、逻辑回归等常用算子封装成 API,企业不必自己搭建盒子,只要调用接口即可。

理解盒子内部的齿轮,仍然很重要:只有看得懂构造和假设,你才能判断平台是否足够安全、计费是否合理、结果是否可信。

AI 应用场景

银行联合风控

阶段:数据融合与特征工程

解决的问题:单独一家银行的特征有限,联合建模需要共享黑名单、逾期率等数据。传统做法直接传明文会泄露客户隐私,脱敏后又可能被重识别。混淆电路让双方在不暴露原始特征的情况下,完成交叉统计和逻辑回归。

具体案例:A 银行与 B 消费金融公司各自拥有借款人特征,使用混淆电路计算“共同违约概率”。双方只拿到汇总后的 AUC 与特征重要性,不接触对方明细数据。

医疗多中心统计

阶段:模型训练前的统计指标计算

解决的问题:医疗数据高度敏感,医院不愿共享患者级数据,传统中心化统计往往因合规问题无法开展。混淆电路可以把计数、求和、相关性检验等运算变成密文协作。

具体案例:三家三甲医院与疾控中心统计“高血压与吸烟行为的相关性”,各院本地编码病例数据,计算结果只输出一张汇总表,患者信息全程不出院。

广告跨媒体频次控制

阶段:用户画像与频次控制

解决的问题:广告主想统计用户在不同平台看到同一广告的次数,平台又不想暴露自己的用户 ID。传统做法让 App 上报明文 ID,隐私风险极高。混淆电路可做安全的用户匹配与频次统计。

具体案例:视频平台与广告主先做隐私求交,再用混淆电路计算重合用户看到的曝光次数,最终只返回去标识化的人群频次分布。

Python 演示

python55 行
import osimport hashlibimport random  class GarbledGate:    # 教学版: 单个 AND 门的混淆表生成与求值    def __init__(self, gate_id):        self.gate_id = gate_id        self.table = []        self.plain_in = [((0, 0), 0), ((0, 1), 0), ((1, 0), 0), ((1, 1), 1)]     def make_labels(self):        self.a_labels = (os.urandom(16), os.urandom(16))        self.b_labels = (os.urandom(16), os.urandom(16))        self.out_labels = (os.urandom(16), os.urandom(16))     def _hash(self, ka, kb):        return hashlib.sha256(ka + kb + self.gate_id.encode()).digest()     def generate(self):        random.shuffle(self.plain_in)        self.table = []        for (a, b), out in self.plain_in:            ka = self.a_labels[a]            kb = self.b_labels[b]            out_label = self.out_labels[out]            enc = bytes(x ^ y for x, y in zip(out_label, self._hash(ka, kb)))            self.table.append(enc)     def evaluate(self, ka, kb):        for enc in self.table:            candidate = bytes(x ^ y for x, y in zip(enc, self._hash(ka, kb)))            if candidate in self.out_labels:                return candidate        raise ValueError("input labels do not match")     def reveal(self, label):        if label == self.out_labels[0]:            return 0        if label == self.out_labels[1]:            return 1        raise ValueError("cannot decode label")  if __name__ == "__main__":    gate = GarbledGate("AND_0")    gate.make_labels()    gate.generate()    # Alice 的输入是 1, Bob 的输入是 1    alice_label = gate.a_labels[1]    bob_label = gate.b_labels[1]    result_label = gate.evaluate(alice_label, bob_label)    print("output label:", result_label.hex())    print("plaintext result:", gate.reveal(result_label))
目的:演示单个 AND 门从真值表到混淆表生成、再用标签求值并解码的完整过程,是真实混淆电路的最小教学版本。
  1. self.out_labels = (os.urandom(16), os.urandom(16))输出线上的两个候选标签,用随机串代替 0/1。
  2. enc = bytes(x ^ y for x, y in zip(out_label, self._hash(ka, kb)))用两个输入标签的哈希值给输出标签“加锁”。
  3. random.shuffle(self.plain_in)真值表行顺序被打乱,防止通过行位置猜输入组合。
  4. if candidate in self.out_labels:解密后若能落回候选标签集合,说明这一把钥匙用对了。
  5. gate.reveal(result_label)最后把标签映射回明文 0 或 1。

常见误区

误区我以为混淆电路里必须有一个权威第三方来搭建电路或保存密钥,否则两个参与者会互相欺骗。

正解经典 Yao 协议由一方生成电路、另一方负责求值,双方通过不经意传输交换标签,全程不依赖可信第三方。安全性来自加密算法、随机标签和协议逻辑。只有在恶意模型下,才需要额外引入承诺和零知识证明等工具。

为何常见:现实中许多隐私计算系统确实引入了可信执行环境或第三方机构,于是误以为混淆电路也必须有中间人。

误区既然它叫电路,是不是只能算与门、或门?最多比较两个数大小,其他复杂函数做不了。

正解任何可计算函数都能先编译成布尔电路,再套用混淆电路框架。加法、矩阵乘法、神经网络推理都可以。区别只在于电路越大,混淆表越多,计算和通信开销越高。

为何常见:混淆电路从“百万富翁问题”出名,很多人只记住了比大小,忽略了它其实是通用安全计算协议。

误区发送方生成电路后,必须把自己的真实输入告诉接收方,否则接收方怎么知道该用哪个标签计算?

正解发送方只发送与自己输入对应的标签,不发送明文 0/1。接收方则通过 OT 获得自己的输入标签。明文比特只在输出解码时被还原,且只暴露双方约定公开的结论。

为何常见:混淆表、标签、OT 三个概念叠加后,很容易把“传标签”误当成“传明文”。

误区混淆电路每个门都要做多次公钥加密,传输量巨大,工程上根本无法落地。

正解现代实现早就换成对称加密或哈希,并配合点与置换、Free XOR、行规约、OT 扩展等优化。隐私求交和联合统计产品已经能处理百万到千万级数据量。

为何常见:看教材时先看到 1980 年代的原始方案,容易拿老皇历当现状。

误区只要用了混淆电路,对方无论怎么改数据、改协议,都无法影响结果。

正解经典 Yao 协议在半诚实模型下安全,但并不能主动防止恶意输入或中途篡改。要想抵抗恶意行为,需要额外增加可验证性和防作弊机制。混淆电路保护隐私,不等于包治一切安全威胁。

为何常见:把“保护隐私”理解成“防止一切攻击”,忽视了安全模型都有明确的信任边界。

面试题

Q1. 混淆电路(Garbled Circuit)最早由哪位学者提出?

单选题 · easy

  • A.图灵
  • B.香农
  • C.姚期智← 正确答案
  • D.冯诺依曼

答案:C。混淆电路由姚期智在 1982 年提出,用于解决百万富翁问题。图灵提出图灵机,香农提出信息论,冯诺依曼提出计算机体系结构,都不是混淆电路的提出者。

Q2. 在混淆电路求值阶段,Bob 获得与自己输入对应的标签,主要依赖哪种密码学原语?

单选题 · easy

  • A.公钥加密技术
  • B.不经意传输协议← 正确答案
  • C.哈希链验证
  • D.数字签名机制

答案:B。Bob 的输入标签由 Alice 持有,但 Bob 不想让 Alice 知道自己选择了哪一个,因此必须通过不经意传输(OT)来取标签。公钥加密、哈希链和数字签名虽然也常用在密码协议里,但这里解决的是“选择性传输”问题。

Q3. 一个二输入逻辑门(如 AND)的混淆表通常有多少行加密记录?

单选题 · mid

  • A.只有一行
  • B.正好两行
  • C.正好三行
  • D.正好四行← 正确答案

答案:D。二输入逻辑门有四种输入组合:00、01、10、11。混淆表要为每个组合生成一条加密记录,所以通常是四行。行规约优化后可能减少到三行,但原始状态是四行。

Q4. 在半诚实模型下,混淆电路主要保证什么性质?

单选题 · mid

  • A.防止输入被篡改
  • B.诚实但好奇安全← 正确答案
  • C.防御量子攻击
  • D.防止双方合谋

答案:B。半诚实模型假设双方会严格执行协议,但会诚实地“好奇”中间数据。混淆电路在这个模型下能保护输入隐私,但不能主动防篡改,也无法抵抗量子攻击或双方合谋。

Q5. 实际工程中,混淆电路最主要的性能开销来自哪里?

单选题 · mid

  • A.网络带宽开销
  • B.电路加密开销← 正确答案
  • C.磁盘读写开销
  • D.数据库查询开销

答案:B。混淆电路要把每个门的加密表发送给接收方,电路越大,密文数量越多。虽然 OT 和标签计算也有成本,但整体瓶颈通常来自混淆表带来的电路规模与加密计算开销。

Q6. 下列哪种优化技术可以降低混淆表的存储行数?

单选题 · mid

  • A.Free XOR 技术
  • B.Point置换技术
  • C.OT 扩展技术
  • D.Row 规约技术← 正确答案

答案:D。Row Reduction(行规约)通过固定某一行密文为零,把每张混淆表从四行降到三行。Free XOR 减少的是 XOR 门的密文,Point-and-Permute 优化的是查找速度,OT 扩展主要降低 OT 通信成本。

Q7. 接收方最终把输出标签映射成明文结果时,依据的是什么?

单选题 · hard

  • A.输出解码表← 正确答案
  • B.输入真值表
  • C.随机置换序列
  • D.发送方私钥

答案:A。发送方在构造电路时,会把输出线上的两个候选标签和明文 0/1 的对应关系整理成解码表。接收方拿到解密后的标签,通过查表还原出最终输出。输入真值表和置换序列在生成阶段已经被混淆,不能直接用来解码。

Q8. 下列哪些措施属于经典的混淆电路性能优化?

多选题 · mid

  • A.免费 XOR 门优化← 正确答案
  • B.点与置换定位← 正确答案
  • C.行规约减少行数← 正确答案
  • D.梯度下降加速

答案:ABC。Free XOR 让 XOR 门不必生成混淆表,Point-and-Permute 让解密时直接定位一行,Row Reduction 把四行压缩到三行。梯度下降是机器学习训练算法,与混淆电路优化无关。

Q9. 关于混淆电路与同态加密,下列说法正确的有哪些?

多选题 · hard

  • A.混淆电路通信成本通常更高← 正确答案
  • B.同态加密不能做密文计算
  • C.两者都保护参与方输入隐私← 正确答案
  • D.混淆电路能抵抗任意算力攻击

答案:AC。混淆电路需要把电路规模的混淆表发给求值方,通信量通常较大;同态加密可以在密文上做计算,而不是不能计算;两者都能保护输入隐私。混淆电路的安全建立在计算不可区分上,不能抵抗任意算力攻击。

Q10. 安全多方计算希望实现的目标包括哪些?

多选题 · easy

  • A.保护私密输入← 正确答案
  • B.保证输出正确← 正确答案
  • C.不泄露中间值← 正确答案
  • D.允许外部读取明文

答案:ABC。安全多方计算的核心目标是在不泄露各参与方秘密输入和中间值的前提下,得到正确输出。允许外部读取明文显然违背隐私保护目标,因此 D 不正确。