Bootstrapping原理学习

概括

把一个满噪音的FHE的密文加密进另一个FHE密文中,并且同态计算FHE的解密算法,把里层的密文解密还原为原文,就能获得一个全新的低噪音FHE密文。

一次bootstrapping的过程

  1. 首先生成多组密钥(以两组为例) ( p k 1 , s k 1 ) , ( p k 2 . s k 2 ) (pk_1,sk_1),(pk_2.sk_2) (pk1,sk1),(pk2.sk2)
  2. 假定明文为 m m m,首先用第一组密钥进行加密得到 E n c p k 1 ( m ) Enc_{pk_1}(m) Encpk1(m),初始得到的噪声很低,随着不断的同态计算将得到一个达到噪声临界值的密文 C f ( m ) = E n c p k 1 ( f ( m ) ) C_{f(m)} = Enc_{pk_1}(f(m)) Cf(m)=Encpk1(f(m)),也就是说如果再进行一次同态计算就将导致解密失败。
  3. 接着,将这个密文用 p k 2 pk_2 pk2进行加密得到 E n c p k 2 ( C f ( m ) ) Enc_{pk_2}(C_{f(m)}) Encpk2(Cf(m))
  4. 然后使用一个加密后的密钥 E n c p k 2 ( s k 1 ) Enc_{pk_2}(sk_1) Encpk2(sk1),使用 E n c p k 2 ( C f ( m ) ) Enc_{pk_2}(C_{f(m)}) Encpk2(Cf(m)) E n c p k 2 ( s k 1 ) Enc_{pk_2}(sk_1) Encpk2(sk1) 进行同态运算 D e c s k 1 ( C f ( m ) ) Dec_{sk_1}(C_{f(m)}) Decsk1(Cf(m))。这样一来可以得到 E n c p k 2 ( D e c s k 1 ( C f ( m ) ) ) = E n c p k 2 ( C f ( m ) ) Enc_{pk_2}(Dec_{sk_1}(C_{f(m)})) = Enc_{pk_2}(C_{f(m)}) Encpk2(Decsk1(Cf(m)))=Encpk2(Cf(m)),这样一来,当前的噪声已经不是达到限度的那个噪声了,而是一次同态运算后产生的新的噪声,也就变相的削弱了噪声。

同理,可以继续嵌套这个过程,等到每一波同态计算噪音极限后,再次Bootstrapping来计算更复杂的函数。
当然,这里存在一个小缺点,那就是在生成参数的时候需要事先准备好Bootstrapping的链条,即生成公钥私钥对 { p k i , s k i } \{pk_i,sk_i\} {pki,ski},并且公开对应的私钥 s k i sk_i ski加密在下的密文 p k i + 1 pk_{i+1} pki+1。所以作为第三方,我们仍然不能计算任意深度的电路,因为计算的深度在进行公共参数生成的阶段已经被决定好了。
解决方案可以使用循环密钥,以双密钥的系统来说 ( p k 1 , s k 1 ) , ( p k 2 . s k 2 ) (pk_1,sk_1),(pk_2.sk_2) (pk1,sk1),(pk2.sk2),同时公开在 p k 2 pk_2 pk2加密下的 s k 1 sk_1 sk1 p k 1 pk_1 pk1加密下的 s k 2 sk_2 sk2,然后无限循环即可。

还可以使用一组密钥即可完成,也就是公开 p k 1 pk_1 pk1加密下的 s k 1 sk_1 sk1,接着循环调用即可。

上述Bootstrapping过程称为Circuit Bootstrapping,还有一种Gate Bootstrapping,即每当进行一次最简单的同态计算,就进行一轮的Bootstrapping把噪声值还原到进行计算前的量,这个可以在应用层之下实现Bootstrapping。

参考

初探全同态加密之四:Bootstrapping的原理与实现

Computing Arbitrary Functions
of Encrypted Data By Craig Gentry

你可能感兴趣的:(密码学,同态加密)