virtualsecureplatform/TFHEpp
GitHub: virtualsecureplatform/TFHEpp
TFHEpp 是一个纯 C++ 编写的高性能 TFHE 全同态加密库,提供 Circuit Bootstrapping、Programmable Bootstrapping 等先进特性,适用于密码学研究与隐私计算应用开发。
Stars: 103 | Forks: 21
[](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, 信息安全, 全同态加密, 加密算法, 可编程自举, 后量子密码学, 密码学库, 开源库, 搜索引擎爬虫, 数学库, 数据擦除, 格密码学, 电路自举, 隐私计算, 高性能计算