想象你拥有一只魔法保险柜——柜身是磨砂玻璃,外人无法看清里面的东西,但柜角装着一双灵巧的机械手。你把装着数字的保险柜交给远方的厨师,厨师虽然看不见数字,却能操控机械手在柜内完成搅拌与翻炒。待柜子送回来,你用自己的钥匙打开,发现里面的数字已经被正确算好了。这听起来像魔术,其实是密码学里的「同态加密」。根据柜子能做的动作多少,业界诞生了四件著名厨具:只会拌的 Paillier、能切能炒但油烟大的 BGV、换了一套清爽刀法的 BFV,以及一位追求「差不多就行」的高效大厨 CKKS。选哪一件,要看你做什么菜、允许多少油烟、能付多少电费。这篇文章将带你走进这间全透明厨房,把四种方案的门道一一尝个明白。
理解不同同态加密方案的取舍,是从事隐私计算、联邦学习与数据安全工作的基本功。掌握这笔账,你才能在不泄露数据的前提下,为真实项目做出靠谱的技术选型。
可视化演示
展示同态加密的密文计算流程与Paillier、BGV/BFV、CKKS三类方案的参数对比,支持模式切换查看不同维度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
同态加密计算流程 明文经加密后在密文域直接执行计算 计算过程无需解密保障数据机密性 Dec(Enc(a) ⊕ Enc(b)) = a ⊕ b 密文域运算结果解密后等价于明文运算
核心概念
想象你请了一位看不见东西的大厨。你把一个磨砂玻璃保险柜交给他,柜子里放着你的食材,柜门外伸进一双机械手臂。大厨虽然看不见柜中的食材,却能根据你从窗口递进的纸条,操控机械臂完成「加一勺糖」「搅拌三圈」这类操作。几个小时后,柜子送回来,你打开一看,食材已经按配方处理完毕。整个过程中,大厨没看过一眼食材,但活儿全干完了。
这个「看不见却算得动」的魔法柜子,在密码学中叫同态加密。它的核心性质可以写成一句话:对密文做某种运算,等价于对明文做对应运算后再加密。用符号表示:把加密的 $m_1$、$m_2$ 放进柜子,机械手「叠加」一下,拿回来解出来的就是 $m_1+m_2$。
同态加密家族按「机械手能做什么动作」分成几档:只会一种动作的叫部分同态,动作更多但次数有限的叫稍全同态,任意动作无限次数的叫全同态。这篇文章的主角是四个成名方案——只会拌的 Paillier、能切能炒但油烟大的 BGV、刀法更清爽的 BFV,以及追求「差不多就行」的 CKKS。
总之,这口保险柜的价值不在于柜子本身多结实,而在于柜子里那双「盲操作」的手能完成多复杂的菜式。接下来,我们挨个认识这四位大厨。
- 加密函数$\mathsf{Enc}(m)$ 表示用公钥把明文 $m$ 加密成密文。
- 密文运算$\otimes$ 表示密文上的某种运算,具体方案不同,可以是模乘法或多项式乘法。
- 整体含义对两个密文做运算后解密,等价于对两个明文直接做加法。
Paillier 加法同态
Paillier 是保险柜家族里的「凉拌专员」。他的机械手只练过一个动作:把两份食材倒进一个盆里拌匀。对应到密码世界,就是两个密文相乘,解密后等于对应明文相加。因为动作单一,他的柜子里几乎不积攒油烟,可以一口气处理成千上万份食材而不需要清理。
Paillier 于 1999 年由 Pascal Paillier 提出,属于部分同态加密。它是一套公钥加密系统:任何人可以用公钥把数字 $m$ 加密成密文,只有持有私钥的你才能解密。它的同态魔法表现在这个等式上——密文做乘法,明文做加法,仿佛数字在密文世界里发生了一次「运算换装」。
由于只做加法,Paillier 的密文扩展率非常低:明文在 $\mathbb{Z}_n$ 里,密文在 $\mathbb{Z}_{n^2}$ 里,体积只膨胀约两倍。这在同态加密里是极其奢侈的「轻量级」。实际应用中,电子投票、密文求和、联邦学习中的梯度聚合,都是 Paillier 的主场。
如果说其他全同态方案是功能繁多的重型机械,Paillier 就是那台把「拌匀」做到极致的轻巧推车。别嫌它动作少——大量统计任务归根到底就是加法,而它恰好又快又稳。
- 密文输入$E(m_1)$ 和 $E(m_2)$ 是两次独立加密得到的密文,任何人都能生成。
- 模乘法运算在模 $n^2$ 的环里把两个密文相乘,这是云服务器能做的唯一动作。
- 解密结果乘积解出来等于 $m_1 + m_2$ 模 $n$,与直接对明文求和一致。
BGV 整数全同态
BGV 给保险柜装上了两只机械手:一只负责切(加法),一只负责炒(乘法)。理论上,绝大多数菜谱都能由「切」与「炒」组合出来。然而,每炒一次菜,柜内就会多一层油烟;油烟越积越浓,直到磨砂玻璃彻底变成黑玻璃,你打开柜子也看不清菜变成什么样了——解密失败。
BGV 由 Brakerski、Gentry 和 Vaikuntanathan 于 2011 年提出,是第一代实用的全同态加密方案,奠基在 LWE/RLWE 格问题上。它把整数编码为多项式系数,通过密文加法和乘法构造任意计算电路。为了让无限深度的计算成为可能,BGV 祭出三件套:密钥交换、模切换和自举。
密钥交换解决乘法后密文尺寸膨胀的问题,把三元密文压回二元;模切换在每次乘法后按比例缩小模数,让噪声的增长不再失控;而当噪声逼近临界值时,自举对密文做一次「加密的解密」,将噪声重置回初始水平。但三件套都很昂贵,尤其自举,常常吃掉 90% 以上的计算时间。
BGV 像一位手艺全面的大厨,但每道菜的成本都包含一次电费高昂的排烟。聪明的使用法不是逃避油烟,而是精心设计菜谱,把乘法层级控制在油烟上限之内,只在关键时刻才开抽油烟机。
- 初始噪声$\epsilon_0$ 是加密时就注入的随机扰动,每个密文生来就带一点「油烟」。
- 放大倍数$B$ 是单次乘法把噪声放大的底数,与安全参数和模数相关。
- 指数累积$k$ 是连续乘法的次数,指数位置说明噪声是指数级膨胀而非线性增长。
BFV 整数全同态
BFV 是 BGV 的同门师弟,同样拥有「切炒双全」的机械手。变化在于他换了一套刀法:下锅之前,先把所有食材按固定大小切丁(消息缩放),于是烹饪过程中飞溅的油星明显变少,同样的排烟预算能做更多道菜。
BFV 由 Brakerski、Fan 和 Vercauteren 在 2012 年提出,与 BGV 同属基于 RLWE 的全同态整数方案。两者都能在密文上进行加法和乘法,但编码思路不同:BGV 把消息嵌在模数结构里,BFV 则先把明文 $m$ 乘以一个缩放因子 $\Delta$ 再加密,解密时除以 $\Delta$ 还原。
BFV 的缩放策略让整数除法变得很自然:除以一个数等于乘以它的倒数再取整,这在 BGV 里却要费一番周折。因此,需要精确整数除法、平均值计算的场景,BFV 往往更顺手。主流库 OpenFHE 和 Microsoft SEAL 对 BFV 的支持也很成熟。从性能对比看,BFV 和 BGV 的密文扩展率都处在千倍量级,属于「半斤八两」的通勤费用。
如果说 BGV 是爆炒时油花四溅的铁锅,BFV 就是不粘涂层升级版——同一套菜谱,更少的油烟,更省心的维护。但该有的排烟系统(自举)一样不能少,只是能多撑几层烟火。
- 密文还原$c_0 + c_1 s$ 用私钥 $s$ 把密文 $(c_0, c_1)$ 还原成带噪声的放大消息。
- 模数归约$[\cdot]_q$ 在模 $q$ 下取整数值,把噪声扰动压到最小范围。
- 缩放还原除以 $\Delta$ 并四舍五入,恢复出真正的明文 $m$。
CKKS 近似浮点
CKKS 保险柜里的机械手是一位「差不多先生」。他做的菜不追求精确到克,而是保证口味大体不差,误差在可接受范围内。为此,他换来惊人的效率:能同时颠勺炒一整车食材(向量打包),特别适合「尝个大概对不对」的场合——比如让 AI 判断一张片子像不像早期肺癌。
CKKS 由 Cheon、Kim、Kim 和 Song 于 2017 年提出,是首个面向浮点近似计算的全同态方案。它把复数或实数向量编码成多项式,一条密文里打包成百上千个数值,密文乘法天然变成逐元素乘法(SIMD)。计算过程中用一个缩放因子 $\Delta$ 模拟浮点小数点,每次乘法后执行重缩放(rescaling)把比例调回去,同时压住噪声。
正因为误差可控但不为零,CKKS 完美契合机器学习:神经网络本来就是梯度下降、概率输出的「容错算法」,对 $10^{-5}$ 量级的扰动浑然不觉。于是,密文推理和密文训练几乎成了 CKKS 的代名词。代价是密文扩展率同样高达千倍级别——一条 HE 密文动辄数 MB,传输和存储都让人心跳加速。
差不多先生的菜未必适合国宴摆盘(比如货币金额的精确结算),却最适合时间紧、量大、口味容错的场景。AI 世界的烟火气,正好配 CKKS 这位高效大厨。
- 特殊乘法$\odot$ 表示密文上的乘法并伴随一次重缩放(rescaling),用来把缩放因子调回来。
- 近似符号$\approx$ 表示结果与真实乘法只差一个很小的浮点误差,误差量级由缩放因子和层级决定。
- 误差来源误差来自每次乘法后的取整与缩放,深度越深,累积误差越大,但通常控制在 $10^{-5}$ 量级。
噪声与性能
四口保险柜摆在厨房里,我们得打开账本算一笔账:每一口柜子的「排烟成本」和「食材损耗」是多少?这决定你接不接这单生意。
衡量同态加密方案有两条硬指标:噪声累积速度和密文扩展率。噪声是密文中夹杂的随机扰动,每次乘法都会被放大,放大到一定程度就无法解密;密文扩展率指密文体积与明文体积的比值,直接决定传输带宽和存储成本。
| 方案 | 支持运算 | 密文扩展率 | 噪声增长速度 | 典型深度 |
|------|---------|-----------|-------------|---------|
| Paillier | 仅加法 | 约 2 倍 | 极慢 | 极深(加法几乎无噪声) |
| BGV | 加法+乘法 | 千倍级 | 快(指数) | 约 10~20 层乘法 |
| BFV | 加法+乘法 | 千倍级 | 较快(指数) | 约 15~25 层乘法 |
| CKKS | 加法+乘法(近似) | 千倍级 | 中等 | 可数十层,容忍误差 |
厨具没有好坏,只有账本算不算得过来。BGV 的油烟虽然大,但你的菜谱只炒三步,那它就绰绰有余;CKKS 效率虽高,可客户若要求克克精确,它的「差不多」就交不了差。
- 噪声上限$\epsilon_{\max}$ 是解密算法还能正确还原明文的噪声临界值,超过就报错。
- 初始噪声$\epsilon_0$ 是加密时携带的基础噪声,越小留给计算的预算越多。
- 对数运算$\log_B$ 把指数增长的噪声换算成「能撑几层乘法」,这就是运算深度上限。
选型指南
你是一家医院的「数据大厨」,想把病人的病历送上云服务器做分析,又不愿泄露隐私。面对四口保险柜,怎么下单?答案藏在你要做的「菜」里。
先算菜谱有几层乘法:若是求和、均值、统计计数这类纯加法任务,Paillier 是预算最优解,成熟稳定;若是金额结算、整数运算且深度可控,BFV 的缩放机制让整数除法得心应手;若要在密文上跑神经网络,CKKS 的浮点近似和 SIMD 打包几乎是唯一答案。BGV 则适合整数电路设计友好、愿意精细管理噪声预算的场景。
其次看算力约束:全同态计算比明文慢好几个数量级,自举更慢,所以「能不用 FHE 就不用」是工程界的共识,或配合可信硬件等其他隐私技术混合使用。最后看发展趋势:专用硬件加速(FPGA/ASIC)、SIMD 打包优化、混合协议正在把 FHE 的延迟从秒级推向毫秒级,CKKS 的生态也愈发繁荣。
选型不是选最贵的厨具,而是选最合菜谱的那口锅。凉拌菜就推 Paillier 小推车,整数大餐交给 BFV 不粘锅,AI 快炒认准 CKKS 猛火灶——至于那台自举抽油烟机,预算充足时备上,关键时刻能救命。
- 解密操作$\mathsf{Dec}(c)$ 在加密电路内部完成,谁也不知道明文是什么。
- 重新加密紧接着用公钥加密,得到一个新密文 $c'$。
- 效果$c'$ 包含的噪声被重置到接近初始水平,可以继续下一轮计算。
AI 应用场景
联邦学习的安全梯度聚合
阶段:训练阶段中的安全聚合(Secure Aggregation)
解决的问题:传统联邦学习直接传明文梯度,攻击者可以逆推还原训练数据;用 Paillier 对梯度加密聚合,服务器只见密文和聚合结果,单个参与方的梯度永不落地。
具体案例:某三甲医院联盟横向联邦训练肺结节识别模型,各院用 Paillier 加密本地梯度上传,中央服务器在密文上直接求和后下发,各院解密更新模型。全程影像数据不出院,梯度明文不落地,训练效果与明文聚合几乎一致。
云端 AI 推理的隐私保护
阶段:推理与部署阶段
解决的问题:用户把数据加密后上传,云服务器用 CKKS 在密文上跑神经网络推理;传统方案要么明文裸奔,要么依赖可信执行环境,前者泄露隐私,后者受硬件限制。
具体案例:银行征信系统用 CKKS 部署信用评分模型,借款人的收入、负债、流水等敏感字段全程加密,云端只返回加密的评分结果,模型权重同样对用户保密,实现双向隐私保护。
电子投票的密文计票
阶段:数据采集与聚合统计
解决的问题:传统投票需要可信计票中心,计票员能看到每一张票;Paillier 让每张票加密为 0/1 密文,计票节点只能做密文求和,最终只解密出总票数。
具体案例:某大型组织无记名投票系统采用 Paillier 同态计票,选票加密上传后,计票节点在密文上求和,最终只公布票数和结果,任何单个选票内容都不可追溯,兼顾匿名性与可验证性。
Python 演示
# 需要安装依赖: pip install phe# 演示 Paillier 加法同态: 云服务器汇总密文, 不泄露任何明文from phe import paillier def main(): print("=== Paillier 加法同态演示 ===") # 1. 密钥生成: 公钥交给数据方, 私钥由数据方自己保管 pub_key, priv_key = paillier.generate_paillier_keypair() # 2. 医院加密三笔检查费用, 上传云服务器 bills = [128.5, 362.0, 89.75, 450.25] enc_bills = [pub_key.encrypt(m) for m in bills] print("明文账单:", bills) print("密文账单(截断):", [str(e)[:16] + "..." for e in enc_bills]) # 3. 云服务器在密文上直接求和, 全程看不到明文 enc_total = sum(enc_bills) print("云服务器完成密文求和") # 4. 医院取回结果, 用私钥解密 total = priv_key.decrypt(enc_total) print("解密总额:", round(total, 2)) assert abs(total - sum(bills)) < 1e-6 # 5. 密文还支持标量乘法, 可用于求平均等统计 enc_avg = enc_total * (1.0 / len(bills)) avg = priv_key.decrypt(enc_avg) print("密文求平均:", round(avg, 2)) if __name__ == "__main__": main()
pub_key, priv_key = paillier.generate_paillier_keypair()生成一对钥匙:公钥用来加密,私钥只能自己留着解密。enc_bills = [pub_key.encrypt(m) for m in bills]把每笔费用逐个丢进保险柜,变成外人读不懂的密文。enc_total = sum(enc_bills)云服务器直接把密文相加,这正是 Paillier 的核心法力:看不见数字,却能算出总和。total = priv_key.decrypt(enc_total)拿回结果后用私钥解密,得到所有账单的总金额。enc_avg = enc_total * (1.0 / len(bills))密文还能乘以常数,再解密就是平均值,用途又扩大一步。
常见误区
误区「BGV/BFV 支持任意计算,我把所有数据都加密丢给云服务器跑就行,反正全能算。」
正解全同态加密的计算开销极其惊人,通常比明文慢 5~6 个数量级,密文体积膨胀上千倍,自举一次更是昂贵。它适合特定的小规模精确计算或大批量 SIMD 并行,绝不适合把整个数据库都加密后跑任意 SQL。比喻:让厨师每炒一道菜都要换一次防尘服、开一次抽油烟机,时间和电费都让人倒吸凉气。
为何常见:论文里的「任意函数」宣传让人误以为没有代价,忽略了底层的性能账单。
误区「Paillier 只能加不能乘,支持的东西太少,商业上没什么价值。」
正解现实中大量数据分析任务本质是加法——求和、均值、计数、直方图、梯度聚合。这些场景用 Paillier 不仅够用,而且因为它密文小、噪声低、速度快,早已在电子投票、联邦学习、密文数据库中落地。加法不是短板,而是它的精准定位。
为何常见:看论文时只关注「全同态 vs 部分同态」的标签,忽略了实际需求往往只是加法。
误区「CKKS 也是全同态,解密出来的结果应该和明文计算完全一样。」
正解CKKS 是近似加密方案,解密结果带着可控的浮点误差,误差大小由缩放因子、运算深度和舍入方式决定。它适合神经网络这类天然容忍噪声的任务,但绝不适用于货币金额、法律文书等要求精确相等的场景。比喻:差不多先生端出的菜「大体对味」,却经不起米其林评委的克克计较。
为何常见:把「解密后能得到结果」错误理解成「得到完全精确的结果」,忽略了近似符号 $\approx$ 的存在。
误区「既然自举能刷新噪声,那我就随便算,无限深度,不用做预算规划。」
正解自举是目前全同态计算中最贵的操作,通常占整个计算耗时的 90% 以上。实践中必须精心设计「层级预算」:把任务拆成尽量少的乘法层,只在必要时调用自举。盲目依赖自举,账单会高到让你怀疑人生。
为何常见:理解了自举的机制,却没理解它的性能代价,把「可行」当成了「免费」。
误区「反正同态加密密文都很大,选哪个方案传输开销都一样。」
正解Paillier 的密文扩展率只有约 2 倍,而 BGV、BFV、CKKS 的扩展率通常在千倍量级——一条 CKKS 密文动辄数 MB。这直接决定了网络带宽、存储成本和整体架构设计。把 Paillier 和 BGV 当成同一档开销,是选型的大忌。
为何常见:只听说过「同态加密慢且大」,没有对具体方案的扩展率做量化对比。
面试题
Q1. 下列哪个方案只支持加法同态?
- A.Paillier 方案← 正确答案
- B.BGV 同态方案
- C.BFV 同态方案
- D.CKKS 同态方案
答案:A。Paillier 是部分同态加密,只支持密文乘法对应明文加法。BGV、BFV、CKKS 都同时支持加法和乘法,属于全同态家族。
Q2. 同态加密中「噪声」主要来自哪里?
- A.加密随机性与乘法运算← 正确答案
- B.网络传输中的信号衰减
- C.服务器长时间运行的发热
- D.明文数据本身的体积大小
答案:A。噪声来自加密时注入的随机项,并在每次乘法后被放大。它是同态加密正确性失效的根本原因,与网络、硬件发热、明文大小无关。
Q3. CKKS 与 BGV、BFV 最大的区别是什么?
- A.支持近似浮点与复数计算← 正确答案
- B.不需要依赖任何安全假设
- C.所有场景下密文尺寸更小
- D.无需密钥即可完成解密运算
答案:A。CKKS 面向浮点近似计算,结果带可控误差;BGV 和 BFV 都是精确整数运算。安全性上 CKKS 同样依赖 RLWE 假设,密文尺寸并不更小,解密也必须有私钥。
Q4. 自举(Bootstrapping)在 FHE 中的作用是什么?
- A.刷新密文噪声,支持无限深度← 正确答案
- B.压缩密文体积,降低传输带宽
- C.提高同态加密的运行速度
- D.自动为系统生成全新密钥对
答案:A。自举对密文执行一次「加密的解密再加密」,把噪声重置到接近初始水平,从而支持任意深度的计算。它不压缩密文、不加速计算、不生成密钥,反而非常昂贵。
Q5. Paillier 方案的密文扩展率大约是多少?
- A.约两倍,明文空间是密文空间的平方根← 正确答案
- B.约一千倍,密文占据巨大存储空间
- C.约一百倍,扩展率中等偏大
- D.约零点五倍,密文比明文还要小
答案:A。Paillier 明文在 $\mathbb{Z}_n$ 中,密文在 $\mathbb{Z}_{n^2}$ 中,所以密文约是明文的 2 倍大小,远小于 BGV/BFV/CKKS 的千倍级扩展率。
Q6. BGV 方案中控制噪声增长的关键技术组合是?
- A.密钥交换、模切换与自举← 正确答案
- B.哈希扩展、数据填充与校验码
- C.对称加密、消息认证码与签名
- D.时间戳、随机数与日志审计
答案:A。密钥交换(Key Switching)控制乘法后密文膨胀,模切换(Modulus Switching)降低噪声压力,自举(Bootstrapping)重置噪声,三者共同撑起 BGV 的全同态能力。
Q7. 在隐私保护机器学习推理中,最常用的 HE 方案是?
- A.CKKS, 支持浮点近似与批量打包← 正确答案
- B.Paillier, 只支持加法同态运算
- C.ElGamal, 常用于经典公钥加密
- D.RSA, 广泛用于安全传输通道
答案:A。神经网络推理需要浮点乘加和海量并行,CKKS 的近似计算与 SIMD 打包恰好匹配;Paillier 只能加法,ElGamal 和 RSA 不具备实用同态能力。
Q8. 下列关于 BGV 和 BFV 的说法正确的有哪些?
- A.两者都支持精确整数全同态运算← 正确答案
- B.BFV 采用消息缩放,除法更自然← 正确答案
- C.BGV 方案完全不需要噪声管理
- D.两者安全性都基于 RLWE 假设← 正确答案
答案:ABD。BGV 和 BFV 都是整数全同态方案,基于 RLWE/格难题。BFV 的缩放机制让整数除法更自然;C 错在 BGV 同样需要密钥交换、模切换和自举来管理噪声。
Q9. 下列哪些场景适合使用 Paillier?
- A.电子投票中的匿名计票统计← 正确答案
- B.联邦学习中的梯度安全聚合← 正确答案
- C.任意深度神经网络的密文推理
- D.密文数据库的求和与均值查询← 正确答案
答案:ABD。投票计数、梯度聚合、求和均值都是纯加法任务,Paillier 高效胜任。C 需要大量密文乘法和近似计算,Paillier 不支持,应选用 CKKS。
Q10. 关于同态加密「密文扩展率」的说法正确的有哪些?
- A.密文扩展率等于密文除以明文大小← 正确答案
- B.Paillier 的扩展率远低于 BGV← 正确答案
- C.扩展率不影响传输与存储开销
- D.CKKS 密文含多个多项式分量← 正确答案
答案:ABD。扩展率是密文与明文体积之比,直接决定带宽与存储成本,C 明显错误。Paillier 约 2 倍而 BGV/CKKS 达千倍级;CKKS 密文通常由两个以上多项式构成,体积庞大。