Untitled

 avatar
unknown
c_cpp
2 years ago
2.3 kB
43
No Index
#include <iostream>

#include "openfhe.h"


using namespace lbcrypto;
using namespace std;


int main() {
    cout << "CryptoContext and Keys generation started..." << endl;

    CCParams<CryptoContextCKKSRNS> parameters;

    parameters.SetSecretKeyDist(UNIFORM_TERNARY);
    parameters.SetSecurityLevel(lbcrypto::HEStd_128_classic); 
    parameters.SetRingDim(1 << 16);                  


    ScalingTechnique rescaleTech = FLEXIBLEAUTO;
    usint dcrtBits               = 59;      
    usint firstMod               = 60;

    parameters.SetScalingModSize(dcrtBits);
    parameters.SetScalingTechnique(rescaleTech);
    parameters.SetFirstModSize(firstMod);

    std::vector<uint32_t> levelBudget = {4, 4};
    uint32_t approxBootstrapDepth     = 8;

    uint32_t levelsUsedBeforeBootstrap = 8;

    usint depth =
            levelsUsedBeforeBootstrap + FHECKKSRNS::GetBootstrapDepth(approxBootstrapDepth, levelBudget, UNIFORM_TERNARY);

    parameters.SetMultiplicativeDepth(depth);

    cout << "Generating crypto context..." << endl;

    CryptoContext<DCRTPoly> crypto_context = GenCryptoContext(parameters);

    crypto_context->Enable(PKE);
    crypto_context->Enable(KEYSWITCH);
    crypto_context->Enable(LEVELEDSHE);
    crypto_context->Enable(ADVANCEDSHE);
    crypto_context->Enable(FHE);

    KeyPair<DCRTPoly> key_pair = crypto_context->KeyGen();

    cout << "Evaluating MultKeyGen..." << endl;

    crypto_context->EvalRotateKeyGen(key_pair.secretKey, {1, 128, 128*2, 128*2*2, 128*4,128*8,128*16,128*128});

    vector<double> v = {1, 2, 3, 4};

    cout << "Encoding and encrypting a vector..." << endl;
    Plaintext p = crypto_context->MakeCKKSPackedPlaintext(v, 1, 0,nullptr,v.size());
    Ciphertext<DCRTPoly> c = crypto_context->Encrypt(key_pair.publicKey, p);


    auto digits2 = crypto_context->EvalFastRotationPrecompute(c);

    for (int i = 0; i < 7; i++) {
        cout << "Iteration " << i << ": " << endl;
        c = crypto_context->EvalAdd(c,
                                          crypto_context->EvalFastRotation(c, 128 * pow(2, i), crypto_context->GetCyclotomicOrder(), digits2));
        Plaintext ress;
        crypto_context->Decrypt(key_pair.secretKey, c, &ress);
        cout << "Decryptable" << endl;
    }



    return 0;

}
Editor is loading...