Quick Start

import numpy as np
import openfhe_numpy as onp
from openfhe import *

# Initialize CKKS context
params = CCParamsCKKSRNS()
params.SetMultiplicativeDepth(7)
params.SetScalingModSize(59)
params.SetFirstModSize(60)
params.SetScalingTechnique(FIXEDAUTO)
params.SetSecretKeyDist(UNIFORM_TERNARY)

cc = GenCryptoContext(params)
cc.Enable(PKESchemeFeature.PKE)
cc.Enable(PKESchemeFeature.LEVELEDSHE)
cc.Enable(PKESchemeFeature.ADVANCEDSHE)

# Generate keys
keys = cc.KeyGen()
cc.EvalMultKeyGen(keys.secretKey)
cc.EvalSumKeyGen(keys.secretKey)

# Create matrix and encrypt it
A = np.array([[1, 2], [3, 4]])

ring_dim = cc.GetRingDimension()
total_slots = ring_dim // 2

# Encrypt with OpenFHE-NumPy
ctm_A = onp.array(
      cc=cc,
      data=A,
      batch_size=batch_size,
      order=onp.ROW_MAJOR,
      fhe_type="C",
      mode="zero",
      public_key=keys.publicKey,
   )


# Generate keys
onp.EvalSquareMatMultRotateKeyGen(keys.secretKey, ctm_A.ncols)

# Perform encrypted operations
ctm_product = ctm_A @ ctm_A      # Matrix multiplication
ctm_sum = onp.add(ctm_A, ctm_A)  # Element-wise addition

# Decrypt results
decrypted_product = ctm_product.decrypt(keys.secretKey, unpack_type="original")
decrypted_sum = ctm_sum.decrypt(keys.secretKey, unpack_type="original")

print("Result of A @ A:")
print(decrypted_product)

print("Result of A + A:")
print(decrypted_sum)