AI同态加密配置怎么落地:从环境准备到密文推理验证
AI同态加密配置不是打开某个开关,而是选一套加密库和参数、把模型输入和权重编码成密文、在密文上完成计算,再用明文结果做对照验证。
适合的场景是推理阶段需要对敏感数据做保护,且模型以线性运算或多项式近似为主;
如果模型包含大量非线性算子,直接全同态加密的代价会很高,需要先做算子替换或分层加密。
先确定加密范围和参数集
同态加密分部分同态和全同态,AI 推理里常见做法是对输入特征和模型权重使用支持加法和乘法的方案。
以 CKKS 为例,它适合浮点数向量计算,但结果是近似值,需要预留精度余量。
配置前先确认三件事:
- 参与计算的层是否只有矩阵乘、加法和激活函数近似;
- 输入向量维度是否固定,是否需要对变长输入做填充;
- 可接受的精度误差和单次推理耗时上限。
参数集不要照抄网上示例,poly_modulus_degree 和 coeff_mod_bit_sizes 决定了安全等级和乘法深度。
新手可以先从库自带的默认参数开始,再根据实际层数调整。
安装与最小可运行环境
以下步骤以 Linux 服务器上的 Python 环境为例,使用 TenSEAL 做演示。
先确认 Python 版本和虚拟环境:
python3 --version
python3 -m venv he-env
source he-env/bin/activate
pip install tenseal numpy
安装完成后用一段最小代码验证库能正常创建上下文并完成一次密文加法:
import tenseal as ts
ctx = ts.context(
ts.SCHEME_TYPE.CKKS,
poly_modulus_degree=8192,
coeff_mod_bit_sizes=[60, 40, 40, 60]
)
ctx.generate_galois_keys()
ctx.global_scale = 2**40
v1 = ts.ckks_vector(ctx, [1.0, 2.0, 3.0])
v2 = ts.ckks_vector(ctx, [0.5, 0.5, 0.5])
result = (v1 + v2).decrypt()
print(result)
预期输出接近 [1.5, 2.5, 3.5]。
如果报错提示参数不合法,先检查 coeff_mod_bit_sizes 长度与 poly_modulus_degree 是否匹配。
把模型输入和权重转成密文
实际推理时,通常把用户输入加密后传到服务端,服务端在密文上做线性层计算。
下面是一个简化示例,重点看数据流,不是完整模型:
import numpy as np
import tenseal as ts
# 客户端:加密输入
ctx = ts.context(ts.SCHEME_TYPE.CKKS, 8192, coeff_mod_bit_sizes=[60, 40, 40, 60])
ctx.global_scale = 2**40
ctx.generate_galois_keys()
x = np.array([0.2, 0.7, 1.1, 0.4], dtype=np.float64)
enc_x = ts.ckks_vector(ctx, x)
# 服务端:密文与明文权重做线性组合(权重不加密)
w = np.array([0.5, -0.3, 0.8, 0.1], dtype=np.float64)
enc_y = enc_x.dot(w)
# 客户端:解密
y = enc_y.decrypt()
print(y)
如果权重也需要保护,可以把权重单独编码成密文向量,但密文与密文相乘会增加乘法深度,需要同步调整参数。先跑通输入加密、权重明文的路径,再逐步增加加密范围,排错会容易很多。
配置中最容易踩的三个坑
第一,精度不够却先怀疑库有问题。
CKKS 的结果是近似值,global_scale 太小或乘法层数过多都会让误差放大。
验证时用同一组输入分别跑明文和密文,记录最大绝对误差,而不是只看单个输出。
第二,参数集和乘法深度不匹配。
密文乘法会消耗模数链,层数超过参数允许的深度时,结果会明显失真或直接报错。
调整时优先增加 coeff_mod_bit_sizes 的层级,同时注意安全等级要求。
第三,把同态加密当成传输加密。
同态加密保护的是计算过程中的数据,传输层仍然需要 TLS,密钥管理也要单独做。
客户端和服务端的上下文参数必须一致,否则解密会失败。
验证密文推理是否可用
配置完成后至少做三项检查:
- 用固定随机种子生成 100 组输入,比较明文输出和密文输出的误差分布,确认误差在业务允许范围内;
- 记录单次密文推理耗时和内存占用,与明文推理对比,判断是否需要减少加密层数或改用更轻量的方案;
- 检查密钥文件权限,确保私钥只留在客户端,服务端不保存可解密私钥。
只有误差和性能都落在可接受区间,才算完成一次可用的 AI 同态加密配置。
如果误差持续偏大,先回退到单层线性计算做对照,再逐层增加,定位是哪一层放大了误差。