全同态加密(FHE)深度解析:从理论到工程实践
全同态加密(Fully Homomorphic Encryption, FHE)作为密码学"圣杯",允许在加密数据上直接进行计算,无需解密。下面我将从数学原理到工程实现全面解析FHE技术。
一、核心数学原理
1. 同态加密的基本定义
对于加密函数E和任意函数f,存在函数g使得:
g(E(m)) = E(f(m))
即对密文运算等价于对明文运算后加密。
2. 实现FHE的关键技术
- 理想格密码学(Ideal Lattices):基于格上困难问题(如LWE, RLWE)
- 自举技术(Bootstrapping):消除噪声增长
- 模数切换(Modulus Switching):控制噪声水平
二、实现方案对比
方案 | 提出者 | 数学基础 | 优点 | 缺点 |
---|---|---|---|---|
Gentry09 | Craig Gentry | 理想格 | 首个FHE方案 | 效率极低 |
BGV12 | Brakerski-Gentry-Vaikuntanathan | LWE/RLWE | 层次同态 | 需要自举 |
BFV13 | Fan-Vercauteren | RLWE | 整数运算 | 较大参数 |
CKKS17 | Cheon-Kim-Kim-Song | RLWE | 浮点近似 | 非精确 |
TFHE | Chillotti等 | TLWE | 快速自举 | 仅布尔电路 |
三、BFV方案完整实现
// 基于Microsoft SEAL库的BFV方案实现
#include "seal/seal.h"
using namespace seal;
using namespace std;
void bfv_basics() {
// 参数配置(安全级别:128位)
EncryptionParameters parms(scheme_type::bfv);
size_t poly_modulus_degree = 8192;
parms.set_poly_modulus_degree(poly_modulus_degree);
parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));
parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));
SEALContext context(parms);
KeyGenerator keygen(context);
SecretKey secret_key = keygen.secret_key();
PublicKey public_key;
keygen.create_public_key(public_key);
// 功能密钥
RelinKeys relin_keys;
keygen.create_relin_keys(relin_keys);
GaloisKeys gal_keys;
keygen.create_galois_keys(gal_keys);
// 核心对象
Encryptor encryptor(context, public_key);
Evaluator evaluator(context);
Decryptor decryptor(context, secret_key);
BatchEncoder batch_encoder(context);
// 明文向量
vector<uint64_t> pod_vector = {1, 2, 3, 4, 5, 6, 7, 8};
Plaintext plain_matrix;
batch_encoder.encode(pod_vector, plain_matrix);
// 加密
Ciphertext encrypted_matrix;
encryptor.encrypt(plain_matrix, encrypted_matrix);
// 同态加法
Ciphertext encrypted_sum;
evaluator.add(encrypted_matrix, encrypted_matrix, encrypted_sum);
// 同态标量乘法
Plaintext plain_scalar("3");
Ciphertext encrypted_scaled;
evaluator.multiply_plain(encrypted_matrix, plain_scalar, encrypted_scaled);
// 同态乘法(需重线性化)
Ciphertext encrypted_product;
evaluator.multiply(encrypted_matrix, encrypted_matrix, encrypted_product);
evaluator.relinearize_inplace(encrypted_product, relin_keys);
// 同态旋转(矩阵行移位)
Ciphertext encrypted_rotated;
evaluator.rotate_rows(encrypted_matrix, 1, gal_keys, encrypted_rotated);
// 解密
Plaintext decrypted_matrix;
decryptor.decrypt(encrypted_scaled, decrypted_matrix);
vector<uint64_t> result;
batch_encoder.decode(decrypted_matrix, result);
// 输出结果:[3, 6, 9, 12, 15, 18, 21, 24]
cout << "Scalar multiplication result: ";
for (auto value : result) cout << value << " ";
}
四、CKKS方案实战(浮点数计算)
# 基于Pyfhel的CKKS实现
import numpy as np
from Pyfhel import Pyfhel, PyCtxt
# 初始化环境
HE = Pyfhel()
HE.contextGen(scheme='CKKS', n=2**14, scale=2**30,
qi_sizes=[60, 30, 30, 30, 60]) # 模数链
HE.keyGen() # 密钥生成
HE.relinKeyGen() # 重线性化密钥
HE.rotateKeyGen() # 旋转密钥
# 加密数组
arr1 = np.array([1.1, 2.2, 3.3, 4.4], dtype=np.float64)
arr2 = np.array([0.5, 0.25, 1.0, 2.0], dtype=np.float64)
ctxt1 = HE.encrypt(arr1)
ctxt2 = HE.encrypt(arr2)
# 同态运算
ctxt_sum = ctxt1 + ctxt2 # 加法
ctxt_prod = ctxt1 * ctxt2 # 乘法
ctxt_square = ctxt1**2 # 平方
ctxt_dot = ctxt1 @ ctxt2 # 点积
# 多项式近似:e^x ≈ 1 + x + x^2/2 + x^3/6
def homomorphic_exp(x: PyCtxt, HE: Pyfhel):
result = HE.encrypt(np.ones(x.size))
term = x.copy()
# 泰勒级数展开
for coeff, denom in zip([1, 1, 1], [1, 2, 6]):
result += term * (coeff/denom)
term *= x
HE.rescale_to_next(term) # 模数切换
return result
ctxt_exp = homomorphic_exp(ctxt1, HE)
# 解密结果
dec_sum = HE.decrypt(ctxt_sum)
dec_prod = HE.decrypt(ctxt_prod)
dec_exp = HE.decrypt(ctxt_exp)
print(f"Sum: {dec_sum}") # [1.6, 2.45, 4.3, 6.4]
print(f"Product: {dec_prod}") # [0.55, 0.55, 3.3, 8.8]
print(f"Exp(x): {dec_exp}") # ≈ [3.0, 9.0, 27.2, 81.5]
五、TFHE高效布尔运算
// 基于TFHE-rs库的布尔电路实现
use tfhe::boolean::prelude::*;
fn boolean_fhe() -> Result<(), Box<dyn std::error::Error>> {
// 生成密钥
let (client_key, server_key) = gen_keys();
// 加密布尔值
let true_ct = client_key.encrypt(true)?;
let false_ct = client_key.encrypt(false)?;
let a = client_key.encrypt(false)?;
let b = client_key.encrypt(true)?;
// 同态逻辑门
let and_result = server_key.and(&true_ct, &false_ct)?; // false
let or_result = server_key.or(&a, &b)?; // true
let xor_result = server_key.xor(&a, &b)?; // true
let not_result = server_key.not(&true_ct)?; // false
// 复杂电路:全加器
let carry_in = client_key.encrypt(true)?;
let sum = server_key.xor(&server_key.xor(&a, &b)?, &carry_in)?;
let carry_out = server_key.or(
&server_key.and(&a, &b)?,
&server_key.and(&server_key.xor(&a, &b)?, &carry_in)?,
)?;
// 解密
let sum_val = client_key.decrypt(&sum)?;
let carry_val = client_key.decrypt(&carry_out)?;
println!("Full Adder Result: Sum={sum_val}, Carry={carry_val}");
Ok(())
}
六、自举技术深度解析
自举(Bootstrapping)是FHE的核心技术,用于重置噪声增长:
# 自举伪代码(基于TFHE方案)
def bootstrap(ciphertext, boot_key):
# 1. 模数提升
lifted_ct = modulus_switching(ciphertext)
# 2. 盲旋转
rotated = blind_rotate(lifted_ct, boot_key)
# 3. 提取符号
sign_bit = extract_sign(rotated)
# 4. 测试函数
decrypted = test_function(sign_bit)
# 5. 密钥切换
refreshed_ct = key_switch(decrypted)
return refreshed_ct
实际工程实现(使用TorchFHE):
import torchfhe
class Bootstrapper(torch.nn.Module):
def __init__(self, poly_degree=1024):
super().__init__()
self.poly_degree = poly_degree
self.acc = torchfhe.FFTAccumulator(poly_degree)
self.test_poly = self._gen_test_polynomial()
def _gen_test_polynomial(self):
# 生成自举测试多项式
coeffs = torch.zeros(self.poly_degree)
for i in range(self.poly_degree):
if i % 2 == 0:
coeffs[i] = 1.0 / (2 * math.pi * (i//2))
return coeffs
def forward(self, ct, evk):
# 1. 模数提升
ct_large = torchfhe.mod_raise(ct)
# 2. 盲旋转
rotated = torchfhe.blind_rotate(ct_large, evk)
# 3. 多项式评估
evaluated = self.acc(rotated, self.test_poly)
# 4. 密钥切换
refreshed = torchfhe.key_switch(evaluated, evk)
return refreshed
七、性能优化关键技术
1. GPU加速
// CUDA核函数实现多项式乘法
__global__ void ntt_kernel(uint64_t *data, const uint64_t *twiddles,
size_t n, size_t modulus) {
extern __shared__ uint64_t shared[];
uint64_t tid = threadIdx.x;
uint64_t bid = blockIdx.x;
// 加载数据到共享内存
size_t idx = bid * blockDim.x + tid;
shared[tid] = data[idx];
__syncthreads();
// Cooley-Tukey迭代
for (size_t len = n/2; len >= 1; len /= 2) {
size_t jump = n / (2 * len);
size_t twid_idx = tid % len;
uint64_t w = twiddles[twid_idx * jump];
if (tid < len) {
uint64_t temp = shared[tid + len];
shared[tid + len] =
(shared[tid] + modulus - temp) * w % modulus;
shared[tid] = (shared[tid] + temp) % modulus;
}
__syncthreads();
}
// 写回结果
data[idx] = shared[tid];
}
2. 硬件加速架构
// FPGA上的多项式乘法单元(Verilog)
module polymul #(
parameter MODULUS = 12289,
parameter DEGREE = 1024
)(
input clk, rst,
input [15:0] poly1 [0:DEGREE-1],
input [15:0] poly2 [0:DEGREE-1],
output reg [15:0] result [0:DEGREE-1]
);
genvar i;
generate
for (i = 0; i < DEGREE; i = i+1) begin: ntt_block
butterfly #(.MODULUS(MODULUS)) bfly (
.clk(clk),
.rst(rst),
.a(poly1[i]),
.b(poly2[i]),
.twiddle(twiddle_table[i]),
.out1(butterfly_out[i]),
.out2(butterfly_out[i+DEGREE/2])
);
end
endgenerate
// 流水线控制
always @(posedge clk) begin
if (rst) begin
for (int j = 0; j < DEGREE; j++)
result[j] <= 0;
end else begin
// 多级流水处理
stage1 <= butterfly_out;
stage2 <= ntt_stage2(stage1);
// ...
result <= ifft_output;
end
end
endmodule
八、FHE应用场景与实战
1. 隐私保护机器学习
# 同态加密神经网络推理
import tenseal as ts
import numpy as np
# 创建CKKS上下文
context = ts.context(ts.SCHEME_TYPE.CKKS, 8192, coeff_mod_bit_sizes=[60,40,40,60])
context.global_scale = 2**40
# 加载预训练模型权重
weights = np.load('model_weights.npy')
bias = np.load('model_bias.npy')
# 客户端加密输入
input_data = np.array([0.5, -1.2, 3.4])
enc_input = ts.ckks_vector(context, input_data)
# 服务器同态推理
def homomorphic_predict(enc_x, weights, bias):
# 同态矩阵乘法
enc_result = enc_x.dot(weights)
# 同态偏置加法
enc_result += bias
# 同态激活函数(多项式近似)
enc_output = enc_result.polyval([0, 1, 0.5, 0.15]) # 近似ReLU
return enc_output
enc_output = homomorphic_predict(enc_input, weights, bias)
# 客户端解密结果
output = enc_output.decrypt()
print(f"Prediction: {output}")
2. 安全数据库查询
-- 基于FHE的安全SQL扩展(概念示例)
SELECT FHE_DECRYPT(name) FROM employees
WHERE FHE_COMPARE(salary, FHE_ENCRYPT(100000)) > 0
AND FHE_SEARCH(medical_record, 'diabetes') = 1;
实际实现架构:
+----------+ +---------------+
| | | FHE Database|
| Client | | +-----------+ |
| | | | Query | |
| [FHE |<----->| | Processor | |
| Keys] | | +-----------+ |
+----------+ | | FHE | |
| | Operations| |
| +-----------+ |
+---------------+
|
v
+---------------+
| Encrypted |
| Storage |
+---------------+
九、前沿研究方向
-
量子安全FHE:
- 基于NTRU问题的后量子方案
- 格密码与哈希函数结合
-
高效自举:
- 基于结构化矩阵的自举优化
- FPGA/ASIC专用硬件加速
-
混合密码系统:
-
跨平台优化:
- WASM运行环境:浏览器端FHE
- ARM NEON加速:移动端应用
十、工程实践建议
-
参数选择指南:
安全级别 多项式阶数 模数链长度 明文模数 128-bit 4096 4-5 20-30位 192-bit 8192 6-7 30-40位 256-bit 16384 8-9 40-50位 -
性能优化矩阵:
-
开源生态推荐:
- SEAL (Microsoft):跨平台C++库
- OpenFHE (原PALISADE):多方案支持
- TFHE:快速布尔方案
- Concrete (Zama):Rust实现TFHE
- Lattigo:Go语言方案
全同态加密从理论到实践仍面临巨大挑战,但随着算法改进和硬件加速的发展,已开始在实际隐私保护场景中落地应用。应权衡安全需求与性能成本,选择合适的方案和优化策略。