SEAL是著名的同态加密库,支持Galois自同构运算。
代码示例如下。
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <memory>
#include <type_traits>
#include <variant>
#include <future>
#include <array>
#include <cstddef>
#include <cstdint>
#include "seal/seal.h"
using namespace std;
using namespace seal;
void test_it()
{
EncryptionParameters parms(scheme_type::bfv);
size_t poly_modulus_degree = 8192;
parms.set_poly_modulus_degree(poly_modulus_degree);
parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));
parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));
SEALContext context(parms);
cout << endl;
KeyGenerator keygen(context);
SecretKey secret_key = keygen.secret_key();
PublicKey public_key;
keygen.create_public_key(public_key);
RelinKeys relin_keys;
keygen.create_relin_keys(relin_keys);
Encryptor encryptor(context, public_key);
Evaluator evaluator(context);
Decryptor decryptor(context, secret_key);
Plaintext plain("1x^8191 + 1x^2 + 1x^1 + 1");
Ciphertext encrypted;
encryptor.encrypt(plain, encrypted);
std::vector<std::uint32_t> galois_elements(4096);
for(int i=0; i<4096; ++i)
galois_elements[i] = (i << 1) + 1;
GaloisKeys galois_keys;
keygen.create_galois_keys(galois_elements, galois_keys);
evaluator.apply_galois_inplace(encrypted, 3, galois_keys);
Plaintext plain_result;
decryptor.decrypt(encrypted, plain_result);
std::cout << "decrypt result: " << plain_result.to_string() << endl;
}
int main()
{
test_it();
return 0;
}