CKKS EXPLAINED, PART 4: MULTIPLICATION AND RELINEARIZATION
Introduction
在之前的文章《解释CKKS,第3部分:加密和解密》中,我们看到了如何基于RLWE问题创建同态加密方案,并实现同态加法和密文-明文乘法。
尽管密文-明文乘法很容易实现,但密文-密文乘法要复杂得多,正如我们将看到的。事实上,我们需要处理许多事情,例如找到合适的操作,使得解密后我们得到两个密文的乘积,并管理密文的大小。
因此,本文将介绍密文-密文乘法和重线性化的概念,以减小结果密文的大小。
Recap of basic operations
为了了解在CKKS中如何进行密文-密文乘法,让我们回顾一下在之前的文章中所讨论的内容。
首先,请记住我们在多项式空间
然后,我们有加密操作
为了使用秘密密钥解密密文
然后,我们看到定义密文加法
具体做法是将
实际上,如果我们对其应用解密操作,我们会得到:
在这里,我们可以看到密文的加法操作非常简单,我们只需要将两个密文相加,然后使用常规的解密操作对结果进行解密,以获得两个底层明文的加法。
当进行密文-密文乘法时,我们将看到乘法和解密操作都更加复杂。
Ciphertext-ciphertext multiplication
现在我们已经看到了,我们的目标是找到操作
请记住,
其中
有趣!如果我们思考一下,将
因此,如果我们将对两个密文乘积的解密操作视为在秘密密钥
因此,我们可以使用以下操作来进行密文-密文乘法:
使用这样的操作可能有效,但是存在一个问题:密文的大小增加了!实际上,虽然密文通常只包含几个项式,但在这里,我们的密文有3个项式。根据之前的推理,如果我们不采取任何措施,在正确解密下一个乘积时,我们将需要5个项式,然后是9个项式,以此类推。因此,密文的大小将呈指数级增长,并且如果我们采用这种方式来定义密文-密文乘法,它在实践中将无法使用。
我们需要找到一种方法,在每一步中进行乘法而不增加密文的大小。这就是重线性化的作用!
Relinearization
我们注意到,可以将密文之间的乘法定义为操作
那么问题是什么?问题在于我们需要第三个项,即用于多项式解密的
这就是重线性化的核心:找到一对多项式
换句话说,重线性化允许我们拥有一对项式,而不是三对项式,一旦使用只需要秘密密钥而不需要其平方的常规解密电路解密它们,我们就能得到两个底层明文的乘积。
因此,如果我们在每个密文-密文乘法之后执行重线性化,我们将始终拥有相同大小的密文,并使用相同的解密电路!
现在你可能想知道我们如何定义Relin才能获得这样的结果。思路很简单,我们知道我们需要一对多项式,使得
这样,当我们对
一个方法是提供一个评估密钥,用于计算
因此,
不幸的是在实践中,我们无法直接处理该问题,因为
那么在实践中我们如何解决这个问题呢?方法是对评估密钥(evaluation key)进行一些修改,定义为
好了,最终我们终于有了候选解决方案!对于重线性化(relinearization)的定义,我们需要一个评估密钥(可以公开使用而不会带来风险),定义为:
所以,如果我们有两个密文
将它们相乘:
进行重线性化:
解密输出:
我在这里给出了整体的思路,但如果您对细节感兴趣,我建议阅读论文《Somewhat Practical Fully Homomorphic Encryption》中的解释。
现在,我们知道了如何将两个密文相乘并保持它们的大小不变。太棒了!虽然您可能认为这已经结束了,但在实现同态加密方案之前,我们还需要进行最后一步:重新缩放(rescaling)。在下一篇文章中,我们将了解什么是重新缩放以及如何进行操作,然后再着手编写我们自己的代码!


评论区
欢迎分享你的思考、补充或问题。