4. 密码学工具选型与工程封装

在跨机构联合计算中,密码学工具不是“越强越好”,而是“越匹配越好”。同一份数据,用哈希可以完成一致性校验,却无法支持求和;用同态加密可以支持密文加法,却可能因为密文膨胀和密钥管理成本而不适合高频小查询。选型的核心,是把业务目标翻译成密码学能力需求,再对照各工具的计算开销、通信开销、信任假设和工程封装难度做取舍。

先看能力边界:六类工具能做什么、不能做什么

哈希是单向压缩函数,典型用途是完整性校验、去重标识、承诺绑定和 Merkle 树构造。它不提供机密性,也不支持任何密文计算。工程上要注意:对低熵输入(如手机号、身份证号)直接哈希仍可被字典攻击,必须加盐或使用 HMAC。承诺在哈希基础上增加“隐藏性 + 绑定性”,适合拍卖报价、抽签、联合统计中的“先承诺后揭示”场景。它的性能接近哈希,但需要额外的随机数管理和揭示阶段。

不经意传输(OT)是安全两方计算的基石,发送方有多个消息,接收方只能获取其中一个,而发送方不知道接收方选了哪个。OT 本身不直接完成复杂计算,而是作为混淆电路和秘密分享协议的底层组件。工程中常用 IKNP 类 OT 扩展,把少量“种子 OT”扩展成百万级 OT,通信量从 O(n) 降到 O(κ) 级别。

混淆电路(GC)把函数编译成布尔电路,逐门加密成混淆表,双方通过 OT 传递输入标签,最终由一方解密输出。它适合两方、函数固定、电路规模中等的场景,如隐私求交、比较、集合运算。缺点是电路规模随函数复杂度增长,通信轮数与电路深度相关,且难以支持动态循环和复杂控制流。

秘密分享(SS)把秘密拆成多份分发给不同机构,达到阈值才能重构。它天然支持加法、乘法和比较,适合多方联合统计、联邦求和、门限签名。半诚实模型下性能很好,但恶意模型需要一致性校验,通信开销显著上升。同态加密(HE)允许在密文上直接计算,适合外包计算、密文聚合、隐私保护机器学习推理。它的优势是计算方无需解密,缺点是密文膨胀、乘法深度受限、密钥管理和参数选择复杂。

六类密码学工具:能力边界与工程特征对照 横轴:计算/通信开销 → 纵轴:可表达的计算复杂度 开销 → 复杂度 ↑ 哈希 / HMAC 完整性、去重、承诺绑定 承诺 隐藏 + 绑定,先承诺后揭示 不经意传输 OT 二选一,发送方不知选择 混淆电路 GC 布尔电路,两方安全计算 秘密分享 SS 门限重构,多方联合统计 同态加密 HE 密文计算,计算方不解密 底层组件 可组合 基础 选型原则:先明确计算目标与信任模型,再匹配工具;能用哈希/承诺解决的,不引入 HE;能用 SS 的,不轻易上 GC。

性能特征:不是单点指标,而是“计算—通信—轮数”三角

工程选型时,最容易被忽略的是通信轮数。哈希和承诺是本地操作,几乎无交互;OT 扩展需要 1~2 轮;混淆电路通常需要常数轮,但通信量与电路规模成正比;秘密分享在多方场景下每做一次乘法就需要一轮交互;同态加密虽然计算方可以离线批量处理,但密文膨胀可达明文的上百倍,网络传输和存储成本不可忽视。

以一个具体示例说明:三家机构要对各自持有的用户年龄做联合求和,样本量各 10 万,年龄为 0~120 的整数。若采用秘密分享,每方把年龄拆成三个份额,两两分发,本地求和后交换一次,再合并得到总和。半诚实模型下,通信量约为 3 × 10 万 × 2 个 64 位整数 ≈ 4.8 MB,延迟在百毫秒级。若改用同态加密,每方加密年龄向量,密文大小约 10 万 × 2 KB = 200 MB,即使只做加法,传输和聚合时间也会上升到秒级甚至更高。若改用混淆电路,需要把加法电路编译成布尔门,10 万次加法对应约 10 万 × 32 位全加器,通信量可能达到数百 MB。这个示例说明:简单聚合优先用秘密分享,而不是默认上 HE 或 GC。

工程封装:把密码学原语变成可调用的服务

实际系统不会让业务方直接调用 OT 或 GC 库,而是封装成统一接口。封装层需要处理四件事:参数协商、密钥/随机数管理、网络传输、结果验证。以秘密分享为例,封装后的接口可以设计为:

// 伪代码:秘密分享聚合服务
interface SSConfig {
  threshold: number;      // 门限 t
  parties: string[];      // 参与方列表
  field: "prime256v1";    // 有限域
}

// 输入:本地向量 localVec
// 输出:聚合结果 aggregate
function secureSum(localVec: number[], cfg: SSConfig): number {
  const shares = splitSecret(localVec, cfg.parties.length, cfg.threshold);
  const partial = shares.map((s, i) => sendTo(cfg.parties[i], s));
  const received = receiveAll(cfg.parties);
  const localSum = sum(received);
  const aggregate = reconstruct(localSum, cfg.threshold);
  return aggregate;
}

封装时要注意:秘密分享的乘法需要 Beaver 三元组预生成,否则每轮都要交互;同态加密的密钥需要由密钥持有方统一管理,计算方只拿公钥和评估密钥;混淆电路的电路文件应预先编译并缓存,避免每次请求都重新生成。对于跨机构场景,还要考虑机构间网络不稳定、时钟不同步、参与方掉线等问题,封装层应提供超时重试和一致性校验。

选型决策表:从业务问题出发

业务问题 推荐工具 关键理由 需注意
数据一致性校验、去重 哈希 / HMAC 本地计算,零交互,性能极高 低熵输入必须加盐
先承诺后揭示的公平性 承诺 隐藏性与绑定性兼顾 随机数不可复用
两方隐私求交、比较 OT + 混淆电路 支持布尔电路,表达能力强 电路规模随函数增长
多方联合求和、均值 秘密分享 加法免费,乘法需交互 恶意模型需校验
密文聚合、外包推理 同态加密 计算方无需解密 密文膨胀、乘法深度受限
工程经验:在跨机构联合计算中,优先选择“交互少、封装简单、可验证”的工具。哈希和承诺几乎无成本,应作为默认校验手段;秘密分享适合多方统计;OT 和 GC 适合两方复杂函数;同态加密适合计算方不可信且需要密文驻留的场景。不要为了“更安全”而引入不必要的密码学复杂度,因为复杂度本身就是攻击面和运维负担。
常见误区:把同态加密当作万能方案。实际上,HE 的密文膨胀和噪声增长使其不适合高频、小粒度、深电路的计算。若业务只需要求和,秘密分享的通信量和延迟通常远低于 HE。选型时应先做小规模基准测试,用真实数据量估算通信量和延迟,再决定是否引入 HE 或 GC。

最后,工程封装应提供统一的抽象层,让业务方通过“安全求和”“安全求交”“安全比较”等语义接口调用,而不是直接暴露 OT、GC、HE 的底层参数。封装层内部根据数据规模、参与方数量、信任模型自动选择工具,并记录每次调用的参数、耗时和通信量,便于后续调优和审计。这样,密码学工具才能真正落地为跨机构联合计算的基础设施,而不是停留在论文里的原语。