====== Cifrado Homomorfico ====== Cuando un tercero tiene que operar con nuestros datos y no queremos que los vea, se aplica cifrado homomorfico, que permite realizar operaciones sobre datos cifrados. A la hora de operar con cifrado homomorfico se usan los siguientes componentes: * **n** -> Tamaño de los vectores * **q** -> Valor del módulo (módulo q) * Trabajamos con módulos en potencias de 2 ($2^x$) * **e** -> Error * Dsitribución normal N(0,γ*q) -> r = γ*q * Media 0 * Valor relacionado con q * El valor debe estar redondeado * Valor entre 0 y q * **a** -> Vector de soporte * Vector de tamaño n con valores entre 0 y q-1 * **S** -> Secreto o clave privada * Solo la conoce el dueño de los datos a operar * Valores aleatorios del conjunto {-1,0,1} Sabiendo esto, sabemos que la clave pública (a,b) del cifrado homomorfico es: $(a,b = S^T*a+e $ $MOD q) ∈ Z^n_q * Z_q$ Esta fórmula es solo la clave pública, si queremos proceder a realizar el cifrado utilizando esta, debemos introducir otros 2 elementos: * **m** -> Mensaje a Cifrar * **Δ** -> Constante (Normalmente su valor es una potencia de 2) El cifrado homomórfico se vería de la siguiente forma: $(a,b = S^T*a+e+Δ*m $ $MOD q)$ * Clave pública -> $S^T*a+e$ * Texto Cifrado -> $b = S^T*a+e+Δ*m $ $MOD q$ * **OJO**: a y b son necesarios para poder descrifrar el mensaje Cuando se mandan datos a un tercero para operar con ellos, se madan a y b $Δ*m+e = b+S^T*a$ * $m' = Δ*m+e$ -> Mensaje aproximado con error $m+e = (b+S^T*a)/Δ$ $MOD q$ * $m' = m+e$ $m = ||(b+S^T*a)/Δ - e$ $MOD q||$ * Redondeamos el resultado para el descifrado * Si todo va bien, al realizar el redondeo desaparece el error aplicado y el valor final obtenido es el mensaje inicial. {{drawio>pan:chomoej1.png}} ===== Sumas sobre cifrado Homomórfico ===== {{drawio>pan:chsuma.png}} ===== Multiplicación de cifrado homomórfico contra una pequeña constante ===== {{drawio>pan:chmultcons.png}} **NOTA**: Si el valor de C es muy grande puede descuadrarse todo al multiplicarse el error. ===== Descomposición gadget ===== La descomposición gadget consiste en tomar un número grande y descomponerlo en bloques. Esto se usa en las multiplicaciones con cifrado homomórfico para evitar que se descuadren los valores. {{drawio>pan:descgadget1.png}} La descomposición gadget permite calcular varios factores de la constante C. Se tienen en cuenta los siguientes datos: * C: Constante a descomponer * B: En cuantos trozos se va a descomponer, normalmente equivale al número de restos que obtenemos. * P: Valor de la potencia de 2 que se va a utilizar para realizar las divisiones. {{drawio>pan:descgadget2.png}} ==== Descomposición Gadget en el Cifrado Homomórfico ==== Gracias a la descomposición gadget podemos descomponer una multiplicación homomórfica por una constante muy grande de la siguiente forma para $(a*c, b*c)$: * $(a*c_0, b*c_0)$ * $(a*c_1, b*c_1)$ * $(a*c_2, b*c_2)$ Lo que reduce el error de forma considerable $C = C_2*2^{P*2} + C_1*2^{P*1} + C_0*2^{P*0}$ Para ello, se crean varios mensajes cifrados: {{drawio>pan:descgadget3.png}} {{drawio>pan:descgadgetejemplo.png}}