TFHE-rs v0.11:字符串、更快的零知识证明、GPU 上的加密数组

  • ZamaFHE
  • 发布于 2025-01-15 16:21
  • 阅读 84

TFHE-rs v0.11 版本发布,带来了多项重要改进和新功能,包括Zero Knowledge Proof性能的显著提升,以及通过 FheAsciiString 类型在高级 API 中使用加密字符串的新模块。新版本还引入了 TUniform 噪声分布来代替高斯分布,GPU 性能也得到提升,并支持在 GPU 上轻松执行加密数组的计算。

TFHE-rs v0.11 带来了几个主要的改进和新功能。此版本引入了显著增强的零知识证明性能,以及一个新的加密字符串模块,该模块可以通过 FheAsciiString 类型在高级 API 中使用。此外,默认的密码学参数现在遵循调整后的均匀(TUniform)噪声分布,而不是高斯分布。GPU 性能也得到了改进:与 v0.8 相比,64 位加法速度提高了 30%。最后,现在可以轻松地在 GPU 上对密文数组执行计算。

零知识证明 v2

新的零知识证明构造现在生成和验证证明都更快,如下面的基准测试表中所详述。

你可以按照文档指南在高级 API 中使用零知识证明。

FHE 字符串

此版本的一个亮点是 FHE 字符串模块,它基于 Zama Bounty Program 第 5 季中用户 JoseSK999开源贡献。它也可以通过 FheAsciiString 类型在高级 API 中使用。FHE 字符串支持与 Rust 的 str 类型 相同的 API。你可以在文档中找到有关 FHE 字符串以及如何使用它们的指南。

以下是你可以使用启用整数和字符串功能的新原语执行的操作的预览:

use tfhe::prelude::*;
use tfhe::{generate_keys, set_server_key, ClearString, ConfigBuilder, FheAsciiString};

fn main() {
    let config = ConfigBuilder::default().build();
    let (cks, sks) = generate_keys(config);

    set_server_key(sks);

    // Encrypt without padding, does not hide the string length and has better performance
    // 不使用填充进行加密,不会隐藏字符串长度,并且具有更好的性能
    let string = FheAsciiString::try_encrypt("TFHE-rs rocks!", &cks).unwrap();

    // Encrypt with padding, hide the true length of the string
    // 使用填充进行加密,隐藏字符串的真实长度
    let search_string = FheAsciiString::try_encrypt_with_padding("is meh", 1, &cks).unwrap();

    // We can also use clear strings
    // 我们也可以使用明文字符串
    let clear_search_string = ClearString::new("rocks".to_string());

    // Does our initial string contain "is meh"?
    // 我们的初始字符串是否包含 "is meh"?
    let does_not_contain = string.contains(&search_string);

    // Does our initial string contain "rocks"?
    // 我们的初始字符串是否包含 "rocks"?
    let contains = string.contains(&clear_search_string);

    // Decrypt
    // 解密
    let decrypted_does_not_contain = does_not_contain.decrypt(&cks);
    let decrypted_contains = contains.decrypt(&cks);

    // Check all worked properly
    // 检查所有操作是否正常
    assert!(!decrypted_does_not_contain);
    assert!(decrypted_contains);
}

我们预计大多数字符串处理主要包括比较和包含操作,以下是 hpc7a.96xlarge AWS 机器上的当前基准测试:

在 GPU 上对加密数组进行计算

TFHE-rs v0.11 在 GPU 上引入了用于加密数据的 n 维数组(或张量)。支持的操作与 CPU 上的操作相同,包括向量之间的比较和在加密数据向量中搜索。

以下示例显示了如何在 GPU 上使用数组类型:它显示了如何从两个 4x4 矩阵中提取大小为 2x2 的子矩阵,执行加法,然后将一个明文矩阵添加到先前的结果中。你可以在文档中找到有关如何使用同态数组的更多详细信息。

use tfhe::{ConfigBuilder, set_server_key, CpuFheUint32Array, ClearArray, ClientKey, CompressedServerKey};
use tfhe::array::GpuFheUint32Array;
use tfhe::prelude::*;

fn main() {
    let config = ConfigBuilder::default().build();
    let cks = ClientKey::generate(config);
    let compressed_server_key = CompressedServerKey::new(&cks);

    let gpu_key = compressed_server_key.decompress_to_gpu();

    set_server_key(gpu_key);

    let num_elems = 4 * 4;
    let clear_xs = (0..num_elems as u32).collect::<Vec<_>>();
    let clear_ys = vec![1u32; num_elems];

    // Encrypted 2D array with values
    // 具有以下值的加密 2D 数组
    // [[  0,  1,  2,  3]\
    //  [  4,  5,  6,  7]\
    //  [  8,  9, 10, 11]\
    //  [ 12, 13, 14, 15]]
    // and shape 4x4
    // 形状为 4x4
    let xs = GpuFheUint32Array::try_encrypt((clear_xs.as_slice(), vec![4, 4]), &cks).unwrap();
    // Encrypted 2D array with values
    // 具有以下值的加密 2D 数组
    // [[  1,  1,  1,  1]\
    //  [  1,  1,  1,  1]\
    //  [  1,  1,  1,  1]\
    //  [  1,  1,  1,  1]]
    // and shape 4x4
    // 形状为 4x4
    let ys = GpuFheUint32Array::try_encrypt((clear_ys.as_slice(), vec![4, 4]), &cks).unwrap();

    assert_eq!(xs.num_dim(), 2);
    assert_eq!(xs.shape(), &[4, 4]);
    assert_eq!(ys.num_dim(), 2);
    assert_eq!(ys.shape(), &[4, 4]);

    // Take a sub slice
    // 获取一个子切片
    //  [[ 10, 11]\
    //   [ 14, 15]]
    let xss = xs.slice(&[2..4, 2..4]);
    // Take a sub slice
    // 获取一个子切片
    //  [[  1,  1]\
    //   [  1,  1]]
    let yss = ys.slice(&[2..4, 2..4]);

    assert_eq!(xss.num_dim(), 2);
    assert_eq!(xss.shape(), &[2, 2]);
    assert_eq!(yss.num_dim(), 2);
    assert_eq!(yss.shape(), &[2, 2]);

    let r = &xss + &yss;

    // Result is
    // 结果是
    //  [[ 11, 12]\
    //   [ 15, 16]]
    let result: Vec = r.decrypt(&cks);
    assert_eq!(result, vec![11, 12, 15, 16]);

    // Clear 2D array with values
    // 具有以下值的明文 2D 数组
    //  [[  10,  20]\
    //   [  30,  40]]
    let clear_array = ClearArray::new(vec![10u32, 20u32, 30u32, 40u32], vec![2, 2]);
}

改进的 GPU 性能

此版本带来了 GPU 后端的性能改进。64 位加法速度比 v0.8 快 30%。下图 1 显示了 64 位加法和乘法的 CPU 和 GPU 上的当前性能。

每个操作的最佳 GPU 数量因操作本身和用户指定的整数精度而异。文档中提供了跨所有指定精度的单 GPU 和多 GPU 的综合基准测试结果数组。

其他功能和改进

TFHE-rs v0.11 引入了其他几个功能或改进,包括:

  • 新的 GPU 操作:支持同态有符号整数的绝对值和除法。
  • 更快的 CPU 操作:CPU 上的加密移位/旋转现在快 28%。
  • 参数更新:所有默认的密码学参数都已更新为使用一种新的噪声分布,称为 TUniform。这种分布的主要优点是有界,而通常的高斯分布则不是。在某些实际情况下,这可以简化同态计算的使用。该数学定义可以在此文档中找到。
  • 代码稳定性: 此版本侧重于提高整体代码稳定性。发行说明中提供了新颖性的完整列表。

TFHE-rs 的下一个版本将继续提高性能、功能和稳定性!请继续关注即将到来的更新!

附加链接

  • 原文链接: zama.ai/post/tfhe-rs-v0-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ZamaFHE
ZamaFHE
Zama是一家开源密码学公司,专注于为区块链和人工智能构建最先进的完全同态加密(FHE)解决方案。