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