· 6 years ago · Oct 04, 2019, 11:22 AM
1#include "seal_kpi.h"
2
3#include "seal/seal.h"
4#include <fstream>
5
6using namespace std;
7using namespace seal;
8
9#define DEBUG 0
10
11void inline decode_and_print(CKKSEncoder& encoder, Decryptor& dec, Ciphertext& ct) {
12 Plaintext plain_result;
13 dec.decrypt(ct, plain_result);
14 static vector<double> result;
15 encoder.decode(plain_result, result);
16 print_vector(result, 7, 4);
17}
18
19int main() {
20 EncryptionParameters parms(scheme_type::CKKS);
21
22 static constexpr size_t POLY_MODULUS_DEGREE = 2048;
23 parms.set_poly_modulus_degree(POLY_MODULUS_DEGREE);
24 parms.set_coeff_modulus(CoeffModulus::Create( POLY_MODULUS_DEGREE, { 26, 20, 26 }));
25 parms.set_random_generator(UniformRandomGeneratorFactory::default_factory()); //standard random number generator
26
27 auto context = SEALContext::Create(parms, true, sec_level_type::none);
28 double scale = pow(2.0, 20);
29
30 //Read the secret key in
31 SecretKey secret_key;
32 ifstream secret_key_bin("/home/anh/microSEAL/crypt/ckks_secr.bin", ios::binary);
33 secret_key.load(context, secret_key_bin);
34
35 Ciphertext x1_encrypted;
36 ifstream x1_encrypted_bin("/home/anh/microSEAL/crypt/x1_enc.bin", ios::binary);
37 x1_encrypted.load(context, x1_encrypted_bin);
38
39 Decryptor decryptor(context, secret_key);
40 CKKSEncoder encoder(context);
41
42 cout << "after encryption: " << endl;
43 decode_and_print(encoder, decryptor, x1_encrypted);
44
45 Ciphertext mean_encrypted(x1_encrypted);
46
47 Evaluator evaluator(context);
48
49 KeyGenerator keygen(context);
50 auto relin_keys = keygen.relin_keys();
51 auto galois_keys = keygen.galois_keys();
52
53 // TODO: Ask Clement where the relin_keys and galois_keys are stored?
54 //auto relin_keys = secret_key.relin_keys();
55 //auto galois_keys = keygen.galois_keys();
56
57 for (int i = seal::util::get_power_of_two(encoder.slot_count() >> 1); i >= 0; i--) {
58 Ciphertext rotated;
59 size_t rot = 1ull << i;
60 evaluator.relinearize_inplace(mean_encrypted, relin_keys);
61 evaluator.rotate_vector(mean_encrypted, rot, galois_keys, rotated);
62 evaluator.add_inplace(mean_encrypted, rotated);
63 }
64
65 double sum = 0;
66 cout << "Result: " << endl;
67 {
68 Plaintext plain_result;
69 decryptor.decrypt(mean_encrypted, plain_result);
70 static vector<double> result;
71 encoder.decode(plain_result, result);
72 print_vector(result, 7, 4);
73 sum = result[0]; // any element of this vector contains the sum.
74 }
75
76 double rms = sqrt(sum / 1024);
77 cout << "Vibration KPI (RMS):\t" << rms << endl;
78}