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)