Key Switching Techniques
Basics RLWE ciphertext $$ \begin{align*} (a, b) &= (a, -as + \Delta m + e)\\ R_q &= \mathbb{Z}_q[x]/(x^d + 1)\\ \Delta &= \lfloor q/p\rfloor \end{align*} $$Key-switching $$ \begin{align*} \mathsf{KS.setup}(s,s')&=[w, -s' \cdot w + s \cdot g_z + e] \to K\\ \mathsf{KS.switch}(K, (a, b)) &= (0, b) + g_z^{-1}(a) \cdot k\\ &= (0, b) + g_z^{-1}(a) \cdot [w, -s' \cdot w + s \cdot g_z + e]\\ &= (g_z^{-1}(a) \cdot w, -g_z^{-1}(a) \cdot w \cdot s'+ g_z^{-1}(a) \cdot s \cdot g_z+g_z^{-1}(a) \cdot e)\\ &=(a', -s'a' + s \cdot g_z^{-1}(a)g_z + e')\\ &=(a', -s'a' + sa + e') + (0, -as + m + e)\\ &=(a', -s'a' + m + e'') \end{align*} $$$K\in R_q^{\ell \times 2}$ is two columns of polys. This is pretty large. Say $q$ is stored in uint64_t, $d = 2048$, then each polynomial in $R_q$ is 16KB. We can use pseudorandom $w$ to save some time, but still quite large. ...