一篇了解Microsoft SEAL

目录

引言

核心概念

同态加密

微软SEAL

入门

可选依赖项

示例

使用EVA进行CKKS编程

手动构建Microsoft SEAL

构建C++组件

要求

构建微软SEAL

安装微软SEAL

在Windows上构建和安装(不做重点介绍)

为Android和iOS构建(不做重点介绍)

为WebAssembly构建(不做重点介绍)

基本CMake选项

高级CMake选项

通过CMake链接微软SEAL

示例、测试和Benchmarks


微软SEAL是一个易于使用的开源(MIT许可)同态加密库,由微软的加密与隐私研究小组开发。微软SEAL采用现代标准C++编写,易于在多种不同环境中编译和运行。有关微软SEAL项目的更多信息,请参见sealcrypto.org

本文档适用于微软SEAL版本4.1。使用该库的早期版本的用户应查看更改列表(list of changes)。

BGV方案(BGV scheme)现已在微软SEAL中可用。实现细节在本文(this paper)中描述。我们非常感谢阿里巴巴Gemini实验室为开发BGV方案并将其集成到微软SEAL中所做的大量努力。同时,我们感谢隐私技术研究、英特尔实验室的持续测试和问题报告。

从版本3.7.2开始,微软SEAL将在main、master和contrib分支中推送新更改,而不创建新版本。我们采用这种方法来合并社区贡献并及时解决问题。这些分支将领先于最新版本的分支/标签。当有重要的错误修复或新功能时,将创建新版本。

CKKS的EVA编译器可在GitHub.com/Microsoft/EVA上找到。有关更多信息,请参见下面的EVA编程。

CKKS加密的SEAL-Embedded可在Github.com/Microsoft/SEAL-Embedded上找到。

非对称PSI的APSI库可在Github.com/Microsoft/APSI上找到。

引言

核心概念

大多数加密方案包含三个功能:密钥生成、加密和解密。对称密钥加密方案在加密和解密时使用相同的密钥;公钥加密方案分别使用公钥进行加密,使用私钥进行解密。因此,公钥加密方案允许任何知道公钥的人加密数据,但只有知道私钥的人才能解密并读取数据。对称密钥加密可以高效地加密大量数据,并实现安全的外包云存储(secure outsourced cloud storage)。公钥加密是当今安全在线通信的基本概念,但通常效率远低于对称密钥加密。

虽然传统的对称和公钥加密可以用于安全存储和通信,但任何外包计算都必然要求在计算前去除这些加密层。因此,提供外包计算功能的云服务必须能够访问密钥,并实施访问策略以防止未经授权的员工获取这些密钥。

同态加密

同态加密指的是允许云在不解密数据的情况下直接对加密数据进行计算的加密方案。这种加密计算的结果仍然是加密的,并且只能用密钥(由数据所有者持有)解密。在过去的十年中,已经发明了具有不同能力和权衡的多种同态加密方案;大多数是公钥加密方案,尽管不总是需要使用公钥功能。

同态加密并不是一种通用技术:只有某些加密数据的计算是可能的。此外,它还伴随着显著的性能开销,因此在未加密数据上已经非常昂贵的计算在加密数据上可能不可行。此外,同态加密的数据比未加密的数据大很多倍,因此可能不适合用于加密整个大型数据库。相反,有意义的使用案例是在严格的隐私要求完全禁止未加密云计算的情况下,但计算本身相对轻量的场景。

通常,同态加密方案有一个由数据所有者持有的密钥。对于多个不同的私人数据所有者希望进行协作计算的情况,同态加密可能不是一个合理的解决方案。

同态加密不能用于让数据科学家规避GDPR。例如,云服务无法使用同态加密从加密的客户数据中获取见解。相反,加密计算的结果仍然是加密的,只能由数据所有者(例如云服务客户)解密

大多数同态加密方案提供的安全保证比传统加密方案弱。如果你打算使用Microsoft SEAL构建生产软件,你需要阅读SECURITY.md。

正确使用微软SEAL

同态加密方案具有各种且常常出人意料的安全模型,这可能会让加密专家感到惊讶。特别是,微软SEAL密文的解密应被视为只有密钥持有者才能访问的私人信息,因为在某些情况下,共享密文的解密结果可能会导致密钥泄露。如果绝对有必要共享关于密文解密的信息,例如在构建某种协议时,应尽量减少共享的比特数量,并且应定期轮换密钥。微软SEAL的商业应用应由熟悉同态加密安全模型的加密专家进行仔细审查。

微软SEAL

微软SEAL是一个同态加密库,允许对加密的整数或实数进行加法和乘法运算。其他操作,如加密比较、排序或正则表达式,大多数情况下不适合使用此技术在加密数据上评估。因此,只有特定的隐私关键云计算程序部分应使用微软SEAL实现。

将未加密的计算转换为加密数据的计算并不总是容易或直接的,例如,无法对加密数据进行分支。微软SEAL本身具有较高的学习曲线,需要用户理解许多同态加密特定的概念,尽管其API并不复杂。即使用户能够使用微软SEAL编写并运行特定计算,高效和低效实现之间的差异也可能有几个数量级,新用户很难知道如何提高其计算的性能。

微软SEAL包含两种具有非常不同属性的同态加密方案。BFV和BGV方案允许对加密的整数进行模运算。CKKS方案允许对加密的实数或复数进行加法和乘法运算,但只产生近似结果。在如对加密实数求和、在加密数据上评估机器学习模型或计算加密位置距离等应用中,CKKS是迄今为止最佳选择。对于需要精确值的应用,BFV和BGV方案更为合适

入门

有多种安装微软SEAL并开始使用的方法。最简单的方法是使用包管理器来下载、构建和安装该库。例如,vcpkg适用于大多数平台,并将与微软SEAL的最新版本保持同步(仅适用于C++17)。在macOS上,你也可以使用Homebrew。在FreeBSD上,你可以使用pkg install seal来安装security/seal。.NET库作为多平台的NuGet包提供。最后,你可以使用多平台CMake构建系统手动构建微软SEAL(本博客重点介绍);详情请参见手动构建微软SEAL。

可选依赖项

微软SEAL没有必需的依赖项,但在编译时可以通过支持特定的第三方库来启用某些可选功能。

在手动构建时,可以选择让微软SEAL构建系统下载并构建依赖项,或者在系统目录中搜索预先安装的依赖项。另一方面,可下载的NuGet包无法进行任何配置,但始终可以构建自定义的NuGet包。其他包管理器提供了不同程度的配置依赖项和其他构建选项的机会。

可选依赖项及其测试版本(其他版本也可能适用)如下:

Optional dependencyTested versionUse
Intel HEXL1.2.5Acceleration of low-level kernels
Microsoft GSL4.0.0API extensions
ZLIB1.2.13Compressed serialization
Zstandard1.5.2Compressed serialization (much faster than ZLIB)
GoogleTest1.12.1For running tests
GoogleBenchmark1.7.1For running benchmarks

示例

使用微软SEAL需要用户投入一些时间学习同态加密的基本概念。代码附带了详细注释的示例,旨在逐步教授这些概念并展示大量API。示例有C++和C#两个版本,且内容相同,分别位于native/examples/(C++)和dotnet/examples/(C#)目录下,具体如下:

C++C#Description
examples.cppExamples.csThe example runner application
1_bfv_basics.cpp1_BFV_Basics.cs使用BFV方案的加密模算法
2_encoders.cpp2_Encoders.cs将更复杂的数据编码为Microsoft SEAL明文对象
3_levels.cpp3_Levels.cs引入了等级的概念;使用CKKS方案的先决条件
4_bgv_basics.cpp4_BGV_Basics.cs使用BGV方案的加密模算法
5_ckks_basics.cpp5_CKKS_Basics.cs使用CKKS方案的加密实数算法
6_rotation.cpp6_Rotation.cs在BFV和CKKS方案中对加密向量进行循环旋转
7_serialization.cpp7_Serialization.cs在Microsoft SEAL中序列化对象
8_performance.cpp8_Performance.cs性能测试

建议在阅读注释和代码片段的同时,查看运行示例时的命令行输出。为了便于导航,命令行输出提供了相关代码片段在源文件中的起始行号。要构建这些示例,请参阅“示例、测试和基准”(C++)和“构建 .NET 组件”(C#)。

注意:如果不研究示例1-6,就不可能正确使用微软SEAL。这些示例旨在为读者提供同态加密的必要概念背景。直接复用示例中的代码效果不佳,因为这些示例通常演示的是各个功能片段,并未进行性能优化。不深入研究这些示例就编写微软SEAL代码,必然会导致代码存在漏洞、功能故障或极其缓慢。

使用EVA进行CKKS编程

在研究上述示例时,很明显CKKS方案对初学者并不友好。由于重缩放操作(rescaling operation)的限制和对齐不同级别缩放(aligning scales at different levels)的要求,即使是相对简单的计算也可能难以实现。

我们创建了一个名为EVA的新编译工具,可以在很大程度上解决这些挑战。EVA允许程序员用Python表达所需的加密计算。它为微软SEAL优化计算,选择合适的加密参数,并提供了一个方便的Python API,用于加密输入、执行计算和解密结果。EVA可以在GitHub.com/Microsoft/EVA上找到。试试看,并告诉我们您的看法!

注意:EVA仅支持CKKS方案。目前没有支持BFV或BGV方案的计划。

手动构建Microsoft SEAL

构建C++组件

在所有平台上,微软SEAL都使用CMake构建。我们建议使用源外构建(out-of-source build),尽管源内构建(in-source build)也可以工作。以下是如何配置、构建和安装微软SEAL的说明,您可以选择全局(系统范围)安装或本地(单用户)安装。全局安装需要提升的(root或管理员)权限。

要求

SystemToolchain
WindowsVisual Studio 2022 with C++ CMake Tools for Windows
LinuxClang++ (>= 5.0) or GNU G++ (>= 6.0), CMake (>= 3.13)
macOS/iOSXcode toolchain (>= 9.3), CMake (>= 3.13)
AndroidAndroid Studio
FreeBSDCMake (>= 3.13)

注意:使用Clang++编译的微软SEAL在运行时性能方面比使用GNU G++编译的要好得多

构建微软SEAL

我们假设微软SEAL已被克隆到一个名为SEAL的目录中,并且以下所有命令都假设在SEAL目录中执行。

您可以通过执行以下命令为您的机器构建(源外构建)微软SEAL库:

cmake -S . -B build
cmake --build build

构建完成后,输出的二进制文件可以在build/lib/build/bin/目录中找到。

可以将各种配置选项指定并传递给CMake构建系统。以下章节“基本CMake选项”和“高级CMake选项”中将对这些选项进行描述。

安装微软SEAL

如果您有系统的root权限,可以按如下方式全局安装微软SEAL:

cmake -S . -B build
cmake --build build
sudo cmake --install build

如果要本地安装微软SEAL,例如到~/mylibs/,请执行以下操作:

cmake -S . -B build -DCMAKE_INSTALL_PREFIX=~/mylibs
cmake --build build
sudo cmake --install build

在Windows上构建和安装(不做重点介绍)

为Android和iOS构建(不做重点介绍)

为WebAssembly构建(不做重点介绍)

基本CMake选项

以下选项可以与CMake一起使用以配置构建。每个选项的默认值在“值”列中用粗体表示。

CMake optionValuesInformation
CMAKE_BUILD_TYPERelease
Debug
RelWithDebInfo
MinSizeRel
Debug和MinSizeRel的运行时性能更差。调试插入额外的断言代码。设置为发布,除非您正在开发Microsoft SEAL本身或调试一些复杂的问题。
SEAL_BUILD_EXAMPLESON / OFFnative/examples构建c++示例。
SEAL_BUILD_TESTSON / OFF构建测试以检查Microsoft SEAL是否正常工作。
SEAL_BUILD_BENCHON / OFF构建性能benchmark
SEAL_BUILD_DEPSON / OFF设置为ON自动下载和构建可选的依赖项;否则CMake将尝试查找预安装的依赖项。
SEAL_USE_INTEL_HEXLON / OFF

设置为ON将Intel HEXL用于低级内核。

SEAL_USE_MSGSLON / OFF使用Microsoft GSL支持进行构建。
SEAL_USE_ZLIBON / OFF使用ZLIB支持构建。
SEAL_USE_ZSTDON / OFF使用Zstandard支持构建。
BUILD_SHARED_LIBSON / OFF设置为ON以构建共享库而不是静态库。Windows中不支持。
SEAL_BUILD_SEAL_CON / OFF构建C包装器库SEAL_C。这是c#包装器所使用的,大多数用户应该没有理由构建它。
SEAL_USE_CXX17ON / OFF设置为ON,将Microsoft SEAL构建为c++ 17,以获得积极的性能影响。
SEAL_USE_INTRINON / OFF设置为ON以使用编译器的内在特性来提高性能。CMake将自动检测哪些内部函数可用,并相应地启用它们。

通常,这些选项可以通过-D标志传递给CMake。例如,可以执行

cmake -S . -B build -DSEAL_BUILD_EXAMPLES=ON

配置静态Microsoft SEAL库的发布版本,并构建示例。

高级CMake选项

以下选项可以与CMake一起使用,以进一步配置构建。大多数用户应该没有理由更改这些,这就是为什么它们被标记为高级。

CMake optionValuesInformation
SEAL_THROW_ON_TRANSPARENT_CIPHERTEXTON / OFF设置为ON,当Microsoft SEAL生成没有密钥依赖组件的密文时抛出异常。例如,从一个密文本身减去一个密文,或者将一个密文与一个明文的零相乘,会产生相同的零密文,这些密文不应该被视为有效的密文。
SEAL_BUILD_STATIC_SEAL_CON / OFF

设置为ON以将SEAL_C构建为静态库而不是共享库。

SEAL_DEFAULT_PRNGBlake2xb
Shake256
Microsoft SEAL支持Blake2xb和Shake256 XOF来生成随机字节。Blake2xb要快得多,但没有标准化,而Shake256是FIPS标准。
SEAL_USE_GAUSSIAN_NOISEON / OFF设置为ON时,将使用非常数时间的四舍五入连续高斯分布作为误差分布;否则,将使用标准差略大一些的中心二项分布。
SEAL_AVOID_BRANCHINGON / OFF设置为ON时,在编译器恶意插入标志的情况下,在关键函数中消除分支;否则,假设使用cmov。
SEAL_SECURE_COMPILE_OPTIONSON / OFF

设置为ON以编译/链接控制流防护(/ Guard:cf)和幽灵缓解(/Qspectre)。这只在使用MSVC编译时有效。

SEAL_USE_ALIGNED_ALLOCON / OFF设置为ON以使用64字节对齐内存分配。当启用Intel HEXL时,这可以提高AVX512原语的性能。这取决于c++ 17,在Android上被禁用。

通过CMake链接微软SEAL

如果您使用CMake,将你的应用程序和库与微软SEAL链接非常容易。只需在您的CMakeLists.txt中添加以下内容:

find_package(SEAL 4.1 REQUIRED)
target_link_libraries(<your target> SEAL::seal)

如果微软SEAL是全局安装的,上述find_package命令很可能会自动找到该库。要链接到本地安装的微软SEAL,例如,如上所述安装在~/mylibs中,您可能需要在配置应用程序时告诉CMake在哪里查找微软SEAL,方法是运行:

cd <directory containing your CMakeLists.txt>
cmake . -DCMAKE_PREFIX_PATH=~/mylibs

如果微软SEAL是使用vcpkg或Homebrew等包管理器安装的,请参阅它们的文档以了解如何链接到已安装的库。例如,vcpkg要求您在配置项目时指定vcpkg CMake工具链文件。

示例、测试和Benchmarks

在构建微软SEAL时,可以通过设置SEAL_BUILD_EXAMPLES=ONSEAL_BUILD_TESTS=ONSEAL_BUILD_BENCH=ON来构建示例、测试和benchmark;参见基本CMake选项。或者,可以通过以下命令将示例、测试和benchmark作为与安装在~/mylibs中的微软SEAL链接的独立CMake项目进行构建。如果库是全局安装的,请省略设置SEAL_ROOT

cd native/<examples|tests|bench>
cmake -S . -B build -DSEAL_ROOT=~/mylibs
cmake --build build

默认情况下,Benchmarks测试会针对一系列参数和原语运行,信息量可能会非常大。要执行Benchmarks测试的子集,请参阅Google Benchmark README。对于高级用户,可以使用自定义参数集覆盖native/bench/bench.cpp中的bm_parms_vec变量。

注意:Benchmarks代码严格用于实验目的;它允许不应在实际应用中使用的不安全参数。不要将基准作为示例来遵循。

参考:

GitHub - microsoft/SEAL: Microsoft SEAL is an easy-to-use and powerful homomorphic encryption library.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全二次方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值