全同态加密库

主要全同态密码库的性能测试

Chuck Chen
 · 
分类: [密码学]

TFHE-rs

TFHE-rs作为TFHE的继承者,是开发非常活跃的一个全同态密码库。

TFHE-rs的构建系统由Makefile定义,所有可用的benchmark包括:

$ grep -o -e '^bench_[^(web)]\w\+' Makefile
bench_integer
bench_signed_integer
bench_integer_gpu
bench_signed_integer_gpu
bench_integer_hpu
bench_integer_compression
bench_integer_compression_gpu
bench_integer_compression_128b_gpu
bench_integer_zk_gpu
bench_integer_aes_gpu
bench_integer_aes256_gpu
bench_integer_multi_bit
bench_signed_integer_multi_bit
bench_integer_multi_bit_gpu
bench_signed_integer_multi_bit_gpu
bench_integer_zk
bench_shortint
bench_shortint_oprf
bench_ks
bench_ks_gpu
bench_pbs
bench_pbs_gpu
bench_ks_pbs
bench_ks_pbs_gpu
bench_pbs128
bench_pbs128_gpu
bench_hlapi
bench_hlapi_gpu
bench_hlapi_hpu
bench_hlapi_erc20
bench_hlapi_erc20_gpu
bench_hlapi_erc20_gpu_classical
bench_hlapi_dex
bench_hlapi_dex_gpu
bench_hlapi_dex_gpu_classical
bench_hlapi_erc20_hpu
bench_tfhe_zk_pok
bench_hlapi_noise_squash
bench_hlapi_noise_squash_gpu
bench_custom
bench_fft
bench_ntt

上面包含gpuhpu的benchmark需要启用CUDA和HPU支持。如果没有相应的机器可用,也可以从官方的CI任务中查看相关的数据,如benchmark_cpubenchmark_gpubenchmark_hpu

或者运行单个benchmark:

cargo bench --no-default-features \
  --features=boolean,shortint,integer,internal-keycache,zk-pok,pbs-stats \
  -p tfhe-benchmark \
  --bench boolean
cargo bench --no-default-features \
  --features=boolean,shortint,integer,internal-keycache,zk-pok,pbs-stats \
  -p tfhe-benchmark \
  --bench integer
cargo bench --no-default-features \
  --features=boolean,shortint,integer,internal-keycache,zk-pok,pbs-stats \
  -p tfhe-benchmark \
  --bench shortint

--bench后可用的benchmark参见./tfhe-benchmark/Cargo.toml中的bench字段定义的列表。

需要注意的是,8位的shortint支持无限次密文操作,但需要先生成大的密钥文件,运行后可能占用超过15GB磁盘空间。

TFHE-rs支持Nvidia的GPU作为执行后端之一。默认情况下,需要启用gpu特性。编译期将包含GPU后端代码,在链接期从/usr/local/cuda/lib64查找CUDA运行时库。

cargo bench --no-default-features \
  --features=integer,gpu,internal-keycache,pbs-stats \
  -p tfhe-benchmark \
  --profile release_lto_off \
  --bench integer
为什么关闭LTO(链接期优化)?

LTO确实能改善性能,但启用LTO会极大增加rustc的编译时间和内存占用。一般仅推荐构建最终发布版本才启用LTO。 通过启用release_lto_off配置,可以关闭LTO,但会牺牲一些性能。

OpenFHE

配置构建目录:

cmake -S . -B build -DBUILD_BENCHMARKS=ON -DHAVE_POSIX_REGEX=1

编译Release版本:

cmake --build build --config Release

编译完成后,进入build目录,运行性能测试程序:

cd build
bin/benchmark/bfv-mult-method-benchmark

Microsoft SEAL

如果没有CMake,根据官方网站下载安装CMake

配置构建,CMake自动下载缺少的依赖:

mkdir build
cmake -B build -DSEAL_BUILD_BENCH=ON -S .

编译项目和性能测试程序:

cmake --build build

编译完成后,进入build目录,运行性能测试程序:

cd build
bin/seal_bench

Lattigo

运行所有测试:

go test -bench=. ./...

排除默认的测试,只运行benchmark,且防止测试超时:

go test -run=^$ -bench=. -benchmem -timeout=0s ./...

Swift Homomorphic Encryption

苹果官方开源的Swift Homomorphic Encryption实现了BFV同态密码算法。编译运行需要Swift环境,安装参见官方文档

项目通过Swift Package Manager管理依赖。但package-benchmark依赖需要事先安装jemalloc,可以通过系统软件包管理器或Homebrew安装。通过设置BENCHMARK_DISABLE_JEMALLOC=1环境变量也可以仅用jemalloc,但可能对最终的性能测试有影响。

可以直接运行测试:

# RlweBenchmark
SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1 \
  swift package -c release benchmark --target RlweBenchmark
# PolyBenchmark
SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1 \
  swift package -c release benchmark --target PolyBenchmark
# PIRBenchmark
SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1 \
  swift package -c release benchmark --target PIRBenchmark
# PNNSBenchmark
SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1 \
  swift package -c release benchmark --target PNNSBenchmark

通过-c release使用发布配置编译,能避免默认的调试编译带来的性能损失。

如果遇到问题,也可以通过swift package clean清理构建目录,或swift package reset重置目录。然后尝试自行构建。

SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1 swift build -c release --product RlweBenchmark

编译通过后,直接运行

.build/arm64-apple-macosx/release/RlweBenchmark