一个简单例子,理解CKKS中rescaling

CKKS近似同态加密方案作为leveled 同态方案,其中rescaling的步骤至关重要,

按照 Song 的介绍以及他们的文章,rescaling在密文乘运算后进行,一般是重线性化(relinearization)之后,重现性化这里不说了,直接看BFV方案的文章就可以,也就是通过额外引入relin_key, 使得密文乘运算后依然保证密文的规模不变依旧是(c0,c1),解密电路也依然是 c0+c1·s 。

Rescaling 的措施来自源于CKKS 方案在encode步骤中对明文多项式进行了scaliing(放大)假设scaling factor为delta,那么进行密文乘之后的密文 c_mul 具有对scaling factor 就变成了delta**2, 所以,如果不处理没几次乘法就会把Q域撑爆了。因此,这里的rescaling 说白了就是要把c_mul的缩放因子再变换回delta。

乍一看,觉得这不可能实现啊,数据大小不就变了么,

比如:500写作: 5*10, 那么50 *50=(5*10)*(5*10)=25*(10*10)= 25 * 100

而这里rescalling 的操作实际上是将 模数Q同步进行约减,而在约减后的模数域内其密文乘所具有的缩放因子 为delta 而不再是delta平方

 以刚才这个例子为准,假设一个密文(由于在CKKS中是对密文进行rescaliing操作,权且称为“密文”,可以理解为一个消息而已)为 5,放大后为50 = 5*10 此时 Q1=10000,例子如下:

Q1=10000
delta = 10
c1 = 5*delta
c2 = 5*delta
c_mul = (c1 * c2) % 10000 

print(c_mul)


# rescaling 
Q0 = Q1/delta
c_mul_rs = np.round(c_mul/delta) % Q0
print(c_mul_rs)


print((c_mul_rs/delta) % Q0)

输出:
2500
250.0
25.0

 其中250,c_mul_rs为在Q0域上的密文值,因此,在该层内进行“解密”(仅对c_mul 除一次delta),便可以得到25。而在Q1上c_mul为2500 则需要对其除两次delta。

因此通过这个例子,便能看出,rescale的目的就在于模数约减delta之后,对应密文乘的结果缩放因子 变回delta。

 

你可能感兴趣的:(网络协议,网络,密码学,同态加密,ckks)