最近有项目需要用到SEAL库,写一个配置环境的记录
目录
基础环境:
Win10
Visual Studio 2022
步骤
先去Github上将代码下载下来GitHub - microsoft/SEAL: Microsoft SEAL is an easy-to-use and powerful homomorphic encryption library.,然后进入解压后的代码目录,打开Visual Studio 2022 的 Developer Command Prompt For VS 2022 终端,进入代码目录依次执行以下三个命令(记得看下自己电脑是x64还是x86)
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
cmake --install build
执行完毕后使用Visual Studio 2022创建一个新项目,然后进入项目属性编辑附加包含目录,C++语言标准,以及链接器,最后在附加连接器中添加seal库。
编写代码进行测试
附录
后来因为项目需要把SEAL部署到Linux服务器上,然后在win上用Visual Studio进行远程开发,基本的部署没啥差别,要注意的点是,在添加链接器->输入->附加依赖项的时候,在win上直接是加一个seal4-4.0.lib, 在配置远程环境的时候要添加的是“/usr/local/lib/libseal-4.0.a”
代码
#include "seal/seal.h"
#include <iostream>
#include <iomanip>
using namespace std;
using namespace seal;
/*
Helper function: Convert a value into a hexadecimal string, e.g., uint64_t(17) --> "11".
*/
inline std::string uint64_to_hex_string(std::uint64_t value)
{
return seal::util::uint_to_hex_string(&value, std::size_t(1));
}
inline void print_line(int line_number)
{
std::cout << "Line " << std::setw(3) << line_number << " --> ";
}
inline void print_parameters(const seal::SEALContext& context)
{
auto& context_data = *context.key_context_data();
/*
Which scheme are we using?
*/
std::string scheme_name;
switch (context_data.parms().scheme())
{
case seal::scheme_type::bfv:
scheme_name = "BFV";
break;
case seal::scheme_type::ckks:
scheme_name = "CKKS";
break;
case seal::scheme_type::bgv:
scheme_name = "BGV";
break;
default:
throw std::invalid_argument("unsupported scheme");
}
std::cout << "/" << std::endl;
std::cout << "| Encryption parameters :" << std::endl;
std::cout << "| scheme: " << scheme_name << std::endl;
std::cout << "| poly_modulus_degree: " << context_data.parms().poly_modulus_degree() << std::endl;
/*
Print the size of the true (product) coefficient modulus.
*/
std::cout << "| coeff_modulus size: ";
std::cout << context_data.total_coeff_modulus_bit_count() << " (";
auto coeff_modulus = context_data.parms().coeff_modulus();
std::size_t coeff_modulus_size = coeff_modulus.size();
for (std::size_t i = 0; i < coeff_modulus_size - 1; i++)
{
std::cout << coeff_modulus[i].bit_count() << " + ";
}
std::cout << coeff_modulus.back().bit_count();
std::cout << ") bits" << std::endl;
/*
For the BFV scheme print the plain_modulus parameter.
*/
if (context_data.parms().scheme() == seal::scheme_type::bfv)
{
std::cout << "| plain_modulus: " << context_data.parms().plain_modulus().value() << std::endl;
}
std::cout << "\\" << std::endl;
}
void example_bfv()
{
cout << "Example BFV Basic.";
EncryptionParameters parms(scheme_type::bfv);//生成方案所需参数
size_t poly_modulus_degree = 4096; //设置多项式的度数
parms.set_poly_modulus_degree(poly_modulus_degree);
parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));
parms.set_plain_modulus(1024);
cout << "Set encryption parameters and print" << endl;
SEALContext context(parms);
print_parameters(context);
cout << "Parameter validation (success): " << context.parameter_error_message() << endl;
cout << endl;
cout << "~~~~~~ A naive way to calculate 4(x^2+1)(x+1)^2. ~~~~~~" << endl;
/*
生成密钥
*/
KeyGenerator keygen(context);
SecretKey secret_key = keygen.secret_key();
PublicKey public_key;
keygen.create_public_key(public_key);
/*
生成加密器,eval器,解密器
*/
Encryptor encryptor(context, public_key);
Evaluator evaluator(context);
Decryptor decryptor(context, secret_key);
/*
加密明文6, 使用一个构造器将其构造成多项式表示的形式,系数以hex表示
*/
print_line(__LINE__);
uint64_t x = 6;
Plaintext x_plain(uint64_to_hex_string(x));
cout << "Express x = " + to_string(x) + " as a plaintext polynomial 0x" + x_plain.to_string() + "." << endl;
/*
使用加密器进行加密
*/
print_line(__LINE__);
Ciphertext x_encrypted;
cout << "Encrypt x_plain to x_encrypted." << endl;
encryptor.encrypt(x_plain, x_encrypted);
/*
BFV/BGV的密文一般都是两个或两个以上的多项式,多项式个数称为密文的size
*/
cout << " + size of freshly encrypted x: " << x_encrypted.size() << endl;
/*
格同态中有噪声的概念,会影响解密正确性,具体见文献吧
*/
cout << " + noise budget in freshly encrypted x: " << decryptor.invariant_noise_budget(x_encrypted) << " bits"
<< endl;
/*
解密密文
*/
Plaintext x_decrypted;
cout << " + decryption of x_encrypted: ";
decryptor.decrypt(x_encrypted, x_decrypted);
cout << "0x" << x_decrypted.to_string() << " ...... Correct." << endl;
/*
计算加法
*/
print_line(__LINE__);
cout << "Compute x_sq_plus_one (x^2+1)." << endl;
Ciphertext x_sq_plus_one;
evaluator.square(x_encrypted, x_sq_plus_one);
Plaintext plain_one("1");
evaluator.add_plain_inplace(x_sq_plus_one, plain_one);
cout << " + size of x_sq_plus_one: " << x_sq_plus_one.size() << endl;
cout << " + noise budget in x_sq_plus_one: " << decryptor.invariant_noise_budget(x_sq_plus_one) << " bits"
<< endl;
}
int main() {
example_bfv();
return 0;
}
参考与致谢:
关于在Win11-Visual Studio 2022环境中安装MicrosoftSEAL4.0(新支持BGV方案的版本)同态加密运算库_Satoshu的博客-CSDN博客在此感谢!