调用SEAL库中的例子的报错情况(csdn都翻烂了,怎么修改都无济于事)
**错误 LNK2001 无法解析的外部符号 main Project9 D:\VS\Project9\Project9\MSVCRT.lib(exe_main.obj) 1
错误 LNK1120 1 个无法解析的外部命令 Project9 D:\VS\Project9\x64\Release\Project9.exe 1 **
一、目前的vs2022配置情况
二、目前的SEAL库的安装情况
三、可以成功运行的例子
一、目前的vs2022配置情况
二、目前的SEAL库的安装情况
三、在cdsn上找到了两个可以成功运行的例子
#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;
}
运行结果
另一个可以成功运行的代码
#include <iostream>
#include <vector>
#include "seal/seal.h"
using namespace std;
using namespace seal;
int main() {
// 选定参数
EncryptionParameters params(scheme_type::ckks);
size_t poly_modulus_degree = 8192;
params.set_poly_modulus_degree(poly_modulus_degree);
params.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));
double scale = pow(2.0, 40);
SEALContext context(params);
// 生成 A 用户的密钥
KeyGenerator keygen_A(context);
PublicKey public_key_A;
keygen_A.create_public_key(public_key_A);
auto secret_key_A = keygen_A.secret_key();
// 生成 B 用户的密钥
KeyGenerator keygen_B(context);
PublicKey public_key_B;
keygen_B.create_public_key(public_key_B);
auto secret_key_B = keygen_B.secret_key();
// 实例化加密器、解密器和计算器
Encryptor encryptor_A(context, public_key_B);//这个加密器用于加密对用户B可解密的密文
Encryptor encryptor_A1(context, public_key_A);//这个加密器用于加密用户A的密文
Evaluator evaluator_A(context);
Decryptor decryptor_A(context, secret_key_A);//这个解密器用于解密用户A加密后的密文
Encryptor encryptor_B(context, public_key_B);
Decryptor decryptor_B(context, secret_key_B);
Evaluator evaluator_B(context);
// 生成 A 用户的数据并加密
vector<double> vec_A{ 1.0 };
CKKSEncoder encoder_A(context);
size_t slot_count_A = encoder_A.slot_count();
Plaintext plain_A;
encoder_A.encode(vec_A, scale, plain_A);
Ciphertext encrypted_A;
encryptor_A.encrypt(plain_A, encrypted_A);
//加密用户A的数据
Ciphertext encrypted_A1;
encryptor_A1.encrypt(plain_A, encrypted_A1);
// 生成 B 用户的数据并加密
vector<double> vec_B{ 9.0 };
CKKSEncoder encoder_B(context);
size_t slot_count_B = encoder_B.slot_count();
Plaintext plain_B;
encoder_B.encode(vec_B, scale, plain_B);
Ciphertext encrypted_B;
encryptor_B.encrypt(plain_B, encrypted_B);
// 对两个加密数据进行加法
Ciphertext encrypted_sum;
evaluator_B.add(encrypted_A, encrypted_B, encrypted_sum);
// 解密加法结果并解码
Plaintext plain_sum;
decryptor_B.decrypt(encrypted_sum, plain_sum);
vector<double> vec_sum;
encoder_B.decode(plain_sum, vec_sum);
cout << "Decrypted result: " << vec_sum[0] << endl;
//解密用户A的数据
Plaintext plain_A1;
decryptor_A.decrypt(encrypted_A1, plain_A1);
vector<double> vec_A1;
encoder_A.decode(plain_A1, vec_A1);
cout << "Decrypted result: " << vec_A1[0] << endl;
return 0;
}
运行结果
除了这两个,其他的例子都不能成功运行,最重要的是,SEAL库中的例子都不能成功运行,报错结果放在了文章开始的位置。
听取评论区的建议后,将原来的 void bfv_performance_test() 改为int main(){return 0;}后, 成功了。那为啥SEAL库的例子要给void而不是直接给int main呢?