SEAL库 - 安装和介绍
本篇文章介绍:SEAL同态库的安装和简单使用
注:使用Clang++编译的Microsoft Seal比使用GNUG++编译的Microsoft Seal具有更好的运行时性能。
1、 cmake:适应于Windows、MACOS、linux
2、 vcpkg:适应于Windows、MACOS、linux
3、 homebrew:适用于MACOS
4、 pkg:适用于FreeBSD
5、 NuGet Package:用于.NET开发(安卓),适用于Windows, Linux, macOS, Android, iOS
liunx/MacOS上安装
1、 下载
git clone https://github.com/microsoft/SEAL
2、 构建
cd SEAL
cmake -S . -B build
cmake --build build
sudo cmake --install build
构建完成后,可以在build/lib/和build/bin/目录中找到输出二进制文件。
可以指定各种配置选项并将其传递给CMake构建系统。下面的“基本CMake选项”和“高级CMake选项”部分对这些选项进行了说明。
当需要对example、tests进行测试时,由于,默认是关闭的,所以需要打开:
在根目录下运行:
cmake -S . -B build -DSEAL_BUILD_EXAMPLES=ON
cmake -S . -B build -DSEAL_BUILD_TESTS=ON
cmake -S . -B build -DSEAL_ROOT=~/mylibs
cmake --build build
生成的二进制文件在 build/bin下
Windows上安装
在Windows上,上述相同的脚本使用Ninja或“Visual Studio 16 2019”生成器在Visual Studio的开发人员命令提示符下工作。
注:Ninja 是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度,总结就是和cmake的作用是一样的。
Visual Studio 16 2019”生成器
1、 根据打开的vs2019命令行工具依次输入命令:
2、如果打开的是x64,那么:
cd SEAL
cmake -S . -B build -G "Visual Studio 16 2019" -A x64
cmake --build build --config Release
cmake --install build
如果打开的是x86,那么:
cd SEAL
cmake -S . -B build -G "Visual Studio 16 2019" -A Win32
cmake --build build --config Release
cmake --install build
这一步完成后的结果如图所示:
3、安装完成后我们进入/SEAL/native/example目录下,编译样例example:
以x64为例:
cmake -S . -B build -G "Visual Studio 16 2019" -A x64
cmake --build build --config Release
cmake --install build
这样example代码就编译构建编译完成,生成可执行文件(.exe)sealexamples
4、运行sealexamples
在这里我们可以看到seal有不同的工作模式,对应不同的模式有对应的样例和过程演示
依赖库
Intel HEXL
Intel HEXL是一个库,提供同态加密中常见的加密原语的高效实现。在采用“英特尔AVX512-IFMA52”指令集的英特尔处理器上,这种加速尤其明显。
Microsoft GSL
Microsoft GSL(Guidelines Support Library)是一个仅标头的库,它实现了GSL::span:一种视图类型,提供对内存的安全(边界检查)数组访问。
例如,如果Microsoft GSL可用,Microsoft SEAL可以允许BatchEncoder和CKKSEncoder从GSL::span而不是std::vector进行编码和解码,这在某些情况下具有显著的性能优势。
ZLIB and Zstandard
ZLIB和Zstandard是广泛使用的压缩库。Microsoft SEAL可以选择使用这些库来对数据进行压缩序列化。
人们可能会问,当密文和密钥数据与随机数据无法区分时,压缩有何帮助?在Microsoft SEAL中,Ciphertext对象由指定的大素数作为模数(coeff_modulus)的整数组成。特别是在使用CKKS方案时,这些素数可能非常小(例如,30位),但数据仍然序列化为64位整数。因此,几乎一半的密文字节是零,这并不常见,而应用通用压缩算法能消除这种浪费空间。BFV方案从该技术中获得的好处通常较少,因为用于coeff_modulus加密参数的素数往往更大,而对这些素数进行模化的整数填充每个64位字的更多。压缩序列化可以应用于任何可序列化的Microsoft SEAL对象,而不仅仅是密文和密钥。
如果Microsoft SEAL使用ZLIB或Zstandard支持编译,则压缩将自动用于序列化;参考Serialization::compr_mode_default在native/src/seal/serialization.h。但是,始终可以显式地将compr_mode_type::none传递给序列化方法以禁用压缩。如果同时启用了ZLIB和Zstandard支持,那么Zstandard将默认使用,因为它的性能要好得多。
注释:一个SecretKey的压缩率能透露出密钥的信息,在大多数情况下,密钥的大小不会透露给不可信的第三方,如果这是个问题,可以以未压缩的形式保存SecretKey。
examples
native/examples/该文件夹下给出了7个例子(C++),C#编写的在 dotnet/examples/下
1_bfv_basics.cpp
BFV方案的加密模块
2_encoders.cpp
将更复杂的数据编码到Microsoft SEAL纯文本对象中
3_levels.cpp
介绍了levels的概念;使用CKKS方案的先决条件
4_ckks_basics.cpp
使用CKKS方案的加密实数算法
5_rotation.cpp
在BFV和CKKS方案中对加密向量执行循环旋转(cyclic rotations)
6_serialization.cpp
该例子介绍在Microsoft SEAL中序列化对象!
具体来说,给出了用在外包计算,传递密文和密钥时能优化数据大小,以用户端和服务端传递消息为例,服务端选择加密参数,客户端生成密钥,服务端进行进行加密计算,客户端解密。
7_performance.cpp
性能测试
基于CKKS的EVA
EVA:是一个基于python编写的编译工具,为python开发者提供了很好的平台。它优化了Microsoft SEAL的计算,选择适当的加密参数,并为加密输入、执行计算和解密结果提供了方便的Python API,EVA可在GitHub获得。
注:EVA仅支持CKKS方案,目前还没有支持BFV计划的计划。