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