同态加密联邦学习
同态加密(Homomorphic Encryption, HE)允许在密文上直接进行计算,是联邦学习隐私保护的核心密码学工具。
同态加密分类
| 类型 | 支持运算 | 性能 | 代表方案 |
|---|---|---|---|
| 半同态 (PHE) | 加法 | 快 | Paillier |
| 某种同态 (SHE) | 加法+有限乘法 | 中 | BFV |
| 全同态 (FHE) | 加法+乘法(无限) | 慢 | CKKS, TFHE |
Paillier 加法同态
联邦学习中最常用的半同态加密:
python
from phe import paillier
class PaillierFedAvg:
def __init__(self, public_key, private_key):
self.pub_key = public_key
self.priv_key = private_key
def client_encrypt(self, model_update):
"""客户端加密模型更新"""
encrypted = []
for param in model_update:
# 将浮点数放大为整数后加密
scaled = int(param * 1e6)
encrypted.append(self.pub_key.encrypt(scaled))
return encrypted
def server_aggregate(self, encrypted_updates, num_clients):
"""服务端在密文上聚合(无需解密)"""
aggregated = []
for params in zip(*encrypted_updates):
# 同态加法:E(a) × E(b) = E(a+b)
sum_enc = params[0]
for enc in params[1:]:
sum_enc = sum_enc + enc # 同态加法
aggregated.append(sum_enc)
return aggregated
def server_decrypt(self, aggregated, num_clients):
"""服务端解密聚合结果"""
result = []
for enc_val in aggregated:
decrypted = self.priv_key.decrypt(enc_val)
result.append(decrypted / (num_clients * 1e6))
return resultCKKS 方案
CKKS 支持近似计算,适合神经网络的浮点运算:
python
# 使用 TenSEAL 库
import tenseal as ts
context = ts.context(
ts.SCHEME_TYPE.CKKS,
poly_modulus_degree=8192,
coeff_mod_bit_sizes=[60, 40, 40, 60]
)
context.global_scale = 2**40
# 加密向量
vec = [1.0, 2.0, 3.0]
enc_vec = ts.ckks_vector(context, vec)
# 同态加法
enc_sum = enc_vec + enc_vec # E(v + v)
# 同态乘法
enc_product = enc_vec * enc_vec # E(v * v)
# 解密
result = enc_sum.decrypt()性能对比
| 操作 | 明文 | Paillier | CKKS |
|---|---|---|---|
| 加密 1M 参数 | - | 30s | 5s |
| 同态加法 | 0.001s | 2s | 0.5s |
| 同态乘法 | 0.001s | 不支持 | 3s |
| 解密 1M 参数 | - | 10s | 2s |
HE 选型建议
- 仅需聚合(加法):Paillier 足够
- 需要乘法(如模型推理):CKKS
- 大规模参数:先压缩/量化再加密
- 延迟敏感:考虑 GPU 加速 HE 运算
计算开销
同态加密的计算开销比明文高 100-10000 倍。对于大模型(参数量 > 1B),直接 HE 聚合不可行。必须结合梯度压缩、量化或子采样来减少加密数据量。