FATE框架Paillier模块分析
1.编码模块
- 默认参数Q = 293973345475167247070445277780365744413为127 bit的素数(是否是最大,有待验证)
Note:在线检验素数 - 对负数的编码:乘完大整数后会进行模n的操作,故负数会变成超过max_int的正数。
2.加解密
- 对负数的加密:
编码时所有负数均被处理成了正数,故不会直接对负数进行加密; - 同态减法:
由于减法可能会产生负数,所以用加法处理减法的操作无法避免计算结果为负数:
明文: s u m = a − b = a + ( − b ) sum = a - b = a +(-b) sum=a−b=a+(−b)
密文: E n c ( s u m ) = E n c ( a ) + E n c ( − b ) m o d n Enc(sum) = Enc(a) +Enc(-b) \mod n Enc(sum)=Enc(a)+Enc(−b)modn
此时如果 s u m sum sum为负数,则相当于对负数 s u m sum sum进行了加密,也就是说,由于密码方案的代数结构,解密就会出错,解密的结果则为: D e c ( E n c ( s u m ) ) = s u m + n , Dec(Enc(sum))= sum+n, Dec(Enc(sum))=sum+n,为什么只加一个 n n n,因为在FATE的加密方案中,明文 a , b a, b a,b均有限制( a < n / 3 − 1 a< n/3-1 a<n/3−1),这保证了二者之和(差)大致 满足:
− n / 3 < s u m < 2 n / 3 - n/3 <sum<2n/3 −n/3<sum<2n/3其实还是在一个 n n n 的范围内,所以进行一次减法是可以得到正确结果的。但是多次减法就可能有出错的风险,因此方案中经常选择一个足够大的 n n n来避免这种情况。