virtualsecureplatform/TFHEpp

GitHub: virtualsecureplatform/TFHEpp

TFHEpp 是一个纯 C++ 编写的高性能 TFHE 全同态加密库,提供 Circuit Bootstrapping、Programmable Bootstrapping 等先进特性,适用于密码学研究与隐私计算应用开发。

Stars: 103 | Forks: 21

[![Test](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/6d70ecc8fa125944.svg)](https://github.com/virtuasecureplatform/TFHEpp/actions/workflows/test.yml) # TFHEpp TFHEpp 是一个从头编写的纯 C++ 版本的 TFHE。TFHEpp 比最初的 [TFHE 实现](https://github.com/tfhe/tfhe)略快(约 10%)。除此之外,TFHEpp 还支持 [Circuit Bootstrapping](https://eprint.iacr.org/2018/421)、[Programable Boootstrapping many LUT](https://eprint.iacr.org/2021/729)、Partial Key([Klemsa's version](https://eprint.iacr.org/2021/634)、[Zama's version](https://eprint.iacr.org/2023/979),在代码中命名为 subset key)、[Modified Chen's Packing](https://eprint.iacr.org/2024/1318)(我们在代码中称之为 annihilate key switching)、[mean compensation in rounding noises](https://eprint.iacr.org/2025/809) 以及支持 128-bit Torus 的 [Double Decomposition](https://eprint.iacr.org/2023/771)(双变量多项式表示)。 我们还包含了 B/FV 的部分支持,编写在 include/bfv++.hpp 中。对于 Modified Chen's Packing 的实现,我们也使用了 [dividing TRLWE at each recursion](https://eprint.iacr.org/2025/1088) 的思想,尽管我是独立开发该想法的。 TFHEpp 依赖于 AVX2,因为我们使用了 SPQLIOS FMA。如果你想在不支持 AVX2 的情况下运行 TFHEpp,请参阅 spqlios++ 分支。它包含一个作为 header-only 库的纯 C++ SPQLIOS 实现,但它很慢。 # 支持的编译器 此代码包含 UTF-8 标识符(如 α)、使用了 `extern template` 和 std::make_unique_for_overwrite。因此,主要支持的编译器为 GCC11 或更高版本以及 Clang16 或更高版本。 # 参数 默认参数(128bit.hpp)具有 128 位的安全性。请添加 -DUSE_80BIT_SECURITY=ON 以使用更快但安全性较低的参数。 具有 128 位安全性的最快参数是 concrete.hpp。请添加 -DUSE_CONCRETE=ON 以使用更快的参数。 如果你需要自己的参数,请修改 include/params/ 下的文件或添加你自己的 hpp,并更改 include/param.hpp 中的宏定义。 ## 三元密钥 (Ternary Key) 正如你在 include/params 下的文件中所见,我们在 lvl1 或更高级别的参数中使用了三元密钥。 # FFTW3 支持 某些不支持 AVX2 的环境无法使用 spqlios。作为 spqlios 的替代,TFHEpp 可以使用 fftw3。 要使用 fftw3,请安装 `libfftw3-dev` 并将 `-DUSE_FFTW3=ON` 添加到编译选项中。 # 第三方库 thirdparties 目录下的代码包含第三方库:Randen、BLAKE3、Cereal 和 SPQLIOS。请查看相应的目录以检查许可证。 ## Randen 以前的(直到 release tags 中的 Version 9)TFHEpp 将其用作密码学安全伪随机数生成器 (CSPRNG)。原始仓库在[这里](https://github.com/google/randen)。 我只是删除了一些不必要的代码,没有进行修改。 现已弃用。要使用它,请显式设置 `-DUSE_BLAKE3=OFF -DUSE_RANDEN=ON`。 ## BLAKE3 这是使用其扩展输出函数 (XOF) 模式的另一个 CSPRNG 实现。因为 Randen 不是经过同行评审的算法,而且 BLAKE3 现在比 RANDEN 稍快,我们现在将其用作默认的 CSPRNG。 仅供参考,CRYSTAL-Kyber 使用 SHA-3 的 XOF 作为 CSPRNG 生成器。我们目前没有实现它,因为它很慢。 Microsoft SEAL 将 BLAKE2 实现为支持的 CSPRNG 之一。 ## Cereal cereal 是一个 header-only 的 C++11 序列化库。TFHEpp 使用它来导出密文和密钥。Cereal 通过 git submodule 进行管理。 ## SPQLIOS SPQLIOS 是专用于环 R\[X\]/(X^N+1)(N 为 2 的幂)的使用 AVX2 的 FFT 库。这些代码来自 [experimental-tfhe](https://github.com/tfhe/experimental-tfhe/tree/master/circuit-bootstrapping/src/spqlios)。我们只是重命名了实例以适应我们的代码。 ## SPQLIOS-AVX512 这是在 [MOSFHET](https://github.com/antoniocgj/MOSFHET) 中开发的 SPQLIOS 的 AVX512 版本。我确认在 Intel i5-11400 和 AMD Ryzen 7700X 上这比 SPQLIOS 更快。 ## SPQlios-Arithmetic [SPQlios Arithmetic](https://github.com/tfhe/spqlios-arithmetic) 似乎是 SPQLIOS 的继任者。目前仅支持 FFT。 ## FFTW3 [FFTW](https://www.fftw.org/) 是最著名的 FFT 库之一。 **注意**:分发依赖于 FFTW3 的二进制文件意味着你同意 GPLv3 或更高版本。 ## MKL Intel MKL 是 Intel 提供的库,包含用于 FFT 的 FFTW 兼容接口。 我们假设通过[此过程](https://www.intel.com/content/www/us/en/developer/articles/guide/installing-free-libraries-and-python-apt-repo.html)安装 MKL,并且已经运行了 `source /opt/intel/mkl/bin/mklvars.sh`。 将 `-DUSE_MKL` 添加到 CMake 选项以使用 MKL ### FFTW3 API 要使用此功能,你还必须添加 `-DUSE_FFTW3`。 ### 原生 API 作为 FFTW3 API 的替代,我还添加了 native API 版本。如果在指定 `-DUSE_MKL` 的同时未指定 `-DUSE_FFTW3`,则将启用此功能。 ## concrete-fft concrete-fft 是由 Zama.ai 开发的纯 Rust FFT 库。可以通过 `-DUSE_CONCRETE_FFT` 启用此功能。 ## spqliox_aarch64 spqliox_aarch64 是从 SPQLIOS fork 出来的用于 aarch64 的 FFT 库。 这比 FFTW3 稍快(平均 1ms)。 该库需要 [xbyak_aarch64](https://github.com/fujitsu/xbyak_aarch64),并且 要使用此库,请将 `-DUSE_SPQLIOX_AARCH64=on` 添加到 CMake 选项中。
| FFTW3 | spqliox_aarch64 | | :------: | :-------------: | | 15.801ms | 14.368ms |
## HEXL [HEXL](https://github.com/intel/hexl.git) 是针对 AVX512 优化的 NTT 库。 要使用此库,请将 `-DUSE_HEXL=on` 添加到 CMake 选项中。 # 速度测试 以下代码用于测量在你的计算机上 TFHEpp 执行同态 NAND 操作所需的时间。 ``` git clone https://github.com/virtualsecureplatform/TFHEpp cd TFHEpp mkdir build cd build cmake .. -DENABLE_TEST=ON make ulimit -s unlimited ./test/nand ``` 如果你想在原始 TFHE 上运行语义等效的测试,请运行以下代码。 ``` git clone https://github.com/tfhe/tfhe.git --recursive cd tfhe mkdir build cd build cmake ../src -DENABLE_TESTS=on -DENABLE_NAYUKI_PORTABLE=off -DENABLE_NAYUKI_AVX=off -DENABLE_SPQLIOS_AVX=off -DENABLE_SPQLIOS_FMA=on -DCMAKE_BUILD_TYPE=optim make ./test/test-gate-bootstrapping-spqlios-fma ``` 如果你的系统上安装了 Docker,这将在 docker 上执行上述操作。 ``` git clone https://github.com/virtualsecureplatform/TFHEpp cd TFHEpp docker build -t tfheppbench . ``` 这是针对 TFHE-10ms 的。因为 TFHE-10ms 仅支持 80 位安全参数,所以这不包含在 Dockerfile 中 ``` git clone https://github.com/virtualsecureplatform/tfhe-10ms.git --recursive cd tfhe-10ms mkdir build cd build cmake ../src -DENABLE_TESTS=on -DENABLE_NAYUKI_PORTABLE=off -DENABLE_NAYUKI_AVX=off -DENABLE_SPQLIOS_AVX=off -DENABLE_SPQLIOS_FMA=on -DCMAKE_BUILD_TYPE=optim make ./test/test-bootstrapping-fft-spqlios-fma ``` # 与 tfhe-rs 的比较 可以使用 完全相同的参数(`DEFAULT_PARAMETERS`,132 位安全性,boolean API)直接针对 [tfhe-rs](https://github.com/zama-ai/tfhe-rs) 对 TFHEpp 进行基准测试。 ## 参数集 双方使用完全相同的参数: | 参数 | 值 | 描述 | |:---:|:---:|:---| | `n` | 805 | LWE 维度 | | `k` | 3 | GLWE 维度 | | `N` | 512 | 多项式大小 | | `pbs_level` | 2 | PBS 分解级别 | | `pbs_base_log` | 10 | PBS 分解对数基数 | | `ks_level` | 5 | 密钥切换分解级别 | | `ks_base_log` | 3 | 密钥切换分解对数基数 | 在 TFHEpp 端,使用 `-DUSE_TFHE_RS=ON` 启用这些设置。 基准测试的操作是一个布尔 NAND 门(线性组合 + PBS + 密钥切换)。 双方均单线程运行(tfhe-rs Rayon 池通过 `ThreadPoolBuilder` 绑定到 1 个线程)。 ## 结果 在 Ubuntu 24.04 上使用 `taskset -c 0` 测量,单线程。 在 AMD Ryzen 9 9950X3D 上,核心 0 属于带有 3D V-Cache (96 MB L3) 的 CCD。 将基准测试固定到 V-Cache 核心可获得最佳且最稳定的结果。 **CPU**: AMD Ryzen 9 9950X3D 16 核处理器 (最大 5752 MHz) | 阶段 | TFHEpp | tfhe-rs | |:---:|:---:|:---:| | **Blind Rotate (BR)** | **4.50 ms** | 5.06 ms | | **Identity Key Switch (IKS)** | 0.51 ms | **0.32 ms** | | **NAND gate (端到端)** | 5.99 ms | **5.82 ms** | TFHEpp 的 BR 比 tfhe-rs 快约 11%。 IKS 阶段是造成端到端差异的主要原因(tfhe-rs 快约 1.6 倍)。 ## 本地复现 ``` git clone --recurse-submodules https://github.com/virtualsecureplatform/TFHEpp cd TFHEpp mkdir build && cd build cmake .. -DUSE_TFHE_RS=ON -DENABLE_TEST=ON make -j$(nproc) pbs_tfhers taskset -c 0 ./test/pbs_tfhers ``` ### Apptainer 需要 Apptainer 和互联网访问权限以下载 tfhe-rs 并拉取 Ubuntu 24.04 镜像。 ``` git clone --recurse-submodules https://github.com/virtualsecureplatform/TFHEpp cd TFHEpp apptainer build compare-tfhers.sif compare-tfhers.def taskset -c 0 apptainer run compare-tfhers.sif ``` ## CI 比较会在每次推送时通过 [`.github/workflows/compare-tfhers.yml`](.github/workflows/compare-tfhers.yml) 使用 Ubuntu 24.04 容器自动运行。 # 理论 这是幻灯片(日文)。 https://nindanaoto.github.io/ # 引用 对于想直接引用此库的人(可能除了 [VSP paper](https://www.usenix.org/conference/usenixsecurity21/presentation/matsuoka) 之外),我在下面给出了 bibtex 引用示例。 ``` @misc{TFHEpp, author = {Kotaro Matsuoka}, title = {{TFHEpp: pure C++ implementation of TFHE cryptosystem}}, year = {2020}, howpublished = {\url{https://github.com/virtualsecureplatform/TFHEpp}} } ```
标签:AVX2, Bash脚本, BFV, C++, FHE, meg, TFHE, 信息安全, 全同态加密, 加密算法, 可编程自举, 后量子密码学, 密码学库, 开源库, 搜索引擎爬虫, 数学库, 数据擦除, 格密码学, 电路自举, 隐私计算, 高性能计算