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

  • ZamaFHE
  • 发布于 2025-01-15 23:54
  • 阅读 146

TFHE-rs v0.11 版本发布,主要带来了以下更新: 1. 零知识证明性能显著提升;2. 引入了基于 FheAsciiString 类型的新加密字符串模块;3. 默认加密参数现在遵循调整后的均匀噪声分布;4. GPU 性能提升,64 位加法运算速度提高 30%;5. 可以在 GPU 上轻松执行加密数组的计算。同时,该版本还改进了 GPU 性能,并修复了一些bug。

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

零知识证明 v2

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

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

FHE 字符串

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

以下是你可以使用启用 integer 和 strings 功能的新原语执行的操作的预览:

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
    // 我们也可以使用 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);
}

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

在 GPU 上计算加密数组

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

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

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
    // 值为
    // [[  0,  1,  2,  3]\
    //  [  4,  5,  6,  7]\
    //  [  8,  9, 10, 11]\
    //  [ 12, 13, 14, 15]]
    // and shape 4x4
    // 形状为 4x4 的加密 2D 数组
    let xs = GpuFheUint32Array::try_encrypt((clear_xs.as_slice(), vec![4, 4]), &cks).unwrap();
    // Encrypted 2D array with values
    // 值为
    // [[  1,  1,  1,  1]\
    //  [  1,  1,  1,  1]\
    //  [  1,  1,  1,  1]\
    //  [  1,  1,  1,  1]]
    // and shape 4x4
    // 形状为 4x4 的加密 2D 数组
    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
    // 值为
    //  [[  10,  20]\
    //   [  30,  40]]
    // 的 Clear 2D 数组
    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)解决方案。