本篇文章翻译于CKKS EXPLAINED, PART 3: ENCRYPTION AND DECRYPTION,主要介绍CKKS方案的加密和解密。

介绍

在上一篇 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构建同态加密方案,下一站,密文到密文的乘法!

CKKS Part3: CKKS的加密和解密的更多相关文章

  1. CKKS Part4: CKKS的乘法和重线性化

    本文翻译于CKKS EXPLAINED, PART 4: MULTIPLICATION AND RELINEARIZATION,主要介绍CKKS方案中的密文乘法和重线性化技术 介绍 在上一篇 CKKS ...

  2. CKKS Part2: CKKS的编码和解码

    该文章翻译自CKKS EXPLAINED, PART 2: FULL ENCODING AND DECODING,主要介绍CKKS方案中是如何编码和解码的(如何将复数向量转成整数多项式,以及如何求逆运 ...

  3. CKKS Part5: CKKS的重缩放

    本文翻译于 CKKS EXPLAINED, PART 5: RESCALING,主要介绍CKKS方案中最重要的技术- rescaling,重缩放技术 介绍 在CKKS的前一篇文章 CKKS Part4 ...

  4. ASP.NET加密和解密数据库连接字符串

    大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...

  5. 命令行工具aspnet_regiis.exe实现加密和解密web.config

    命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...

  6. 使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密

    在数据库实现加密与解密的文章,Insus.NET较早前也有写过,可以在本博客中可以搜索得到. 今天使用EncryptByPassPhrase和DecryptByPassPhrase来简单实现. 在数据 ...

  7. AES —— JAVA中对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  8. 通过ios实现RSA加密和解密

    在加密和解密中,我们需要了解的知识有什么事openssl:RSA加密算法的基本原理:如何通过openssl生成最后我们需要的der和p12文件. 废话不多说,直接写步骤: 第一步:openssl来生成 ...

  9. PHP 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密

    <?php /* 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密 */ // 加密 $algorithm = MCRY ...

随机推荐

  1. 1021 - Painful Bases

    1021 - Painful Bases   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB As ...

  2. '2'>'10'==true? JS是如何进行隐式类型转换的?

    前言 '2'>'10'返回的true,可能很多人都不是很能理解吧? 在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转 ...

  3. FineGAN

    目录 概 主要内容 隐变量 背景 轮廓 色彩和纹理 用于无监督分类 代码 Singh K., Ojha U. & Lee Y. FineGAN: Unsupervised Hierarchic ...

  4. Electron-Vue 项目使用Element的el-table组件不显示

    1.electron-vue文件夹下的webpack.renderer.config.js配置文件,你会找到这样一行代码,需要添加白名单! let whiteListedModules = ['vue ...

  5. [Git]解决Permission denied, please try again问题

    在gitlab上传项目的时候出现Permission denied, please try again问题, 网上有很多解释,但是都没能解决我的问题,后来经过自己尝试成功了,这里把经验分享给大家. 在 ...

  6. RTD2172方案|TYPEC转HDMI2.0转换器芯片|CS5265替代RTD2172

    RTD2172 USB Type-C到HDMI转换器结合了USB Type-C输入接口和数字高清多媒体接口(HDMI)输出.嵌入式微控制器(MCU)基于工业标准8051内核.接收器端口将信道配置(CC ...

  7. <数据结构>并查集与树

    作用 查:给定一个元素,查询它在哪个集合内 并:合并两个元素所在的集合 实现思路 对应关系 元素-->结点 集合-->树 多个集合-->森林 用树的根节点作为不同树的标志 合并时只需 ...

  8. 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态

    查看本章节 查看作业目录 需求说明: 使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态.点击列表的项,切 ...

  9. Storm对DRPC权限控制Version1.0.1

    对Storm的DRPC进行权限控制, 并且设计相应的测试验证. 1.集群安装 请参考Storm集群安装Version1.0.1 2.使用DRPC功能 请参考Storm集群使用DRPC功能Version ...

  10. Swoole 中使用 Atomic 实现进程间无锁计数器

    使用示例: $atomic = new Swoole\Atomic(); $serv = new Swoole\Server('127.0.0.1', '9501'); $serv->set([ ...