介绍

在上一篇 CKKS Part2: CKKS的编码和解码 中,我们看到了如何实现CKKS的编码器和解码器,这使我们能够将向量转换为多项式,反之亦然。这一步是必要的,因为我们将看到,与直接使用向量相比,使用多项式构建同态加密方案要高效得多。

在本文中,我们将看到如何使用困难问题,例如LWE或RLWE来构建近似同态加密方案。CKKS使用近似算法而不是精确算法,这意味着一旦我们完成计算,我们可能会得到与直接计算略有不同的结果。这意味着,如果你加密2和3,将其密文相加,然后解密,你可能会得到4.99或5.01,但不是5。其他方案,如BFV是精确的,这意味着他们将产生正好5。

那为什么要用CKKS呢?CKKS更适用于实数运算,我们可以得到近似但接近的结果,而BFV更适用于整数运算。

在本文中,我们将看到如何使用LWE和RLWE实现近似算术同态加密方案的加密和解密。

LWE

CKKS是一种公钥加密方案,其中生成一个私钥和一个公钥。公钥用于加密,可以共享,私钥用于解密,必须保密。

CKKS的基础和许多其它同态加密方案,是在论文 On lattices, learning with errors, random linear codes, and cryptography 中引入的误差学习(LWE)问题,它最初是在格上、误差学习、随机线性码和密码学中引入的。LWE问题是区分形式为\((a_i,b_i)=(a_i,<a_i,s>+e_i)\)的噪声对和随机选取的(a_i,b_i)。这是\(a_{i},s\in Z_{q}^{n}\),ai是随机采样,s是我们的私钥,\(e_i∈ℤ^q\)是噪声,通常是高斯噪声,用来使问题变得更难。如果我们不引入e,这个问题会更容易解决,因为我们可以使用高斯消去法来解线性方程组。

众所周知,LWE问题和最坏情况下的格上问题一样困难,后者目前可以抵御量子计算机的攻击。因此,我们可以利用这样一个事实,即从成对的\((a_i,<a_i,s>+e_i)\)中找到一个秘密s是困难的,并在此基础上构建一个密码系统。

假设我们已经生成了一个私钥s∈ℤ,,并发布n对类型\((a_i,<a_i,s>+e_i)\),可以用矩阵形式写成(A,A.s+e)和\(A∈ℤ^{n×n}_q\)\(e∈ℤ^n_q\)。正如LWE问题所述,很难从这对信息中恢复私钥,因此我们可以使用它来创建公钥。

实际上,我们将使用p=(−A.s+e,A)作为我们的公钥,可以公开使用,因为密钥很难从中提取。我们选择了储存−A.s.而不是A.s.是为了方便,我们将在后面看到,但这并不能改变问题。

然后对消息\(m∈ℤ^n_q\)使用公钥和私钥进行加密和解密,我们可以使用以下方案:
使用p对m进行加密:输出\(c=\left( \mu ,0 \right)+p=\left( \mu -A.s+e,A \right)=\left( c_{0,}c_{1} \right)\)
使用s对c进行解密,输出\(u'=c_{0}+c_{1}.s=\mu -A.s+e+A.s=\mu +e 约等于u\)

所以在加密阶段,我们使用公钥来屏蔽我们的消息。因此,消息隐藏在密文的第一个元素中,并带有掩码−A.s。请记住,A是均匀采样的,因此它确实可以有效地屏蔽μ。要删除它,我们可以使用c的第二个坐标,它只存储A,并将其与密钥s结合,以获得μ+e的解密。注意这里我们并没有得到原始信息μ,而是μ加上一些噪声e,这就是为什么我们说我们有一个近似的算术方案。如果e足够小,那么解密将接近原始μ。

因此,我们在这里看到了如何使用LWE问题来构建一个公钥密码方案,该方案可以抵御量子攻击。上述实现的问题在于,私钥大小\(\Theta \left( n \right)\) ,则公钥大小由于矩阵A和计算操作为\(\Theta \left( n^{2} \right)\)。由于n将决定我们方案的安全性,如果我们使用LWE来构造我们的方案,它在实践中效率太低,密钥的大小\(\Theta \left( n^{2} \right)\)和复杂性会使其变得太不切实际。

RLWE

这就是为什么我们会考虑在理想格上引入误差问题的环学习和环上误差的学习,这是LWE的一个变种,但在环上。即所有的运算不是向量\(\Zeta _{q}^{n}\)之间的运算,而不是在环上\(\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\),N是2的次幂。现在a,s,e从\(\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\)上采样,其中a仍然均匀采样,s是一个小秘密多项式,e是一个小噪声多项式。切换到RLWE有两个主要优点:
密钥大小不再是二次的,而是线性的,因为我们现在输出公钥p=(−a.s+e,a),其中a.s表示a与s的多项式乘积。因为所有操作都是在多项式之间完成的,所以私钥和公钥的大小都是一样的\(\Theta \left( n \right)\)
乘法是在多项式上进行的,因此它的复杂性为\(\Theta \left( n\log \left( n \right) \right)\)使用Discrete Fourier Transform for polynomial multiplication,离散傅里叶变换进行多项式乘法,而不是\(\Theta \left( n^{2} \right)\)因为我们必须做矩阵向量乘法。

因此,通过使用RLWE而不是LWE,我们将获得更小的密钥,运算速度将更快,因此前面的方案变得更加实用。此外,RLWE仍然是一个难题,并提供了强大的安全保障,因此使用RLWE仍然提供了一个安全方案。

我们知道为什么使用多项式很重要,因为它们为高效安全的方案提供了基础。所以你现在可以理解为什么我们要费尽心机把向量转换成多项式\(\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\),反之亦然,因为我们现在可以利用多项式环的代数结构。

同态计算

现在,我们已经明白了为什么我们要研究\(\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\),以及如何基于此获得加密方案,让我们看看如何在密文上定义加法和乘法,从而获得同态加密方案。

所以我们说我们有一个私钥s和一个公钥p=(b,a)=(−a.s+e,a)。要加密消息μ,我们只需输出c=(μ+b,a),要用s解密它,我们计算c0+c1.s将大致给出原始信息。

加法

现在假设我们有两条消息μ和μ′,我们将它们加密为\(c=(c_0,c_1)\)\(c′=(c′_0,c′_1)\)。那么\(c_{add}=c+c′=(c_0+c′_0,c_1+c′_1)\)是μ+μ′的正确加密,也就是说,当我们用s解密它时,我们得到(近似地)μ+μ′。

事实上,\(c_{add}\)的解密机制产生了$$c_{add,0}+c_{add,1}.s=c_{0}+c_{0}'+\left( c_{1}+c_{1}' \right).s=c_{0}+c_{1}.s+c_{0}'+c_{1}'.s=u+u'+2e约等于u+u'$$因为我们说过e可以忽略不计。

这意味着,如果你将密文相加,然后解密,你将得到明文的相加!这意味着,通过这个简单的方案,您可以允许某人对加密数据执行加法操作,用户仍然可以解密数据并获得正确的结果。这是我们走向同态加密方案的第一步。

乘法

尽管如此,我们仍然需要定义密文上的乘法,这更复杂。实际上,我们的目标是找到一个密文结果\(c_{mult}\),这样当我们用私钥s解密它时,我们就得到了明文的乘积。

因为两个密文相乘更复杂,我们现在将首先关注密文与明文相乘,并在后面的文章中了解如何在密文之间进行相乘。

假设我们有一个明文μ,加密成密文\(c=(c_0,c_1)\)和一个明文μ′。然后,为了获得乘法的密文,我们只需要输出\(c_{mult}=(μ′.c_0,μ′.c_1)\)

事实上,当我们解密\(c_{mult}\)时$$u'.c_{0}+u'.c_{1}.s=u'.\left( c_{0}+c_{1}.s \right)=u'.\left( u+e \right)=u'.u+u'.e约等于u'.u$$

因此,通过这加密数据和明文进行加法和乘法的实现,一旦我们对其进行解密,我们就会得到与对明文数据执行相同操作的结果。

因为我们还有一些操作需要解决,比如密文乘法、重新线性化和重缩放,所以我们现在还不介绍代码实现。一旦我们拥有了所有的构建块,我们将把所有东西放在一起,形成一个端到端的近似同态加密方案,类似于CKKS!

所以我希望你们理解了如何使用RLWE构建同态加密方案,下一站,密文到密文的乘法!

02-06 09:52