SEAL4.0配置安装,编写自己的代码

最近有项目需要用到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博客在此感谢!

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值