· 7 years ago · Oct 05, 2018, 05:42 PM
1#include "seal/seal.h"
2
3using namespace seal;
4
5int main() {
6 EncryptionParameters params;
7 params.set_poly_modulus("1x^4096 + 1");
8 params.set_coeff_modulus(coeff_modulus_128(4096));
9 int32_t p = 8404993;
10 params.set_plain_modulus(p);
11 SEALContext context(params);
12
13 KeyGenerator keygen(context);
14 auto public_key = keygen.public_key();
15 auto secret_key = keygen.secret_key();
16
17 Encryptor encryptor(context, public_key);
18 Evaluator evaluator(context);
19 Decryptor decryptor(context, secret_key);
20
21 PolyCRTBuilder crtbuilder(context);
22 std::vector<uint64_t> buf(4096);
23
24 for (int32_t i = 0; i < 4096; ++i) {
25 buf[i] = i % 1024;
26 }
27
28 Plaintext pt;
29 crtbuilder.compose(buf, pt);
30 evaluator.transform_to_ntt(pt);
31
32 Plaintext pt2;
33 Ciphertext ct;
34 crtbuilder.compose(buf, pt2);
35 encryptor.encrypt(pt2, ct);
36 std::cout << "Noise budget before NTT: " << decryptor.invariant_noise_budget(ct) << std::endl;
37 evaluator.transform_to_ntt(ct);
38 std::cout << "Noise budget after NTT: " << decryptor.invariant_noise_budget(ct) << std::endl;
39
40 evaluator.multiply_plain_ntt(ct, pt);
41
42 std::cout << "Noise budget before NTT: " << decryptor.invariant_noise_budget(ct) << std::endl;
43 evaluator.transform_from_ntt(ct);
44 std::cout << "Noise budget after NTT: " << decryptor.invariant_noise_budget(ct) << std::endl;
45
46 decryptor.decrypt(ct, pt);
47 crtbuilder.decompose(pt, buf);
48
49 for (int32_t i = 0; i < 4096; ++i) {
50 int32_t t = i % 1024;
51 if (buf[i] != t * t) {
52 std::cerr << "Error" << std::endl;
53 exit(1);
54 }
55 }
56 std::cout << "Correct" << std::endl;
57
58 return 0;
59}