同态加密中的截断

Truncation in Homomorphic Encryption

HELib、SEAL等同态加密库在不允许除法运算的情况下如何实现截断?

我有两个浮点数 a=2.3,b=1.5,我将其缩放为具有 2 位精度的整数。因此,我的编码器基本上看起来像这样 encode(x)=x*10^2。假设enc(x)是加密函数,那么enc(encode(a))=enc(230)enc(encode(b))=enc(150)

乘法后,我们得到了 a*b=enc(23*15)=enc(34500) 的巨大值,因为缩放因子也会相乘。这意味着我的输入呈指数增长,除非我可以截断结果,这样 trunate(enc(34500))=truncate(enc(345))

我认为这样的截断函数是不可能的,因为它不能用多项式表示。尽管如此,我想知道如何在数学上执行此截断是否有任何技巧,或者它是否只是一个未解决的问题?

在 BFV 和 BGV 方案中执行此类截断是可能的,但很难,并且在大多数用例中不太可能产生可接受的性能。这个问题与引导所述方案的复杂性密切相关;有关详细信息,请参阅 https://eprint.iacr.org/2018/067 and https://eprint.iacr.org/2014/873

另一方面,截断在 CKKS 方案(见 https://eprint.iacr.org/2016/421)中更容易实现,这是一种自然操作。然而,CKKS 方案的缺点是所有的计算只能得出大致正确的结果,这可能不是你想要的。