基于SEAL的BFV方案中旋转密文部分槽位运算如何实现
SEAL BFV方案部分槽位选择性运算实现方案
完全可以实现该需求,核心逻辑是通过掩码做槽位选择,不需要额外修改同态加密底层逻辑,以下是两种可直接落地的实现方案:
方案1:明文掩码法(性能最优,适合单步运算场景)
- 核心逻辑:构造无需加密的明文掩码,通过掩码控制运算生效的槽位
- 操作流程:
- 预生成掩码明文:前
slot_count/2个槽赋值为1,后slot_count/2个槽赋值为0,通过BatchEncoder编码为适配BFV的Plaintext对象mask_forward_pt,同时可以预生成反向掩码mask_backward_pt(前半槽0,后半槽1)备用 - 加法类运算:如果需要给前半槽加常量
add_val,直接构造运算明文op_pt = mask_forward_pt * add_val(明文乘法本地执行即可),调用evaluator->add_plain(ct, op_pt, result_ct),前半槽完成加法,后半槽加0保持原值 - 乘法/复杂运算:先对全量密文执行目标运算得到全量运算结果
ct_full_op,再执行evaluator->multiply_plain(ct_full_op, mask_forward_pt, temp1)、evaluator->multiply_plain(ct, mask_backward_pt, temp2),最后调用evaluator->add(temp1, temp2, result_ct)即可,前半槽保留运算结果,后半槽保留原始值
- 预生成掩码明文:前
- 优势:仅引入1-2次极低开销的明文同态运算,几乎不会增加额外的噪声预算消耗
方案2:密文拆分合并法(适合多步复杂运算场景)
- 核心逻辑:提前拆分出仅前半槽有效、仅后半槽有效的两份密文,分别处理后合并
- 操作流程:
- 用预生成的两个掩码分别和原始密文做同态明文乘法,得到
ct_front(仅前半槽存原始值,后半槽为0)、ct_back(仅后半槽存原始值,前半槽为0) - 仅对
ct_front执行你需要的任意同态运算(加法、乘法、多级运算、再次旋转均可),ct_back全程不做任何修改 - 运算完成后调用
evaluator->add(ct_front_processed, ct_back, result_ct),直接得到目标结果
- 用预生成的两个掩码分别和原始密文做同态明文乘法,得到
- 优势:如果前半部分需要执行多轮运算,仅需要在拆分、合并阶段各做一次掩码乘法,不需要每轮运算都带掩码,整体性能开销更低
适配旋转后密文的注意事项
- 以上方案对旋转后的密文完全兼容:掩码仅和密文当前的槽位顺序匹配,和密文之前是否做过旋转、重线性化等操作无任何关联
- 生成掩码时请使用和密文编码相同的
BatchEncoder实例,避免槽位顺序不匹配的问题 - 所有操作均不需要私钥参与,全程可在不可信计算节点执行,符合同态加密的安全假设
内容的提问来源于stack exchange,提问作者Nandini Malhotra
相关产品推荐
相关产品推荐

