CKKS EXPLAINED, PART 3 ENCRYPTION AND DECRYPTION
# CKKS EXPLAINED, PART 3: ENCRYPTION AND DECRYPTION
# Introduction
在之前的文章中,CKKS解释了第二部分:完整的编码和解码,我们看到了如何实现CKKS的编码器和解码器,这使我们能够将向量转换为多项式,反之亦然。==这一步骤是必要的,因为我们将看到,与直接使用向量相比,使用多项式来构建同态加密方案要高效得多==。
在本文中,我们将看到如何利用困难问题,如LWE或RLWE来构建一个近似同态加密方案。CKKS使用近似算术而不是精确算术,这意味着一旦我们完成计算,我们可能会得到一个略有不同于直接进行计算的结果。这意味着如果您加密了2和3,将它们的密文相加,然后解密,您可能会得到类似于4.99或5.01但不是5的结果。而其他方案,如BFV是精确的,这意味着它们将产生确切的5。
那么为什么要使用CKKS呢?CKKS更适用于实数上的算术运算,其中我们可以得到近似但接近的结果,而BFV更适用于整数上的算术运算。
在本文中,我们将看到如何利用LWE和RLWE实现近似算术同态加密方案的加密和解密过程。
# Learning with Error
CKKS是一种公钥加密方案,其中生成了一个秘钥对,包括一个私钥和一个公钥。公钥用于加密并可以共享,而私钥用于解密并必须保密。
LWE(Learning With Error)是CKKS的基础,也是许多其他同态加密方案的基础之一。LWE问题最初由Regev在论文《On lattices, learning with errors, random linear codes, and cryptography》中引入。LWE问题是要区分形式为
在解释LWE(Learning With Errors)问题之前,让我们先明确一些基本概念。
符号说明:
:一个在有限域 中随机选取的向量。 :一个固定的、未知的秘密向量,同样在 中。 :向量 和向量 的内积。 :一个小的噪声项或误差,通常是从某个较小的范围(例如高斯分布)中选取。 :计算为 ,即向量内积加上噪声。
LWE问题的描述
在LWE问题中,我们得到的是一系列的样本对
是随机向量。 是 和一个秘密向量 的内积,再加上一个小的误差 。
任务是区分这些样本对是否是从以下两种情况之一生成的:
- 结构化生成:即对是按照
的规则生成,这里包含了一个固定的秘密向量 和一个噪声项 。 - 随机生成:即对
是完全随机从 中选取的,没有任何固定模式或内在结构。
目标和挑战
LWE问题的核心挑战是,尽管
因此,LWE问题的目标是检验给定的样本对是否含有足够的信息来区分这两种情况,==即分形式为
假设我们已生成了一个保密的秘钥
实际上,我们将使用
然后,为了使用公钥和私钥加密和解密一个消息
- 使用公钥
对 进行加密:输出 。 - 使用私钥
对 进行解密:输出 。
因此,在加密阶段,我们使用公钥来对消息
因此,我们已经看到如何利用 LWE 问题构建一个安全防御量子攻击的公共加密方案。上述实现的问题在于,虽然秘密密钥的大小为
# Ring Learning with Error
因此,我们将考虑《On Ideal Lattices and Learning with Errors Over Rings》中介绍的Ring Learning With Error(RLWE)问题,它是LWE在环上的一种变体。我们不再使用
- 公钥大小不再是二次的,而是线性的,因为我们现在输出公钥
,其中 表示 与 的多项式乘积。由于所有操作都是在多项式之间进行的,私钥和公钥的大小都是 。 - 乘法是在多项式上进行的,因此可以使用离散傅立叶变换进行多项式乘法,复杂度为
,而不是 ,因为我们需要进行矩阵-向量乘法。
因此,通过使用RLWE而不是LWE,我们可以获得更小的密钥,并且操作速度更快,因此前面的方案变得更加实用。此外,RLWE仍然是一个困难问题,并提供强大的安全性保证,因此使用RLWE仍然提供了一个安全的方案。
现在我们明白了为什么使用多项式是重要的,因为它们为高效和安全的方案提供了基础。因此,现在你可以理解为什么我们要费力地将向量转换为
# Homomorphic operations
现在我们已经了解了为什么要在
我们说过我们有一个秘密
# Addition
假设我们有两个消息
确切地说,对
这里我们假设
这意味着,如果你对密文进行加法操作,并将其解密,你将得到明文的加法结果!这意味着通过这个简单的方案,你可以允许某人在加密的数据上进行加法操作,而用户仍然可以解密它并得到正确的结果。这是我们朝着同态加密方案迈出的第一步。
# Multiplication
然而,我们仍然需要定义密文上的乘法,这更加复杂。事实上,我们的目标是找到一个密文
由于两个密文的乘法更加复杂,我们现在将重点放在将密文与明文相乘上,并在以后的文章中看看如何在密文之间进行乘法运算。
假设我们有一个明文
确实,当解密
因此,通过这种加法和乘法的实现,我们已经看到可以加密一些数据,对其进行操作,然后解密后得到与对明文数据进行计算相同的结果。
由于我们还有一些其他概念要解决,例如密文-密文乘法、重线性化和重新缩放,我们暂时不会涵盖代码实现。一旦我们掌握了所有的基本组件,我们将把一切都组合在一起,构建一个端到端的近似同态加密方案,类似于CKKS!
所以我希望你理解了如何使用RLWE构建同态加密方案,并且下一步是密文-密文乘法!