5.3 隐私求交与隐私推理:两个完整算例


5.3 隐私求交与隐私推理:两个完整算例

本节摘要:本节把同态加密用到两个最有代表性的协议上,做步骤级展开。算例一隐私求交:双方求交集且互不泄露差集,用"服务端集合构造匹配多项式、客户端加密元素送入同态求值"的构造走完整流程。算例二隐私推理:用户加密输入、云端在密文上跑卷积网络、返回加密预测,给出层级的方案切分与性能量级。两个算例都附可直接套用的代码骨架。

算例一:隐私求交,从场景到协议

场景设定为两家机构:一方持有规模较小的客户标识集合(设为千级),另一方持有大规模库(设为亿级),双方想知道小集合里哪些标识出现在大库里——用于联合营销的受众筛选或风控的黑名单碰撞——但任何一方都不能看到对方的差集。朴素方案是各自把全集发给可信第三方,第三方信任成本不可接受;哈希直传方案(双方直接交换哈希)在低熵标识上会被字典攻击打穿。隐私求交协议的目标是在无可信第三方的前提下完成碰撞检测。

技术路线有三条主流:基于密钥交换的路线(双方对元素做可交换的盲化再比对,通信小、计算与集合规模同阶);基于不经意传输的路线(密码学效率高但通信大);基于同态加密的路线(特别适合"不平衡"场景——一方的集合比另一方大几个数量级时,把大方的计算全部留在本地、只让小方通信)。当服务端有亿级记录、客户端只有千级时,同态路线的通信量与小方集合同阶(兆字节级),而密钥交换路线的通信与大方同阶(吉字节级)——这个差距正是真实部署选同态路线的理由。业界的公开案例包括移动厂商在设备端做云端凭证碰撞检测、广告与媒体的联合受众统计,均采用同态或不经意伪随机函数路线。

同态路线的核心构造是"匹配多项式"。服务端把自己的集合元素当作根,构造一个多项式:元素属于集合,当且仅当多项式在该元素处取值为零。客户端把自己的每个元素加密后发给服务端;服务端在密文上同态地求这个多项式的值,再乘上一个随机掩码把"非零值"搅乱,返回密文。客户端解密:看到零(或约定的可识别标记),元素在交集里;看到随机数,不在。服务端全程不知道客户端的元素,客户端只学到"是否为零"这一比特信息,学不到服务端集合的其他内容。

图:隐私求交的协议数据流

图:隐私求交的协议数据流

算例一的代码骨架与工程细节

# 匹配多项式 PSI 的概念骨架(整数线方案,接口形态参考主流库) def psi_client(elements, server_ctx_material): cts = [encrypt(int_hash(e)) for e in elements] # 哈希到整数再加密 results = send_and_evaluate(cts, server_ctx_material) intersection = [] for e, r in zip(elements, results): val = decrypt(r) if is_recognizable_zero(val): # 识别约定的零标记 intersection.append(e) return intersection def psi_server(library, client_cts): poly = build_root_poly(int_hash(x) for x in library) # 根为库内元素 out = [] for ct in client_cts: val_ct = eval_poly_homomorphic(poly, ct) # 同态求多项式值 r = random_unit() # 随机掩码 out.append(val_ct * r) # 非零值被搅成随机数 return out

三个工程细节决定这套骨架能不能上生产。其一,元素要先做密码学哈希再映射到明文空间,防止低熵标识(手机号、证件号)被服务端枚举试探——哈希把熵拉满,掩码才有意义。其二,"可识别的零"要专门设计:直接用零会被随机掩码相乘后仍为零(零乘任何数还是零),这恰好是本构造的巧妙处——零经过掩码不变、非零被搅乱;但要注意明文模数下的零是精确零,浮点近似方案里这个构造要换成整数线。其三,多项式规模问题:亿级根的多项式直接求值深度爆炸,实际实现按桶分片(哈希分桶后每桶一个小多项式)或改用不经意伪随机函数配合同态比对,把求值深度压到常数层。

算例二:加密神经网络推理的完整切分

场景:模型提供方(例如医疗影像服务)持有训练好的卷积网络,医院把影像加密后送上来,服务方在密文上完成前向计算,返回加密的诊断概率,全程看不到影像内容。选型按第三章矩阵切分:卷积与全连接层是密集线性运算,交给近似线的打包摊销;激活函数用低次多项式(平方激活或切比雪夫逼近)或切到布尔线的可编程自举。整体呈"线性段分层算、非线性段自举刷"的混合流水线。

层级拆开看。卷积层:用对角线法把卷积核重排,一次密文乘法处理整幅特征图的一个通道,旋转次数与核规模相关;池化层用旋转加法实现。激活层:若用平方激活(多项式次数二),一次乘法加一次重缩放即可;若精度要求高,用更高次逼近或切换方案。全连接层就是矩阵向量乘,对角线法标准处理。输出层若要做软最大与 argmax,涉及比较运算,是布尔线的舒适区。整个网络深度经逼近改造后典型在十到二十层乘法深度,八千一百九十二维度的近似线配置(模数链二百多比特)配合一两次自举即可覆盖。

性能量级给三档锚点。学术里程碑(加密图像分类的早期工作):单张推理分钟级、批量摊销后每张秒级(约一点二秒)。当代中央处理器与成熟库:小型网络加密推理进入百毫秒级。图形处理器与专用加速:毫秒级门槛已被踩线,第六章的硬件竞赛正是把这条线往下压的主战场。规划一个推理服务时的经验公式:先在明文侧改造模型(量化、低次激活、剪枝),再上加密——明文侧省下的每个乘法深度,加密侧都以数量级回报。

# 加密卷积推理的骨架(近似线方案,接口形态参考主流库) def encrypted_inference(model, image, ctx): ct = ts.ckks_vector(ctx, image.flatten()) # 加密输入向量 for layer in model.layers: if layer.kind == "conv": ct = diagonal_matmul(layer.weights, ct) # 对角线法卷积 ct = rotate_and_add(ct, layer.stride) # 旋转聚合 elif layer.kind == "square_act": ct = ct * ct # 平方激活 ct = rescale(ct) # 重缩放归位尺度 elif layer.kind == "fc": ct = diagonal_matmul(layer.weights, ct) if ctx.remaining_levels(ct) <= layer.min_levels_ahead: ct = bootstrap(ct) # 深度续期 return decrypt_with_sk(ct) # 客户端解密预测

两个算例的共性收获

把两个算例并排看,能提炼出同态协议设计的三条通用心法。第一,信息出口要显式列举:求交里客户端只学到"是否为零"一比特,推理里服务方只学到密文——协议评审的第一问永远是"每一方到底多知道了什么"。第二,负载改造先于加密:模型低次化、元素哈希化、数据分桶,明文侧的每个改造在密文侧都按数量级放大收益。第三,混合流水线是常态:单一方案包打天下的时代结束了,按层切分、按运算切分、甚至按精度切分,是当代系统的标准做法。

⚠️ 常见坑:求交场景用浮点近似方案做零判断(近似误差让"零"变成"接近零",判断不稳定);推理场景忘记给软最大层切方案(在近似线里硬算比较,深度与精度双崩)。两坑的共同根源是拿错方案干不匹配的活。

本节要点回顾

  • 要点一:同态求交用匹配多项式构造,零值经掩码不变、非零被搅乱;不平衡场景(亿对千)通信与小方同阶是其关键优势
  • 要点二:求交上生产的三件事——元素先哈希拉熵、零标记精确设计、多项式按桶分片压深度
  • 要点三:加密推理按层切分,线性层走近似线打包、激活走低次逼近或布尔线自举;性能锚点从秒级(早期)到百毫秒级(当代中央处理器)再到毫秒级(硬件加速)
  • 要点四:协议设计三心法——信息出口显式化、明文侧改造先行、混合流水线是常态

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