CKKS Decoding, Conjugate sum

Hi!

I’m stuck on a part of the CKKS decoding process. I understand that the step I’m describing is done for security reasons, and I’m not questioning why it’s necessary, but rather how it still allows us to obtain the correct result.

From what I understand, for the encoding (skipping scaling and other details), given a complex vector of size n, an IFFT is applied. The result is then expanded into a polynomial of degree N by separating the real and imaginary components.

To decode, we reverse the process to recover a complex vector of size n, denoted as m(x). After this, the conjugate function is applied, yielding m(1/x). Then, by summing m(x) + m(1/x) and performing an FFT on the result, we obtain the correct answer (again skipping some scaling factors).

Could someone help me to clarify why this works? I’m missing something? Some property?

Looks like you are referring to this part in OpenFHE?

The added Gaussian noise does not affect the most significant bits of the message. It only affects the noise which lives in the least significant bits of the message. Hence, the message is not significantly affected but the original noise is flooded. Subtracting (rather than summing) the conjugate from the message is to find the imaginary part, which includes the accumulated noise in the ciphertext as a result of the computation. The ciphertext noise is needed to estimate the magnitude of the flooding noise that needs to be added to the message.

More on noise flooding can be found in the resources below:

  1. Securing Approximate Homomorphic Encryption Using Differential Privacy
  2. Appropriate error parameters for the noise flooding - #5 by Nick_Genise