I am trying to program a simulator for CKKS. It is a "simulator", in the sense that
- there is actually no encryption involved, but
- to a person seeing only the plaintexts (before encryption and after decryption) and with knowledge of the oblivious operations performed between them, the simulator is statistically indistinguishable from an actual CKKS implementation.
The reason I need this is that I am trying to design a system that will use quite large amounts of CKKS operations -- much more than I can reasonably run at the moment -- and I want a quick and efficient simulator that I can use to determine at the current design stages that the final system will work properly. I have so far been using a simple simulator that injects no noise into the homomorphic operations, so simply returns the exact true answer when a value is decrypted (if not too many homomorphic operations have been performed). This was great for determining that I'm not using too many operations and that my values will, in the end, be properly decryptable. However, I'm now at a point in my work where I need to be sure that the noise injected by the CKKS algorithm won't make the overall system unusable (despite all ciphertexts being decryptable).
How should I model the noise that my simulator should inject when decrypting? How does this noise change when applying the various homomorphic operations? What is the shape of the noise distribution? (e.g., it uniform in a range? Is it normal?) And how do I compute its scale?
If it makes a difference: my software will ultimately be using the CKKS implementation in the SEAL library, so the simulator should produce (statistically) the same noise as that particular implementation.
Any help would be appreciated. Thanks!