SEAL库计算Galois自同构

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值