全同态加密方案:Gentry方案、BFV、BGV、CKKS
聊到全同态加密,很多人第一反应是“这东西能跑起来吗?”坦白讲,我早年也有这个疑问。直到我真正啃完Gentry那篇博士,又在项目里调了几个月的BFV库,才慢慢摸清这些方案的门道。
这一章,咱们把四个主流方案掰开揉碎。Gentry方案是祖师爷,BFV和BGV是嫡系传人,CKKS另辟蹊径。它们各自解决了什么问题?适合什么场景?我用自己的踩坑经历给你讲明白。
1. Gentry方案:一切的开端
2009年,Gentry抛出了一个颠覆性想法:用自举(Bootstrapping)刷新噪声。说白了,就是给密文“洗澡”,把累加的噪声洗掉,让它能继续做下一轮运算。
核心思想:
- 基于理想格(Ideal Lattice)构造
- 密文噪声会随计算累积
- 当噪声超过阈值,解密失败
- 自举操作 = 在密文下运行解密电路,输出新密文,噪声清零
我刚开始看Gentry方案时,觉得“在密文下运行解密电路”这句话就像天书。后来在实验室手写了一个最小实现,才明白——自举就是把一个快要“窒息”的密文,放进一个密封的氧气罐里,让它重新呼吸。
个人经验:我建议初学者不要一开始就钻自举的数学细节。先把它当作一个黑盒工具,理解“为什么要自举”比“怎么自举”更重要。
但Gentry方案有个硬伤:效率极低。自举一次可能需要秒级甚至分钟级,密文膨胀比也高得吓人。所以它更多是理论奠基,工业界几乎不用。
2. BFV方案:整数运算的实干家
BFV(Brakerski/Fan-Vercauteren)是2012年左右出现的方案。它没有沿用Gentry的理想格,而是用了RLWE(环学习带错误)问题。相比Gentry,BFV的密钥更小,密文更紧凑。
BFV的核心特点是支持整数运算,而且它有清晰的明文槽(Plaintext Slots)结构。什么意思呢?就是你把一个整数拆成多个小整数,塞进不同的槽里,然后一次性做并行的加法和乘法。
BFV的核心参数:
| 参数 | 含义 | 我的建议 |
|---|---|---|
| 多项式次数 n | 决定安全强度和槽数量 | 一般取 4096 或 8192 |
| 明文模数 t | 决定明文空间大小 | 按需取,别太大,否则效率低 |
| 密文模数 q | 决定噪声预算 | 建议 q/t > 2^40 |
我在项目中遇到过用BFV做隐私保护的风控模型推理,一开始q设得太小,做了两次乘法就噪声爆炸了。后来我们老老实实查了噪声预算表,重新调参,才算稳住。
3. BGV方案:层级运算的优化师
BGV(Brakerski/Gentry/Vaikuntanathan)和BFV很像,都用RLWE和明文槽。关键区别在于模数切换(Modulus Switching)的处理方式。
嗯,这里要注意:BFV每次乘法后会把密文规模缩小,而BGV是在乘法前就把模数缩小。效果差不多,但实现细节不同。BGV的乘法会更省空间,但需要更精细的层级管理。
避坑指南:我曾经在选型时踩过坑——BGV的密钥交换算法复杂度比BFV高,如果电路深度在5层以内,BFV反而更利索。别盲目迷信“BGV更优”的说法。
总结一下BGV的适用场景:
- 电路深度大 > 10层,需要精细的层级控制
- 密文空间敏感,想压缩密文大小
- 对乘法粒度要求高,愿意为效率多写一点调度代码
4. CKKS方案:近似计算的新星
如果说BFV/BGV做的是精确整数运算,那CKKS(Cheon/Kim/Kim/Song)做的就是近似实数运算。它允许运算过程中有可控的精度损失,类似于浮点数的舍入误差。
为什么这个方案重要?因为现实世界中,机器学习模型的权重、梯度、矩阵乘法全都是浮点数。你非要用BFV去表达一个0.5,得先把它放大成整数,算完了再缩小,不仅麻烦,精度还容易跑偏。
CKKS的核心优势:
- 直接支持实数(复数的编码)
- 运算结果保留近似精度,适合神经网络推理
- 自举效率比BFV/BGV高出一个数量级
我第一次用CKKS做隐私求交后的统计聚合时,发现它给出的结果和明文结果误差在10^-5级别。这个精度对于统计报表完全够用,但如果是计算利息这种敏感场景,就得掂量掂量了。
个人经验:CKKS的参数选择核心是缩放因子(Scaling Factor)。我一般习惯设到2^40左右,既能保证精度,又不至于让密文膨胀太厉害。你如果要做深度学习推理,可以适当提高到2^50,但代价是性能下降20%-30%。
5. 方案对比与选型指南
你想想看,四个方案摆在面前,怎么选?我直接给你一张对比表,照着看就行:
| 维度 | Gentry | BFV | BGV | CKKS |
|---|---|---|---|---|
| 基础构造 | 理想格 | RLWE | RLWE | RLWE |
| 明文类型 | 整数 | 整数 | 整数 | 近似实数 |
| 运算模式 | 精确 | 精确 | 精确 | 近似 |
| 噪声控制 | 自举 | 模数切换 | 层级控制 | 重缩放 |
| 性能 | 最慢 | 中等 | 中上 | 较快 |
| 典型应用 | 学术理论 | 隐私数据库查询 | 复杂电路计算 | 机器学习推理 |
我个人更常用的方案组合是:BFV做整数聚合,CKKS做浮点模型。碰到深度超过10层的电路,才会切到BGV。至于Gentry?嗯,我只在讲公开课的时候拿出来当历史背景讲。
6. 本章知识图谱
下面这张图把四个方案的关系和特性串了起来,你可以把它当作选型时的速查地图:
7. 写在最后
选方案这件事,没有银弹。我自己的习惯是:先确定你要算的东西是整数还是实数,再看你的电路深度,最后才挑工具。这篇文章里提到的四个方案,你只要掌握了它们的“脾气”,就能在项目里做出更聪明的选择。
再次提醒:别试图用BFV跑深度学习,也别用CKKS做精确的金融账户计算。每个方案都有自己的舒适区,跨区作业,代价很大。