同态加密中的截断
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 方案的缺点是所有的计算只能得出大致正确的结果,这可能不是你想要的。
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 方案的缺点是所有的计算只能得出大致正确的结果,这可能不是你想要的。