simple-ckks-bootstrapping.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from openfhe import *
  2. def main():
  3. simple_bootstrap_example()
  4. def simple_bootstrap_example():
  5. parameters = CCParamsCKKSRNS()
  6. secret_key_dist = SecretKeyDist.UNIFORM_TERNARY
  7. parameters.SetSecretKeyDist(secret_key_dist)
  8. parameters.SetSecurityLevel(SecurityLevel.HEStd_NotSet)
  9. parameters.SetRingDim(1<<12)
  10. rescale_tech = ScalingTechnique.FLEXIBLEAUTO
  11. dcrt_bits = 59
  12. first_mod = 60
  13. parameters.SetScalingModSize(dcrt_bits)
  14. parameters.SetScalingTechnique(rescale_tech)
  15. parameters.SetFirstModSize(first_mod)
  16. level_budget = [4, 4]
  17. approx_bootstrapp_depth = 8
  18. levels_used_before_bootstrap = 10
  19. depth = levels_used_before_bootstrap + FHECKKSRNS.GetBootstrapDepth(approx_bootstrapp_depth, level_budget, secret_key_dist)
  20. parameters.SetMultiplicativeDepth(depth)
  21. cryptocontext = GenCryptoContext(parameters)
  22. cryptocontext.Enable(PKESchemeFeature.PKE)
  23. cryptocontext.Enable(PKESchemeFeature.KEYSWITCH)
  24. cryptocontext.Enable(PKESchemeFeature.LEVELEDSHE)
  25. cryptocontext.Enable(PKESchemeFeature.ADVANCEDSHE)
  26. cryptocontext.Enable(PKESchemeFeature.FHE)
  27. ring_dim = cryptocontext.GetRingDimension()
  28. # This is the mazimum number of slots that can be used full packing.
  29. num_slots = int(ring_dim / 2)
  30. print(f"CKKS is using ring dimension {ring_dim}")
  31. cryptocontext.EvalBootstrapSetup(level_budget)
  32. key_pair = cryptocontext.KeyGen()
  33. cryptocontext.EvalMultKeyGen(key_pair.secretKey)
  34. cryptocontext.EvalBootstrapKeyGen(key_pair.secretKey, num_slots)
  35. x = [0.25, 0.5, 0.75, 1.0, 2.0, 3.0, 4.0, 5.0]
  36. encoded_length = len(x)
  37. ptxt = cryptocontext.MakeCKKSPackedPlaintext(x)
  38. ptxt.SetLength(encoded_length)
  39. print(f"Input: {x}")
  40. ciph = cryptocontext.Encrypt(key_pair.publicKey, ptxt)
  41. print(f"Initial number of levels remaining: {ciph.GetLevel()}")
  42. ciphertext_after = cryptocontext.EvalBootstrap(ciph)
  43. print(f"Number of levels remaining after bootstrapping: {ciphertext_after.GetLevel()}")
  44. result = cryptocontext.Decrypt(ciphertext_after,key_pair.secretKey)
  45. result.SetLength(encoded_length)
  46. print(f"Output after bootstrapping: {result}")
  47. if __name__ == '__main__':
  48. main()