本篇文章翻译于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. TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题

    上一篇文章我们介绍了通过神经网络来处理一个非线性回归的问题,这次我们将采用神经网络来处理一个多元分类的问题. 这次我们解决这样一个问题:输入一个人的身高和体重的数据,程序判断出这个人的身材状况,一共三 ...

  2. 【嵌入式AI】全志 XR806 say hello world

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文介绍了全志 ...

  3. Pikachu靶场SSRF学习

    下载Pikachu靶场:https://github.com/zhuifengshaonianhanlu/pikachu Windows用phpstudy也行,记得要改config.inc文件 打开S ...

  4. PS8625替代方案CS5211|CS5211可以替代兼容PS8625方案|DP转LVDS芯片方案

    PS8625|Parade普瑞 PS8625|Parade普瑞 PS8625芯片|Parade普瑞 PS8625方案|Parade普瑞 PS8625芯片代理|DP转LVDS|PS8625替代方案CS5 ...

  5. Eclipse导入Zookeeper源码Version2017.11.3

    将Zookeeper源码导入Eclipse, Zookeeper源码需要使用ant构建后才能导入Eclipse, 和Solr的源码一样也是使用ant构建的, 大部分可以参考Eclipse导入Solr源 ...

  6. 首次分享,大厂资深测试做Api接口自动化测试的关键思路都在这里了

    引言 与UI相比,接口一旦研发完成,通常变更或重构的频率和幅度相对较小.因此做接口自动化的性价比更高,通常运用于迭代版本上线前的回归测试中. 手工做接口测试,测试数据和参数都可以由测试人员手动填写和更 ...

  7. Swoole 中使用 PDO 连接池、Redis 连接池、Mysqli 连接池

    连接池使用说明 所有连接池的实现均基于 ConnectionPool 原始连接池: 连接池的底层原理是基于 Channel 的自动调度: 开发者需要自己保证归还的连接是可重用的: 若连接不可重用,需要 ...

  8. CSS实战 模拟 新闻列表

    总结:所使用的知识点:1.padding应用以及box-sizing: border-box自动内减撑大的盒子 2.ul>li 的使用,去除黑圆圈 3.a标签的使用,去除默认样式<下划线& ...

  9. Linux登录时,下游回显非常慢

    问题现象 登录linux时,远程连接正常,[root@...]回显非常慢,在执行脚本时,很容易导致命令下发错乱 原因分析 家目录下的.bash_history文件太大,导致每次登陆时读取这个文件耗时太 ...

  10. Limiting Command Size

    Next: Controlling Parallelism, Previous: Unusual Characters in File Names, Up: Multiple Files [Conte ...