Rust全同态加密库TFHE的使用,TFHE实现高性能安全计算与隐私保护
Rust全同态加密库TFHE的使用,TFHE实现高性能安全计算与隐私保护
关于TFHE-rs
TFHE-rs 是一个纯Rust实现的TFHE库,用于在加密数据上进行布尔和整数算术运算。
它包含:
- Rust API
- C API
- 以及 客户端WASM API
TFHE-rs是为开发人员和研究人员设计的,他们希望完全控制使用TFHE能做什么,同时不必担心底层实现。目标是拥有一个稳定、简单、高性能且可用于生产的库,包含TFHE的所有高级功能。
主要特性
- 低级加密库,实现了Zama的TFHE变体,包括可编程引导
- 原始TFHE布尔API的实现,可以作为其他TFHE库的直接替代品
- 短整数API,支持精确、无限制的FHE整数运算,消息空间可达8位
- 大小高效的公钥加密
- 密文和服务器密钥压缩,用于高效数据传输
- 完整的Rust API、C绑定到Rust高级API,以及使用WASM的客户端Javascript API
快速开始
Cargo.toml配置
要在项目中使用最新版本的TFHE-rs
,首先需要在Cargo.toml
中添加依赖:
tfhe = { version = "*", features = ["boolean", "shortint", "integer"] }
注意:需要使用Rust版本 >= 1.84来编译TFHE-rs。
简单示例
以下是完整示例:
use tfhe::prelude::*;
use tfhe::{generate_keys, set_server_key, ConfigBuilder, FheUint32, FheUint8};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 使用同态整数的基础配置
let config = ConfigBuilder::default().build();
// 密钥生成
let (client_key, server_keys) = generate_keys(config);
let clear_a = 1344u32;
let clear_b = 5u32;
let clear_c = 7u8;
// 使用(私有的)client_key加密输入数据
// FheUint32: u32的加密等效
let mut encrypted_a = FheUint32::try_encrypt(clear_a, &client_key)?;
let encrypted_b = FheUint32::try_encrypt(clear_b, &client_key)?;
// FheUint8: u8的加密等效
let encrypted_c = FheUint8::try_encrypt(clear_c, &client_key)?;
// 服务器端:
set_server_key(server_keys);
// 明文等效计算: 1344 * 5 = 6720
let encrypted_res_mul = &encrypted_a * &encrypted_b;
// 明文等效计算: 6720 >> 5 = 210
encrypted_a = &encrypted_res_mul >> &encrypted_b;
// 明文等效计算: let casted_a = a as u8;
let casted_a: FheUint8 = encrypted_a.cast_into();
// 明文等效计算: min(210, 7) = 7
let encrypted_res_min = &casted_a.min(&encrypted_c);
// 明文和加密数据之间的操作:
// 明文等效计算: 7 & 1 = 1
let encrypted_res = encrypted_res_min & 1_u8;
// 客户端解密:
let clear_res: u8 = encrypted_res.decrypt(&client_key);
assert_eq!(clear_res, 1_u8);
Ok(())
}
要运行此代码,使用以下命令:
cargo run --release
注意:当运行使用TFHE-rs
的代码时,强烈建议使用cargo的--release
标志以释放模式运行,以获得最佳性能。
完整示例代码
基于上述内容,这里是一个更完整的TFHE-rs使用示例,展示了布尔和整数运算:
use tfhe::prelude::*;
use tfhe::{generate_keys, set_server_key, ConfigBuilder, FheBool, FheUint8};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 配置
let config = ConfigBuilder::default().build();
// 生成密钥
let (client_key, server_keys) = generate_keys(config);
// 加密布尔值
let true_val = FheBool::encrypt(true, &client_key);
let false_val = FheBool::encrypt(false, &client_key);
// 加密整数
let a = FheUint8::encrypt(5u8, &client_key);
let b = FheUint8::encrypt(3u8, &client_key);
// 设置服务器密钥
set_server_key(server_keys);
// 布尔运算
let and_result = &true_val & &false_val;
let or_result = &true_val | &false_val;
let not_result = !&true_val;
// 整数运算
let sum = &a + &b;
let product = &a * &b;
let comparison = &a.gt(&b);
// 解密结果
let decrypted_and: bool = and_result.decrypt(&client_key);
let decrypted_sum: u8 = sum.decrypt(&client_key);
let decrypted_comp: bool = comparison.decrypt(&client_key);
println!("True AND False: {}", decrypted_and); // false
println!("5 + 3: {}", decrypted_sum); // 8
println!("5 > 3: {}", decrypted_comp); // true
Ok(())
}
这个示例展示了:
- 布尔值的加密和逻辑运算(AND, OR, NOT)
- 整数(U8)的加密和算术运算(加法,乘法)
- 整数比较操作
- 结果的解密和验证
要运行此代码,同样使用cargo run --release
命令。
1 回复
Rust全同态加密库TFHE的使用指南
TFHE简介
TFHE (Fast Fully Homomorphic Encryption over the Torus) 是一个基于环面的快速全同态加密库,允许在加密数据上直接进行计算而无需解密。Rust实现的TFHE库提供了高性能的安全计算能力,特别适合需要隐私保护的场景。
安装方法
在Cargo.toml中添加依赖:
[dependencies]
tfhe = "0.4"
基本使用方法
1. 密钥生成
use tfhe::{ConfigBuilder, generate_keys, set_server_key, FheUint8};
fn main() {
// 配置参数
let config = ConfigBuilder::all_disabled()
.enable_default_integers()
.build();
// 生成客户端密钥和服务端密钥
let (client_key, server_key) = generate_keys(config);
// 设置服务端密钥(必须在同态操作前调用)
set_server_key(server_key);
}
2. 加密与解密
use tfhe::{FheUint8, generate_keys, set_server_key, ConfigBuilder};
fn main() {
let config = ConfigBuilder::all_disabled()
.enable_default_integers()
.build();
let (client_key, server_key) = generate_keys(config);
set_server_key(server_key);
// 加密数据
let clear_a = 27u8;
let clear_b = 128u8;
let a = FheUint8::encrypt(clear_a, &client_key);
let b = FheUint8::encrypt(clear_b, &client_key);
// 同态计算
let result = a + b;
// 解密结果
let decrypted_result: u8 = result.decrypt(&client_key);
println!("{} + {} = {}", clear_a, clear_b, decrypted_result);
}
3. 布尔运算
use tfhe::{FheBool, generate_keys, set_server_key, ConfigBuilder};
fn main() {
let config = ConfigBuilder::all_disabled()
.enable_default_bool()
.build();
let (client_key, server_key) = generate_keys(config);
set_server_key(server_key);
let a = FheBool::encrypt(true, &client_key);
let b = FheBool::encrypt(false, &client_key);
// 同态布尔运算
let result = a & b;
let decrypted_result = result.decrypt(&client_key);
println!("true AND false = {}", decrypted_result);
}
高级功能
1. 自定义参数配置
use tfhe::{ConfigBuilder, generate_keys, set_server_key, FheUint16};
fn main() {
let config = ConfigBuilder::all_disabled()
.enable_custom_integers(
tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS,
None,
)
.build();
let (client_key, server_key) = generate_keys(config);
set_server_key(server_key);
let a = FheUint16::try_encrypt(30000u16, &client_key).unwrap();
let b = FheUint16::try_encrypt(20000u16, &client_key).unwrap();
let result = a + b;
let decrypted: u16 = result.decrypt(&client_key);
println!("30000 + 20000 = {}", decrypted);
}
2. 条件分支
use tfhe::{FheUint8, generate_keys, set_server_key, ConfigBuilder};
fn main() {
let config = ConfigBuilder::all_disabled()
.enable_default_integers()
.build();
let (client_key, server_key) = generate_keys(config);
set_server_key(server_key);
let a = FheUint8::encrypt(10u8, &client_key);
let b = FheUint8::encrypt(20u8, &client_key);
let condition = FheBool::encrypt(true, &client_key);
// 同态条件选择
let result = condition.if_then_else(&a, &b);
let decrypted: u8 = result.decrypt(&client_key);
println!("Condition was true, so result is {}", decrypted);
}
性能优化建议
- 批量处理:尽可能批量处理加密数据
- 参数选择:根据安全性和性能需求调整参数
- 并行计算:利用Rust的并行特性加速计算
应用场景
- 隐私保护的数据分析
- 安全多方计算
- 加密数据库查询
- 机器学习模型的安全推断
注意事项
- TFHE计算开销较大,适合小规模数据或对隐私要求极高的场景
- 密钥管理是关键,需要安全存储客户端密钥
- 不同版本的TFHE可能参数不兼容
完整示例代码
// 完整示例:使用TFHE进行加密计算
use tfhe::{ConfigBuilder, generate_keys, set_server_key, FheUint8, FheBool};
fn main() {
// 配置参数 - 启用默认整数和布尔支持
let config = ConfigBuilder::all_disabled()
.enable_default_integers()
.enable_default_bool()
.build();
// 生成密钥对
let (client_key, server_key) = generate_keys(config);
// 必须在同态操作前设置服务端密钥
set_server_key(server_key);
// 示例1: 整数加密计算
let num1 = FheUint8::encrypt(42u8, &client_key);
let num2 = FheUint8::encrypt(10u8, &client_key);
let sum = &num1 + &num2;
let product = &num1 * &num2;
println!("解密结果:");
println!("42 + 10 = {}", sum.decrypt(&client_key));
println!("42 * 10 = {}", product.decrypt(&client_key));
// 示例2: 布尔运算
let flag1 = FheBool::encrypt(true, &client_key);
let flag2 = FheBool::encrypt(false, &client_key);
let and_result = &flag1 & &flag2;
let or_result = &flag1 | &flag2;
println!("布尔运算结果:");
println!("true AND false = {}", and_result.decrypt(&client_key));
println!("true OR false = {}", or_result.decrypt(&client_key));
// 示例3: 条件选择
let small = FheUint8::encrypt(5u8, &client_key);
let large = FheUint8::encrypt(50u8, &client_key);
let condition = FheBool::encrypt(true, &client_key);
let selected = condition.if_then_else(&small, &large);
println!("条件选择结果:");
println!("条件为true时选择: {}", selected.decrypt(&client_key));
}
这个完整示例演示了:
- 如何配置和初始化TFHE
- 基本的整数加密运算(加法和乘法)
- 布尔运算(AND和OR)
- 条件选择操作