3.2 混淆电路全流程:混淆传输求值解密


3.2 混淆电路全流程:混淆、传输、求值、解密

本节摘要:混淆电路把"算函数"变成"解谜题":生成方给每根导线配两把随机标签、用标签当钥匙加密每张门表;求值方集齐钥匙逐门解谜。本节用一扇与门的真值表演示加密过程,并走通四步全流程,算清每步在保护谁。

核心概念

回想第 1 章的困局:把电路直接发给对方算,对方一路看着明文信号,输入全暴露。混淆电路的解法是把"信号"换成"随机标签",把"门的计算"换成"解密"。规则如下:电路里每根导线 w 配两枚 128 比特的随机标签——w0 与 w1,分别代表 0 值与 1 值。对外只发布加密后的门表:对于每扇门,用它的两根输入线标签作为密钥材料,把对应输出线标签加密四次,行序打乱。拿到一对正确的输入标签,才能解出唯一一行、得到正确的输出标签;拿错钥匙解出的只会是垃圾,且垃圾与正确标签长得一样随机——看不出自己错了。

用一扇与门(输入线 A、B,输出线 C)演示。生成方随机抽标签:A0、A1、B0、B1、C0、C1(各 128 比特)。与门真值表要求:仅当 A=1 且 B=1 时输出 1。于是要加密的四行是:

行 1:用 A0, B0 解 → 得 C0 行 2:用 A0, B1 解 → 得 C0 行 3:用 A1, B0 解 → 得 C0 行 4:用 A1, B1 解 → 得 C1

实现上每行是一次带双密钥的对称加密,例如 C0 的三个密文分别为 Enc(A0, B0, C0) 等,四行密文随机排序后构成这张门的混淆表。求值方若持有 A1 与 B1,四行里恰有一行能成功解密(第 4 行),得到 C1;持有 A0 与 B1 则解出第 2 行的 C0。解错的行产生乱码,求值方靠"成功解密"标记(点旁路技术,见 3.4 节)识别哪行是真解。整个加密结构保证:正确路径畅通、错误路径全是随机噪声、标签与真值的对应关系(A0 到底代表 0 还是 1)永不外泄。

图:混淆电路四步全流程

图:混淆电路四步全流程

第二步为什么必须绕道 OT

直接把"鲍伯输入对应的标签"发给鲍伯不行——爱丽丝从标签值反查得到鲍伯的输入。让爱丽丝替鲍伯选也不行——她需要知道鲍伯的输入才能选。这正是 2.4 节 OT 的标准应用场景:爱丽丝把每位输入的两个标签作为 OT 的两条消息,鲍伯按自己的比特作为选择比特执行 OT。事后爱丽丝不知道鲍伯取了哪枚,鲍伯手里也只有自己那枚。每位输入一条 OT,8 位比较就是 16 条(双方各 8 位,鲍伯只需取自己 8 位)——借 OT 扩展(2.4 节的 128 次点火技术)这些调用近乎免费。

动手演练:一扇与门的迷你混淆

用哈希函数模拟"以标签为钥匙的加密",验证四行真值表的加解密闭环:

import hashlib, os def kdf(t1, t2, gate_id): # 双密钥派生:真实实现用 AES 或带密钥哈希,这里用 SHA256 模拟 h = hashlib.sha256(t1 + t2 + gate_id).digest() return h label = {w: [os.urandom(16), os.urandom(16)] for w in "ABC"} # 每线两枚 128 比特标签 truth = {(0,0):0, (0,1):0, (1,0):0, (1,1):1} # 与门 table = [] for (a, b), c in truth.items(): ct = bytes(x ^ y for x, y in zip(kdf(label["A"][a], label["B"][b], b"G"), label["C"][c])) table.append(((a, b), ct)) # 实际发布时行序打乱、并附成功解密标记 def evaluate(ta, tb): # 求值方只持有标签,不知 a b 取值 for (ga, gb), ct in table: out = bytes(x ^ y for x, y in zip(kdf(ta, tb, b"G"), ct)) if out in label["C"]: # 解出合法标签 = 唯一正确行 return out return None assert evaluate(label["A"][1], label["B"][1]) == label["C"][1] assert evaluate(label["A"][0], label["B"][1]) == label["C"][0]

会话输出:两次求值分别返回 C1 与 C0 的标签,且从标签本身看不出任何语义。注意示例为教学简化:真实协议里"输出标签是否合法"不能靠在集合里查(那会泄露全表),而是点旁路的 1 比特改造,见下一节。

工程实践要点

轮数与带宽的交换律。 混淆电路的在线交互只有"发包 + OT + 回标签"一两个来回,广域网高延迟环境下优势明显;但门表通信量正比于与门数量,电路一大带宽就疼。经验法则:延迟敏感、计算浅的函数(比较、筛选、短电路)适合 GC;算术重的函数(大矩阵乘)适合 SPDZ 系。标签宽度 128 比特是工业标准,对应的安全强度与 AES-128 同级。

⚠️ 常见坑:输出映射表发早了。求值完成前公布"标签到真值"的映射,求值方可在求值过程中边解边对表,逐层还原中间信号,生成方输入瞬间裸奔。映射必须最后发,且只发输出线的。

本节要点:标签替换信号、双钥加密真值表是 GC 的全部机密所在;输入交付靠 OT、输出映射最后发;半诚实安全是这套流程的默认档位。下一节把一张与门表拆到字节,算清它的体积账。

求值方的视角清单

站在求值方鲍伯的视角把四步再走一遍,每一步问自己"我现在知道什么"。第一步收到电路包:知道电路结构与门表密文,不知道任何标签与真值的对应。第二步 OT 拿到自己的输入标签:手里多了一串随机数,连自己输入位对应哪枚都只能靠记录(OT 保证他取的就是自己那枚)。第三步逐门求值:每扇门解出一行得到输出标签,像持钥走迷宫,全程不知道自己算出的中间值是 0 还是 1。第四步拿到输出映射表:最后的标签才"显影"成真值。

这份清单有两个用途。排查实现 bug 时,按"此刻应该知道什么"逐点核对,越界即有泄露、缺位即有错误;写安全评审文档时,把它扩写成"信息暴露时间线"附在方案后,评审效率远高于空谈"我们用了混淆电路"。安全论证的本质就是把"谁知道什么"在时间轴上钉死,这个习惯从第 3 章开始养成,第 5 章的仿真范式会把它变成严格数学。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U