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計劃的計劃。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章