TFHE-rs v0.11 版本发布,带来了多项重要改进和新功能,包括Zero Knowledge Proof性能的显著提升,以及通过 FheAsciiString 类型在高级 API 中使用加密字符串的新模块。新版本还引入了 TUniform 噪声分布来代替高斯分布,GPU 性能也得到提升,并支持在 GPU 上轻松执行加密数组的计算。
/
2025年1月14日
-
Jean-Baptiste Orfila、Arthur Meyre、Agnes Leroy
TFHE-rs v0.11 带来了几个主要的改进和新功能。此版本引入了显著增强的零知识证明性能,以及一个新的加密字符串模块,该模块可以通过 FheAsciiString
类型在高级 API 中使用。此外,默认的密码学参数现在遵循调整后的均匀(TUniform)噪声分布,而不是高斯分布。GPU 性能也得到了改进:与 v0.8 相比,64 位加法速度提高了 30%。最后,现在可以轻松地在 GPU 上对密文数组执行计算。
新的零知识证明构造现在生成和验证证明都更快,如下面的基准测试表中所详述。
你可以按照文档指南在高级 API 中使用零知识证明。
此版本的一个亮点是 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 机器上的当前基准测试:
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 后端的性能改进。64 位加法速度比 v0.8 快 30%。下图 1 显示了 64 位加法和乘法的 CPU 和 GPU 上的当前性能。
每个操作的最佳 GPU 数量因操作本身和用户指定的整数精度而异。文档中提供了跨所有指定精度的单 GPU 和多 GPU 的综合基准测试结果数组。
TFHE-rs v0.11 引入了其他几个功能或改进,包括:
TFHE-rs 的下一个版本将继续提高性能、功能和稳定性!请继续关注即将到来的更新!
未找到任何项目。
Concrete ↗ Concrete ML ↗ FHEVM ↗ TFHE-rs ↗
博客 文档 ↗ GITHUB ↗ FHE 资源 ↗ 研究论文 ↗ Bounty Program ↗ FHE 状态操作系统
与专家交谈 联系我们 X Discord Telegram 所有社区频道
在电子时代,隐私对于一个开放的社会是必要的。隐私不是秘密。私事是不想让全世界知道的事情,而秘密是不想让任何人知道的事情。隐私是有选择地向世界展示自己的能力。如果两方有某种交易,那么每一方都会记住他们的互动。每一方都可以谈论他们自己对这件事的记忆;谁能阻止它呢?人们可以通过法律来禁止它,但言论自由,甚至比隐私更重要,对一个开放的社会至关重要;我们不寻求限制任何言论。如果许多方在同一个论坛中一起发言,那么每一方都可以对所有其他人说话,并将关于个人和其他方的知识汇总在一起。电子通信的力量使这种群体言论成为可能,而且它不会仅仅因为我们可能希望它消失而消失。既然我们渴望隐私,我们必须确保交易的每一方只了解直接为该交易所必需的信息。因为任何信息都可以被谈论,我们必须确保我们尽可能少地透露。在大多数情况下,个人身份并不重要。当我在商店购买一本杂志并把现金交给店员时,没有必要知道我是谁。当我要求我的电子邮件供应商发送和接收信息时,我的供应商不需要知道我在和谁说话,我在说什么,或者别人在跟我说什么;我的供应商只需要知道如何将信息发送到那里,以及我欠他们多少费用。当我的身份被交易的底层机制所揭示时,我就没有隐私了。我不能在这里有选择地展示自己;我必须始终展示自己。因此,开放社会中的隐私需要匿名交易系统。到目前为止,现金一直是主要的这种系统。匿名交易系统不是秘密交易系统。匿名系统使个人能够在需要时以及仅在需要时透露他们的身份;这是隐私的本质。开放社会中的隐私也需要密码学。如果我说了一些话,我希望只有我打算让其听到的人才能听到。如果我的言论内容对全世界开放,我就没有隐私。加密是为了表明对隐私的渴望,而用弱密码学加密是为了表明对隐私的渴望不太强烈。此外,当默认设置为匿名时,为了有保证地揭示自己的身份,需要密码签名。我们不能期望政府、公司或其他大型的、没有面孔的组织出于他们的恩惠而给予我们隐私。谈论我们对他们有利,我们应该期望他们会说。试图阻止他们的言论是与信息的现实作斗争。信息不仅仅是想自由,它渴望自由。信息会膨胀以填满可用的存储空间。信息是谣言更年轻、更强大的表弟;信息比谣言更快捷,有更多的眼睛,知道更多,比谣言理解得更少。如果我们希望拥有任何隐私,我们必须捍卫我们自己的隐私。我们必须走到一起,创建允许进行匿名交易的系统。几个世纪以来,人们一直在用耳语、黑暗、信封、关着的门、秘密握手和信使来捍卫他们自己的隐私。过去的技术不允许强大的隐私,但电子技术可以。我们密码朋克致力于构建匿名系统。我们正在用密码学、匿名邮件转发系统、数字签名和电子货币来捍卫我们的隐私。密码朋克编写代码。我们知道必须有人编写软件来捍卫隐私,而且因为如果我们都这样做,否则我们无法获得隐私,所以我们将编写它。我们发布我们的代码,以便我们的密码朋克同伴可以练习和玩耍。我们的代码是免费供所有人使用的,在全球范围内。我们不太关心你是否批准我们编写的软件。我们知道软件无法被销毁,而且一个广泛分散的系统无法被关闭。密码朋克谴责对密码学的监管,因为加密本质上是一种私人行为。事实上,加密行为将信息从公共领域移除。即使是反对密码学的法律也只能达到一个国家的边界和它的暴力手臂。密码学将不可避免地遍布全球,随之而来的是它所实现的匿名交易系统。为了使隐私得到广泛传播,它必须成为社会契约的一部分。人们必须走到一起,为了共同利益部署这些系统。隐私的范围只延伸到一个人在社会中的同伴的合作程度。我们密码朋克寻求你的问题和你的担忧,并希望我们可以与你交流,以便我们不欺骗自己。然而,我们不会因为有人可能不同意我们的目标而改变我们的方向。密码朋克正在积极参与使网络对隐私更安全。让我们一起快速前进。前进。Eric Hughes。1993年3月9日。
- 原文链接: zama.ai/post/tfhe-rs-v0-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!