全同态加密方案: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的核心优势:

  1. 直接支持实数(复数的编码)
  2. 运算结果保留近似精度,适合神经网络推理
  3. 自举效率比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. 本章知识图谱

下面这张图把四个方案的关系和特性串了起来,你可以把它当作选型时的速查地图:

全同态加密方案知识图谱 Gentry方案(理想格) 自举(Bootstrapping) BFV方案(RLWE整数) BGV方案(RLWE整数) CKKS方案(近似实数) BFV应用场景 隐私数据库查询 整数聚合统计 安全多方计算 CKKS应用场景 机器学习推理 隐私统计报表 近似搜索/聚类 性能排序:Gentry 最慢 → BFV 中等 → BGV 中上 → CKKS 最快

7. 写在最后

选方案这件事,没有银弹。我自己的习惯是:先确定你要算的东西是整数还是实数,再看你的电路深度,最后才挑工具。这篇文章里提到的四个方案,你只要掌握了它们的“脾气”,就能在项目里做出更聪明的选择。

再次提醒:别试图用BFV跑深度学习,也别用CKKS做精确的金融账户计算。每个方案都有自己的舒适区,跨区作业,代价很大。