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(())
}

这个示例展示了:

  1. 布尔值的加密和逻辑运算(AND, OR, NOT)
  2. 整数(U8)的加密和算术运算(加法,乘法)
  3. 整数比较操作
  4. 结果的解密和验证

要运行此代码,同样使用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);
}

性能优化建议

  1. 批量处理:尽可能批量处理加密数据
  2. 参数选择:根据安全性和性能需求调整参数
  3. 并行计算:利用Rust的并行特性加速计算

应用场景

  1. 隐私保护的数据分析
  2. 安全多方计算
  3. 加密数据库查询
  4. 机器学习模型的安全推断

注意事项

  1. TFHE计算开销较大,适合小规模数据或对隐私要求极高的场景
  2. 密钥管理是关键,需要安全存储客户端密钥
  3. 不同版本的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));
}

这个完整示例演示了:

  1. 如何配置和初始化TFHE
  2. 基本的整数加密运算(加法和乘法)
  3. 布尔运算(AND和OR)
  4. 条件选择操作
回到顶部