首页 > 编程知识 正文

arcengine安装教程(SEAL库的安装(Windows VS2019环境下3.5.9版本SEAL))

时间:2023-05-05 03:01:42 阅读:124000 作者:3619

安装SEAL库(在Windows VS2019环境下)笔者说:从3.6版开始,SEAL的安装发生了很大的变化。 从3.6版开始,SEAL库不再提供windows visual studio解决方案文件。 这意味着SEAL.sln文件比以前的几个项目少了。安装新版本的SEAL库后,只能使用CMAKE。 旧版本的SEAL库仍然可以安装在SEAL.sln文件中。 笔者按照官方文档尝试了以下3.6版的SEAL库,但安装完成后未能在VS中成功调用。 (由于SEAL库为此第三方库配置了新的内容文件,因此必须引用SEAL中的gsl,但推测编译器可能由于未知原因无法成功识别SEAL中的gsl ),与VS相关的栏SEAL库是用c编写的,实现了完全同态加密的CKKS方式和BFV方式的完全同态加密库,由微软在Github上开源。 可访问: https://github.com/microsoft/SEAL访问SEAL库的开源地址,以更深入地了解SEAL库。 这篇文章会简单说明。 SEAL库提供了密文加减乘除等基本运算功能和私钥公钥的生成方法,简单易用。 同时,由于不依赖于其他,可以在Windows、Linux、macOS以及新添加的Android和ios上轻松安装和使用SEAL库。 本文详细介绍了在Visual Studio2019中在Windows环境中安装和配置SEAL库。 本文部分内容来自github开源地址提供的SEAL库官方说明,以及微软在youtube上发布的SEAL库安装视频。 由于SEAL库删除了VS的sln支持文件3.6.0或更高版本,因此此视频提供的方案只能用于3.5或更低版本的SEAL安装。 请谅解。 不说多馀的话,开始正文的说明。 首先,SEAL库是c的库。 你需要为你的VS安装c的编译运行环境。 笔者选择安装的有图中的两个内容构成。 请参考:

去SEAL用GitHub的开源地址下载库文件:

单击左侧的主控并选择以前的版本号:

单击右侧的绿色代码按钮,然后单击底部的下载zip。

3 .下载结束后解压即可。 笔者选择解压缩到d驱动器。

需要注意的是,请务必将文件解压缩到SEAL文件夹下。 自己创建一个名为SEAL的文件夹。 否则,下一个安装过程可能会发生错误。 (我的文件夹中有一个新创建了demo文件的测试项目。 稍后再说明,没关系)

进入解压缩的文件夹,打开seal.sln文件。 这是vs自己的解决方案文件。

右键单击并将SEAL设置为启动项目

在上设置release模式和64位模式

然后点击右侧绿色三角标记的按钮,运行项目。

执行完成后,输出中将显示seal.lib文件的生成路径。

d :sealseal-3.5.9libx64releaseseal.lib

然后,为项目配置SEAL库,并创建新的c控制台项目。

右键单击项目,选择“属性C/C”,然后选择“常规”以添加其他包含目录。 目录是SEAL库中native文件夹下的src文件夹

然后选择链接器,常规,添加其他库目录。 目录地址是SEAL文件夹下的lib文件夹,在末尾加上后缀。

$ (平台) $ (配置)有助于编译器找到以前生成的. lib文件。

最后,链接器,请不要忘记将seal.lib添加到输入的其他依赖关系中,并将加号与其他库文件名分开。

然后,要在此项目中调用seal库,只需在程序中添加以下两个语句:

# include ' seal/seal.h ' usingnamespaceseal; 以下是BFV方案的加密计算示例,供参考。

# includecstddef # include iostream # include fstream # includeiomanip # include vector # include string # include chrono # include include limits # include algorithm # include numeric # include ' seal/seal.h ' # include time

std;using namespace seal;inline void print_parameters(std::shared_ptr<seal::SEALContext> context){// Verify parametersif (!context){throw std::invalid_argument("context is not set");}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;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_mod_count = coeff_modulus.size();for (std::size_t i = 0; i < coeff_mod_count - 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;}/*计算5*6*8*120+500+300*/int main(){/* 首先设置加密方案的参数 poly_modulus 、coeff_modulus 、plain_modulus*/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);auto context = SEALContext::Create(parms);//产生contextprint_parameters(context);cout << endl;//产生密钥、加密、解密、evaluatorKeyGenerator keygen(context);PublicKey public_key = keygen.public_key();SecretKey secret_key = keygen.secret_key();RelinKeys relin_keys = keygen.relin_keys_local();Encryptor encryptor(context, public_key);//加密机 Evaluator evaluator(context);// 评估机 Decryptor decryptor(context, secret_key);//解密机 IntegerEncoder encoder(context);//对整数编码//5*6int x5 = 5;int x6 = 6;Plaintext x5_plain;Plaintext x6_plain;encoder.encode(x5, x5_plain);//将整数编码encoder.encode(x6, x6_plain);Ciphertext x5_encrypted, x6_encrypted;//密文encryptor.encrypt(x5_plain, x5_encrypted);encryptor.encrypt(x6_plain, x6_encrypted);//明文加密为密文Ciphertext x5x6_encrypted;//5*6的密文结果evaluator.multiply(x5_encrypted, x6_encrypted, x5x6_encrypted);//密文5*6保存到x5x6-encrypted中evaluator.relinearize_inplace(x5x6_encrypted, relin_keys);cout << "Noise budget of x5x6_encrypted:" << decryptor.invariant_noise_budget(x5x6_encrypted) << "bits" << endl;//对密文结果再线性化并计算噪音大小//8*120int x8 = 8, x120 = 120;Plaintext x8_plain;Plaintext x120_plain;//明文 encoder.encode(x8, x8_plain);encoder.encode(x120, x120_plain);//转化为明文 Ciphertext x8_encrypted, x120_encrypted;//密文encryptor.encrypt(x8_plain, x8_encrypted);encryptor.encrypt(x120_plain, x120_encrypted);//转化为密文Ciphertext x8x120_encrypted;//8*120结果evaluator.multiply(x8_encrypted, x120_encrypted, x8x120_encrypted);//8*120evaluator.relinearize_inplace(x8x120_encrypted, relin_keys);//再线性化cout << "Noise budget of x8x120_encrypted:" << decryptor.invariant_noise_budget(x8x120_encrypted) << "bits" << endl;//计算(5*6)*(8*120)Ciphertext total_mul;evaluator.multiply(x5x6_encrypted, x8x120_encrypted, total_mul);evaluator.relinearize_inplace(total_mul, relin_keys);//再线性化cout << "Noise budget of total_mul:" << decryptor.invariant_noise_budget(total_mul) << "bits" << endl;//计算500+300int x500 = 500, x300 = 300;Plaintext x500_plain;Plaintext x300_plain;encoder.encode(x500, x500_plain);encoder.encode(x300, x300_plain);Ciphertext x500_encrypted, x300_encrypted;encryptor.encrypt(x500_plain, x500_encrypted);encryptor.encrypt(x300_plain, x300_encrypted);Ciphertext total_add;evaluator.add(x500_encrypted, x300_encrypted, total_add);//add函数相加//计算最终结果Ciphertext total;evaluator.add(total_mul, total_add, total);//解密Plaintext result;decryptor.decrypt(total, result);//运用decode_int32()函数解码cout << encoder.decode_int32(result) << endl;}

运行结果如下:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。