Advertisement
Guest User

Untitled

a guest
Mar 31st, 2023
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.50 KB | None | 0 0
  1. #include "openfhe.h"
  2.  
  3. using namespace lbcrypto;
  4. using namespace std;
  5.  
  6. double binomial_coeff(float k, int a) {
  7.     double b=1;
  8.     for(int p=1; p<=a; p++) {
  9.         b=b*(k+1-p)/p;
  10.     }
  11.     return b;
  12. }
  13.  
  14. int main() {
  15.     CCParams<CryptoContextCKKSRNS> parameters;
  16.  
  17.     parameters.SetSecretKeyDist(UNIFORM_TERNARY);
  18.     parameters.SetSecurityLevel(lbcrypto::HEStd_NotSet);
  19.     parameters.SetRingDim(1 << 15);
  20.  
  21.     ScalingTechnique rescaleTech = FLEXIBLEAUTO;
  22.     usint dcrtBits               = 59;
  23.     usint firstMod               = 60;
  24.  
  25.     parameters.SetScalingModSize(dcrtBits);
  26.     parameters.SetScalingTechnique(rescaleTech);
  27.     parameters.SetFirstModSize(firstMod);
  28.  
  29.     std::vector<uint32_t> levelBudget = {3, 3};
  30.     uint32_t approxBootstrapDepth     = 9;
  31.  
  32.     uint32_t levelsUsedBeforeBootstrap = 10;
  33.     usint depth =
  34.             levelsUsedBeforeBootstrap + FHECKKSRNS::GetBootstrapDepth(approxBootstrapDepth, levelBudget, UNIFORM_TERNARY);
  35.  
  36.     parameters.SetMultiplicativeDepth(depth);
  37.  
  38.     CryptoContext<DCRTPoly> crypto_context = GenCryptoContext(parameters);
  39.  
  40.     crypto_context->Enable(PKE);
  41.     crypto_context->Enable(KEYSWITCH);
  42.     crypto_context->Enable(LEVELEDSHE);
  43.     crypto_context->Enable(ADVANCEDSHE);
  44.     crypto_context->Enable(FHE);
  45.  
  46.     usint ringDim = crypto_context->GetRingDimension();
  47.     usint numSlots = ringDim / 2;
  48.  
  49.     crypto_context->EvalBootstrapSetup(levelBudget);
  50.     KeyPair<DCRTPoly> key_pair = crypto_context->KeyGen();
  51.  
  52.     crypto_context->EvalMultKeyGen(key_pair.secretKey);
  53.     crypto_context->EvalBootstrapKeyGen(key_pair.secretKey, numSlots);
  54.  
  55.     vector<double> val = {0.1, 0.2, 0.3, 0.4, 0.5};
  56.     Ciphertext<DCRTPoly> ciphertext = crypto_context->Encrypt(
  57.             key_pair.publicKey, crypto_context->MakeCKKSPackedPlaintext(val));
  58.  
  59.     vector<double> minus_half_vec = {-0.5, -0.5, -0.5, -0.5, -0.5};
  60.     Plaintext minus_half = crypto_context->MakeCKKSPackedPlaintext(minus_half_vec);
  61.  
  62.     ciphertext = crypto_context->EvalAdd(ciphertext, minus_half);
  63.  
  64.     vector<double> coefficients;
  65.  
  66.     int degree = 8;
  67.  
  68.     for (int i = 0; i < degree; i++) {
  69.         coefficients.push_back(pow(2, -0.5 + i) * binomial_coeff(0.5, i));
  70.     }
  71.  
  72.     cout << "Coefficients: " << coefficients << endl;
  73.  
  74.     Ciphertext<DCRTPoly> output = crypto_context->EvalPoly(ciphertext, coefficients);
  75.  
  76.     Plaintext plain_result;
  77.     crypto_context->Decrypt(key_pair.secretKey, output, &plain_result);
  78.  
  79.  
  80.     cout << "Result: " << plain_result << endl;
  81.  
  82.  
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement