Zama TFHE-rs v1.0 发布

news2025/3/12 23:41:57

1. 引言

2025年2月,Zama 发布了 TFHE-rs v1.0,这是 TFHE-rs 库的第一个稳定版本。这标志着一个重要的里程碑,稳定了 x86 CPU 后端的高级 API,同时确保了向后兼容性。——即,现在可以依赖 TFHE-rs API,而不必担心未来更新中出现重大变化。

此版本中最显著的改进是:

  • 关键参数的细化,这增强了密码学安全性,保留了性能并优化了它们以用于分布式协议。
  • 还引入了官方手册和简化的贡献流程。

值得注意的是,计算错误的概率已降至 2 − 128 2^{ -128} 2128 以下,同时保持了性能。从实际角度来看,这意味着发生错误的可能性与破坏现代密码学标准一样微不足道。

2. TFHE-rs 手册第一版

随着 TFHE-rs v1.0 的发布,Zama 发布了其TFHE-rs 手册的第一版,详细介绍了后端的所有实现。

TFHE-rs 手册涵盖:

  • 底层算法,包括引导等低级操作;
  • 实现同态整数级别运算的方法和算法,特别是针对 FheUint 和 FheInt;
  • 关键功能的实现细节,如压缩;
  • 深入的技术基准,以供进一步分析。

另一个重要点是,与文档不同,该手册重点关注高斯噪声分布​​,与学术文献中使用的标准定义一致。

3. 细化密码学参数,以实现最高安全级别

此版本的一个核心增强功能是密码学参数的改进,将计算错误的概率从小于 2 − 64 2^{-64} 264 降低到小于 2 − 128 2^{ -128} 2128

尽管密码学参数通常对用户隐藏,但它们对于 TFHE-rs 来说至关重要,可确保计算的安全性、效率和正确性。

直到最近,TFHE-rs 的标准参数集才保证了计算正确性,错误概率低于 2 − 64 2^{ -64} 264 ——对于传统的client-server用例来说,几乎可以忽略不计。然而,最近的研究表明,在加密和解密数据都可能被访问的情况下,某些理论上的攻击可能会出现。虽然以前的参数集在计算上仍然不可行 ——平均需要 2 63 2^{63} 263 次计算才能成功——但此更新进一步增强了对此类可能性的安全性。

Zama 设计了 ​​TFHE-rs,为所有应用程序提供最高级别的安全性。借助 TFHE-rs v1.0,密码学参数已得到改进,可将计算错误概率降低到 2 − 128 2^{ -128} 2128 以下,符合标准密码学安全级别并确保稳健性——即使在分布式协议中也是如此。

通常,将故障概率从 2 − 64 2^{-64} 264 降低到 2 − 128 2^{ -128} 2128 至少会使计算时间增加一倍。然而,TFHE-rs 通过实施一种称为drift mitigation漂移缓解的新技术将减速限制在 10% 左右(详情见2024年论文《Drifting Towards Better Error Probabilities in Fully Homomorphic Encryption Schemes》)。

由于 TFHE-rs 是 Zama 区块链协议的支柱,开发人员可以使用 FHE 编写机密智能合约。此新版本旨在更好地支持分布式协议(其中私钥和公钥生成可能由多个用户共享),TFHE-rs v1.0 现在默认使用 TUniform 噪声分布——Uniform 的这种变体避免了高斯分布施加的约束。

对于喜欢传统方法的用户,基于高斯分布的密码学参数仍然可用。

TFHE-rs 文档提供了有关选择密码学参数和理解不同分布的全面指导,详情参见Zama->FHE Computation->Core workflow->Parameters。

为了获得更深入的技术见解,使用新参数集执行的基准测试(包括整数运算和引导等低级操作的基准测试)也可在Zama->Get Started->Benchmarks->CPU Benchmarks->Integer文档中获取。

4. 一个实际的例子

下面是如何在client-server设置中使用 TFHE-rs 的简单演示。

为了使这个例子简单明了,有意省略了一些高级功能,比如公钥加密及其相关的零知识证明——这些功能通常用于分布式环境中,让用户共享一个通用加密密钥并验证密文是否正确形成。

此示例重点关注核心工作流程,模拟客户端和服务器之间的交互:

  • 1)客户端加密:客户端使用其私钥加密数据并将密文发送给服务器。
  • 2)服务器端计算:服务器在不访问明文的情况下处理加密数据。如果需要,它可以压缩数据进行存储,稍后再解压以进行进一步的同态运算。
  • 3)客户端解密:计算完成后,服务器将加密结果返回给客户端,客户端解密得到最终输出。
use tfhe::prelude::*;
use tfhe::shortint::parameters::{COMP_PARAM_MESSAGE_2_CARRY_2, PARAM_MESSAGE_2_CARRY_2};
use tfhe::{
    set_server_key, CompressedCiphertextListBuilder, FheAsciiString, FheBool, FheInt64, FheUint16,
    FheUint2, FheUint32,
};

fn main() {
    // Use aliases for ease of use, do not use aliases for production (not stable through time)
    let config = tfhe::ConfigBuilder::with_custom_parameters(PARAM_MESSAGE_2_CARRY_2)
        .enable_compression(COMP_PARAM_MESSAGE_2_CARRY_2)
        .build();

    // On the client side, generate the ClientKey, must remain SECRET
    let client_key = tfhe::ClientKey::generate(config);
    // Also generate the ServerKey which will allow the server to perform computations, this one is
    // sent to the server
    let server_key = tfhe::ServerKey::new(&client_key);

    // Encrypt some values required by service provider
    let ct1 = FheUint32::encrypt(17_u32, &client_key);
    let ct2 = FheInt64::encrypt(-1i64, &client_key);
    let ct3 = FheBool::encrypt(false, &client_key);
    let ct4 = FheUint2::encrypt(3u8, &client_key);
    let ct5 = FheAsciiString::encrypt("1.0!", &client_key);

    // On the server side, once the server key has been received, set it as the active key
    set_server_key(server_key);

    // The server does some computations without seeing the data
    let ct1_res = ct1 + 25;
    let ct2_res = 43 + ct2;
    let ct3_res = ct3 & true;
    let ct4_res = ct4 - 1;
    let ct5_res = ct5.len().into_ciphertext();

    // We can compress the data to send or store smaller amounts of data to the client
    let compressed_list = CompressedCiphertextListBuilder::new()
        .push(ct1_res)
        .push(ct2_res)
        .push(ct3_res)
        .push(ct4_res)
        .push(ct5_res)
        .build()
        .unwrap();

    // On the client side after receiving the compressed data
    let a: FheUint32 = compressed_list.get(0).unwrap().unwrap();
    let b: FheInt64 = compressed_list.get(1).unwrap().unwrap();
    let c: FheBool = compressed_list.get(2).unwrap().unwrap();
    let d: FheUint2 = compressed_list.get(3).unwrap().unwrap();
    let e: FheUint16 = compressed_list.get(4).unwrap().unwrap();

    let a: u32 = a.decrypt(&client_key);
    assert_eq!(a, 42);
    let b: i64 = b.decrypt(&client_key);
    assert_eq!(b, 42);
    let c = c.decrypt(&client_key);
    assert!(!c);
    let d: u8 = d.decrypt(&client_key);
    assert_eq!(d, 2);
    let e: u16 = e.decrypt(&client_key);
    assert_eq!(e, 4);

    // The compressed data can be reused by the server if it kept it on disk
    let recovered_a: FheUint32 = compressed_list.get(0).unwrap().unwrap();

    let new_a = recovered_a << 4u32;

    // The result can be sent uncompressed to the Client, which can also decrypt this new result
    let new_a: u32 = new_a.decrypt(&client_key);
    assert_eq!(new_a, a << 4);
}

5. 为 TFHE-rs 做贡献

在 Zama,成为一家开源密码公司不仅仅是一项要求,更是其积极拥抱的理念。开放性推动着创新、协作以及Zama技术的持续改进。

TFHE-rs 正是基于这一理念而建立的,主要通过两种方式欢迎贡献:

  • 1)通过 Zama 赏金计划为 TFHE-rs 做出贡献:推进 FHE,一次应对一个挑战
    Zama 赏金计划奖励开发人员解决推动 TFHE-rs 发展的技术挑战。每个季度都会开放一个新的 TFHE-rs 赏金计划,参与者的解决方案通常会为库带来有意义的改进。
    最近的一个例子是同态字符串功能,它最初是作为赏金贡献而来的,后来被整合到主存储库中。得益于这一新增功能,用户现在可以运行以下代码来检查子字符串是否包含在另一个字符串中:
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"?
    let does_not_contain = string.contains(&search_string);

    // Does our initial string contain "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);
}

Zama->FHE Computation->Types->Strings文档中可以找到此新功能的优势的详细比较。
其他几项赏金驱动的贡献也被整合到 TFHE-rs 中,包括同态 SHA-256:

  • SHA-256 示例(整数表示)

  • SHA-256 示例(布尔表示)
    赏金计划下一季即将开启!关注官方赏金计划仓库Zama Bounty Program参与。

  • 2)直接为 TFHE-rs 做出贡献:构建、改进和创新
    引入了简化的贡献流程,让开发者和研究人员能够更轻松地为 TFHE-rs 添加新功能和改进。无论是构建应用程序还是试验新颖的原型,都可以按照以下步骤将相应工作集成到库中:

    • fork存储库并创建一个新的分支;
    • 使你的代码与现有约定保持一致并提交你的更改;
    • 运行测试套件来验证正确性;
    • rebase到主分支的最新版本并打开拉取请求。

    一旦被接受,该贡献将会随着时间的推移而得到维护,就像库中的任何其他功能一样。

6. TFHE-rs 的未来规划

展望未来,TFHE-rs 将朝着两个主要目标发展:

  • 1)以用户为中心的功能——通过引入简化更广泛受众使用的功能,使 FHE 更加直观、更易于访问;
  • 2)性能和硬件支持——集成最先进的优化来改进同态计算。重点是扩展 GPU 后端,它已经是 TFHE-rs 的一部分,现在有望达到 x86 CPU 后端的稳定性和生产就绪状态。

参考资料

[1] 2025年2月27日博客 TFHE-rs v1.0: Stable CPU Backend

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

几种常见的虚拟环境工具(Virtualenv、Conda、System Interpreter、Pipenv、Poetry)的区别和特点总结

在 PyCharm 中创建虚拟环境是一个非常直接的过程&#xff0c;可以帮助你管理项目依赖&#xff0c;确保不同项目之间的依赖不会冲突。 通过 PyCharm 创建虚拟环境 打开 PyCharm 并选择或创建一个项目。 打开项目设置&#xff1a; 在 Windows/Linux 上&#xff0c;可以通过点击…

Ubuntu安装问题汇总

参考文章&#xff1a; 【Ubuntu常用快捷键总结】 【王道Python常用软件安装指引】 1. 无法连接虚拟设备 sat0:0 【问题】&#xff1a;出现下图所示弹框。 【问题解决】&#xff1a; 点击 “否” 。 点击左上角的 “虚拟机” → “设置…” → “CD/DVD (SATA)” &#xff0c;…

Ceph(1):分布式存储技术简介

1 分布式存储技术简介 1.1 分布式存储系统的特性 &#xff08;1&#xff09;可扩展 分布式存储系统可以扩展到几百台甚至几千台的集群规模&#xff0c;而且随着集群规模的增长&#xff0c;系统整体性能表现为线性增长。分布式存储的水平扩展有以下几个特性&#xff1a; 节点…

从0开始的操作系统手搓教程43——实现一个简单的shell

目录 添加 read 系统调用&#xff0c;获取键盘输入 :sys_read putchar和clear 上班&#xff1a;实现一个简单的shell 测试上电 我们下面来实现一个简单的shell 添加 read 系统调用&#xff0c;获取键盘输入 :sys_read /* Read count bytes from the file pointed to by fi…

【Spring】基础/体系结构/核心模块

概述&#xff1a; Spring 是另一个主流的 Java Web 开发框架&#xff0c;该框架是一个轻量级的应用框架。 Spring 是分层的 Java SE/EE full-stack 轻量级开源框架&#xff0c;以 IoC&#xff08;Inverse of Control&#xff0c;控制反转&#xff09;和 AOP&#xff08;Aspect…

01 音视频知识学习(视频)

图像基础概念 ◼像素&#xff1a;像素是一个图片的基本单位&#xff0c;pix是英语单词picture的简写&#xff0c;加上英 语单词“元素element”&#xff0c;就得到了“pixel”&#xff0c;简称px&#xff0c;所以“像素”有“图像元素” 之意。 ◼ 分辨率&#xff1a;是指图像…

vue3自定义hooks遇到的问题

问题 写了一个输入查询参数和url返回加载中状态、请求方法、接口返回列表的hooks&#xff0c;出现的结果是只有请求方法有效&#xff0c;加载状态无效&#xff0c;接口返回了数据&#xff0c;页面却不显示数据。 代码如下 只展示部分关键代码 import { ref, toRefs, toRef, o…

liunx磁盘挂载和jar启动命令

一、磁盘挂载 查看历史磁盘挂载命令&#xff1a;history | grep mount 查看所有挂载硬盘命令&#xff1a;mount 磁盘挂载命令&#xff1a;mount -t cifs -o usernamesh**,passwordP!ss**** //192.168.1.2/attachmentfilesShare2.2/pdfCert /home/nybzg/cnfai1/pdfCert 二、j…

gbase8s rss集群通信流程

什么是rss RSS是一种将数据从主服务器复制到备服务器的方法 实例级别的复制 (所有启用日志记录功能的数据库) 基于逻辑日志的复制技术&#xff0c;需要传输大量的逻辑日志,数据库需启用日志模式 通过网络持续将数据复制到备节点 如果主服务器发生故障&#xff0c;那么备用服务…

如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统

我在业余时间开发了一款自己的独立产品&#xff1a;升讯威在线客服与营销系统。陆陆续续开发了几年&#xff0c;从一开始的偶有用户尝试&#xff0c;到如今线上环境和私有化部署均有了越来越多的稳定用户。 随时近来 AI 大模型的火热&#xff0c;越来越多的客户&#xff0c;问…

【AI智能体报告】开源AI助手的革命:OpenManus深度使用报告

一、引言&#xff1a;当开源智能体走进生活 2025年3月&#xff0c;MetaGPT团队用一场"开源闪电战"改写了AI Agent的竞争格局。面对商业产品Manus高达10万元的邀请码炒作&#xff0c;他们仅用3小时便推出开源替代品OpenManus&#xff0c;首日即登顶GitHub趋势榜。 …

DeepSeek+Maxkb+Ollama+Docker搭建一个AI问答系统

DeepSeekMaxkbOllamaDocker搭建一个AI问答系统 文章目录 DeepSeekMaxkbOllamaDocker搭建一个AI问答系统前言一、创建同一内网的网络二、拉取两个镜像三、启动Ollama以及调试Maxkb4.Maxkb创建一个应用并建立知识库5、应用效果总结 前言 我觉得只要是使用Docker技术&#xff0c;…

江科大51单片机笔记【12】DS18B20温度传感器(上)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

P8662 [蓝桥杯 2018 省 AB] 全球变暖--DFS

P8662 [蓝桥杯 2018 省 AB] 全球变暖--dfs 题目 解析讲下DFS代码 题目 解析 这道题的思路就是遍历所有岛屿&#xff0c;判断每一块陆地是否会沉没。对于这种图的遍历&#xff0c;我们首先应该想到DFS。 代码的注意思想就是&#xff0c;在主函数中遍历找出所有岛屿&#xff0c…

Vue 侧边栏导航栏 el-menu单个item和多个item

在固钉的下面去写菜单导航栏。 <el-menu class"aside-menu" router :default-active"$route.path" :collapse"isCollapse" background-color"#131b27" text-color"#bfcbd9" active-text-color"#20a0ff" :defau…

Unity Dots从入门到精通之 Prefab引用 转 实体引用

文章目录 前言安装 DOTS 包实体引用Authoring 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世界游戏。 本文讲解我在…

无人机避障——XTDrone中运行VINS-Fusion+Ego-planner进行路径规划

本文聚焦于无人机避障技术领域的经典方案&#xff0c;重点探讨视觉双目VINS-Fusion建图与Ego-planner路径规划的组合应用。通过视觉双目VINS-Fusion实现精准的环境建图与自身定位&#xff0c;结合Ego-planner的高效路径规划能力&#xff0c;使无人机在复杂环境中实现自主避障飞…

【沐渥科技】氮气柜日常如何维护?

氮气柜的维护是确保其长期稳定运行、延长使用寿命和保持环境控制精度的关键。以下是沐渥氮气柜的日常维护和定期保养指南&#xff1a; 一、日常维护 柜体清洁 定期用软布擦拭柜体表面和内部&#xff0c;避免灰尘堆积。避免使用腐蚀性清洁剂&#xff0c;防止损伤密封条或传感器。…

MATLAB 控制系统设计与仿真 - 24

PID 控制器分析- 控制器的形式 连续控制器的结构&#xff1a; 为滤波时间常数&#xff0c;这类PID控制器在MATLAB系统控制工具箱称为并联PID控制器&#xff0c;可由MATLAB提供的pid函数直接输入&#xff0c;格式为&#xff1a; 其他类型的控制器也可以由该函数直接输入&#x…

linux(权限)

sudo 主要用来短暂的提权 权限 就是 >角色目标属性 这里面的角色就是---拥有者----所属组----other 所属组的目的&#xff1f; 更细化的管理 chmod 就是修改权限制 我们要是想要切换到体育的账号&#xff0c;我们可以去看一下有几个账号,我…