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

介绍

在上一篇 CKKS Part3: CKKS的加密和解密 ,我们看到了如何基于RLWE问题创建同态加密方案,实现同态加法和密文明文乘法。

虽然执行密文-明文乘法很容易,但正如我们将看到的,密文-密文要复杂得多。事实上,我们需要处理很多事情才能正确地完成它,比如找到正确的操作,这样一旦解密,我们就可以得到两个密文的乘积,以及管理密文的大小。

因此,本文将介绍密文乘法和重新线性化的概念,以减少生成的密文的大小。

基本概念

为了了解我们将如何在CKKS中执行密文-密文乘法,让我们回顾一下我们在前一篇文章中看到的内容。

首先,记住我们研究的是多项式空间\(R_{q}=\Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\)。我们将s作为我们的私钥,然后我们可以安全地输出一个公钥p=(b,a)=(−a. s+e,a),其中a均匀取样\(R_{q}\)、 e是一个小的随机多项式。

然后我们有\(\mbox{E}ncrypt\left( u,s \right)=c=\left( c_{0},c_{1} \right)=\left( u,0 \right)+p=\left( b+u,a \right)\in R_{q}^{2}\)是明文\(u \in \Zeta _{q}\left[ X \right]/\left( X^{N}+1 \right)\)使用公钥p的加密操作。要使用私钥s解密密文c,我们执行以下操作:$$Decrypt\left( c,s \right)=c_{0}+c_{1}.s=u+e$$

然后我们发现定义一个在密文上的加法运算\(_{}(c,c′)\)很容易,所以一旦我们解密\(_{}\) 我们将大致得到两个基本明文的加法。

实现这一点的方法是定义\(_{}\) 具体如下:$$\mbox{C}{Add}\left( c,c' \right)=\left( c{0}+c_{0}',c_{1}+c_{1}' \right)=c+c'=c_{add}$$

事实上,如果我们对其应用解密操作,我们会得到:$$Decrypt\left( c_{add},s \right)=c_{0}+c_{0}'+\left( c_{1}+c_{1}' \right).s=c_{0}+c_{1}.s+c_{0}'+c_{1}'.s=Decrypt\left( c,s \right)+Decrypt\left( c',s \right)约等于u+u'$$

这里我们看到,对密文做加法非常简单,我们只需要将两个密文相加,我们可以使用常规的解密操作来解密结果,以获得两个对应明文的相加。

我们将看到,在进行密文乘法时,乘法和解密操作都更加复杂。

密文-密文乘法

现在我们看到了这一点,我们看到我们的目标是找到操作\(_{},\), 对于两个密文c,c′我们有:\(DecryptMult\left( \mbox{C}_{Mult}\left( c,c' \right),s \right)=Decrypt\left( c,s \right).Decrypt\left( c',s \right)\),切记\(Decrypt\left( c,s \right)=c_{0}+c_{1}.s\),我们展开上面的式子得到:

\[Decrypt\left( c,s \right).Decrypt\left( c',s \right)=\left( c_{0}+c_{1}.s \right).\left( c_{0}'+c_{1}'.s \right)=c_{0}.c_{0}'+\left( c_{0}.c_{1}'+c_{0}'.c_{1} \right).s+c_{1}.c_{1}'.s^{2}=d_{0}+d_{1}.s+d_{2}.s^{2}
\]

其中\(d_{0}=c_{0}.c_{0}',d_{1}=\left( c_{0}.c_{1}'+c_{0}'c_{1} \right),d_{2}=c_{1}.c_{1}'\)

有趣的如果我们仔细想想,计算\(Decrypt\left( c,s \right)=c_{0}+c_{1}.s\),可以看作是关于私钥s的多项式求值,它是形式为\(c_0+c_1.S\)的一次多项式。S是多项式中的变量。

因此,如果我们看到两个密文乘积上的解密运算,它可以被看作是多项式$d_0+d_1.S+d_2.S^2,关于S的二次多项式

因此,我们可以使用以下操作来进行密文乘法:

\[\mbox{C}_{Mult}\left( c,c' \right)=c_{mult}=\left( d_{0},d_{1,}d_{2} \right)=\left( c_{0}.c_{0}',c_{0}.c_{1}'+c_{0}'.c_{1},c_{1}.c_{1}' \right)
\]
\[DecryptMult\left( c_{mult},s \right)=d_{0}+d_{1}.s+d_{2}.s^{2}
\]

使用这样的操作可能会有效,但有一个问题:密文的大小增加了!事实上,虽然密文通常只是几个多项式,但这里有3个多项式用于密文。通过使用与之前相同的推理,如果我们什么都不做,要正确解密下一个乘积,我们需要5个多项式,然后是9个,依此类推。因此,密文的大小将呈指数增长,如果我们这样定义密文-密文乘法,它在实践中将不可用。

我们需要找到一种不增加每一步密文大小的乘法方法。这就是重线性化的用武之地!

重线性化

我们可以把密文之间的乘法定义为运算:\(\mbox{C}_{Mult}\left( c,c' \right)=\left( d_{0},d_{1},d_{2} \right)\),问题是,现在的输出是一个维数为3的密文,如果我们在每次计算后继续增加密文的大小,那么在实践中使用它将变得不可行。

让我们想想,问题是什么?问题是我们需要第三个项\(d_2\),用于多项式解密\(DecryptMult\left( c_{mult},s \right)=d_{0}+d_{1}.s+d_{2}.s^{2}\),但如果我们能找到只有一个1次多项式作为解密去计算\(d_2.s^2\)的方法呢?那么在这种情况下,密文的大小将是恒定的,它们都将只是用到了两个多项式!

这就是重新线性化的本质:找到一对多项式\(\left( d_{0}',d_{1}' \right)=\mbox{Re}lin\left( c_{m\mu lt} \right)\),例如:$$Decrypt\left( \left( d_{0}',d_{1}' \right),s \right)=d_{0}'+d_{1}'.s=d_{0}+d_{1}.s+d_{2}.s^{2}=Decrypt\left( c,s \right).Decrypt\left( c',s \right)$$

具体来说,重线性化允许有一对多项式(s的一次方),而不是三对多项式(s的二次方),这样,解密时就只需要用到s,而不用s的平方,我们就可以得到两个明文的乘法。

因此,如果我们在每次密文-密文乘法后执行重线性化,我们将始终有相同大小的密文,具有相同的解密电路!

现在你可能想知道我们到底需要如何定义 。这个想法很简单,我们知道我们需要一对多项式,例如:\(d_{0}'+d_{1}'.s=d_{0}+d_{1}.s+d_{2}.s^{2}\),我们的想法是定义\(\left( d_{0}',d_{1}' \right)=\left( d_{0},d_{1} \right)+P\),其中P表示一对多项式,例如\(Decrypt\left( P,s \right)=d_{2}.s^{2}\)

这样,当我们用$(d′_0,d′_1)计算解密电路时,我们得到:

\[Decrypt\left( \left( d_{0}',d_{1}' \right),s \right)=Decrypt\left( \left( d_{0},d_{1},s \right) \right)+Decrypt\left( P,s \right)=d_{0}+d_{1}.s+d_{2}.s^{2}
\]

一种方法是提供一个计算密钥,用于计算P。使得\(evk=\left( -a_{0}.s+e_{0}+s^{2},a_{0} \right)\),其中\(e_0\)是一个小的随机多项式,\(a_0\)是一个在\(R_q\)上均匀采样的多项式,然后我们计算\(Decrypt\left( evk,s \right)=e_{0}+s^{2} 约等于 s^{2}\),太好了!我们可以看到,我们可以公开计算密钥,因为基于RLWE问题很难提取私钥,可以用来求s的平方项。

所以为了解密出\(d_{2}.s^{2}\), P可能是\(P=d_{2}.evk=\left( d_{2.}.\left( -a_{0}+e_{0}+s^{2} \right),d_{2}.a_{0} \right)\),的确正如我们所看到的那样\(Decrypt\left( P,s \right)=d_{2}.s^{2}+d_{2}.e_{0}\),这时我们可能会考虑\(d_{2}.s^{2}+d_{2}.e_{0}约等于d_{2}.s^{2}\)?

不幸的是,我们不能这样做,因为\(d_{2}.e_0\)项比我们通常得到的噪声要大得多。如果你之前注意到了,我们允许对结果进行近似,因为误差多项式很小,比如加入一个小多项,它不会对结果产生太大的影响。但问题是\(d_2\)很大,因为\(d_2=c_1.c_1'\),其中,每个\(c_1\)包括一个从\(R_q\)中采样的多项式a,因此,它比我们通常处理的小误差多项式要大得多。

那么,我们在实践中如何处理这个问题呢?诀窍是稍微修改计算密钥,并将其定义为\(evk=\left( -a_{0}.s+e_{0}+p.s^{2},a_{0} \right)(mod p.q)\),其中p是一个大整数,\(a_0\)从\(R_{q.p}\)中随机采样。这里的想法是,我们将除以p,以去除与\(d_2\)相乘时产生的噪声,即

\[\frac{Decrypt\left( evk,s \right)}{p}=\; \frac{e_{0}+p.s^{2}}{p}约等于s^{2}
\]

,因此最后我们使得:$$P=\left\lfloor p^{-1}.d_{2}.evk \right\rfloor\left( \mbox{mod}\ q \right)$$,这意味着我们将除以p并将其四舍五入到最接近的整数,然后使用模q(而不是p.q)。

\[Decrypt\left( P,s \right)=p^{-1}.d_{2}.e_{0}+d_{2}.s^{2}约等于d_{2}.s^{2}
\]

,因为\(p^{-1}.d_2.e_0\)很小,可以约去!

我们终于有了合适的方法了!因此,为了定义重线性化,我们需要一个计算密钥(可以在没有风险的情况下公开),我们将其定义为:\(\mbox{Re}lin\left( \left( d_{0},d_{1},d_{2},evk \right) \right)=\left( d_{0},d_{1} \right)+\left\lfloor p^{-1}.d_{2}.evk \right\rfloor\)。可以看到,重线性化后的密文由三维变二维。

因此,如果我们有两个密文c,c′,并且我们想要将它们相乘(可能几次),然后解密结果,那么工作流程将是:

1、相乘:\(c_{m\mu lt}=\mbox{C}_{Mult}\left( c,c' \right)=\left( d_{0},d_{1},d_{2} \right)\)

2、重线性化:\(c_{\mbox{re}lin}=\mbox{Re}lin\left( \left( d_{0},d_{1},d_{2} \right),evk \right)\)

3、解密输出:\(u_{m\mu lt}=Decrypt\left( c_{m\mu lt},s \right)约等于u.u'\)

我在这里只给出了总体思路,但如果您有兴趣了解细节,我建议您阅读"Somewhat Practical Fully Homomorphic Encryption".一文中的解释。

现在我们知道了如何将两个密文相乘,并保持它们的大小不变。太好了!虽然你可能认为这一切都结束了,但我们会看到,要实现同态加密方案,还有最后一步要做:rescaling,重新缩放。在我们自己编写代码之前,我们将在下一篇文章中看到什么是重缩放,以及如何进行重缩放!

CKKS Part4: CKKS的乘法和重线性化的更多相关文章

  1. CKKS Part5: CKKS的重缩放

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

  2. CKKS Part3: CKKS的加密和解密

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

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

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

  4. Tenseal库

    在此记录Tenseal的学习笔记 介绍 在张量上进行同态计算的库,是对Seal的python版实现,给开发者提供简单的python接口,无需深究底层密码实现. 当前最新版本:3.11 位置:A lib ...

  5. CKKS加密方案

    本文内容来自"Protecting Privacy throughHomomorphic Encryption",主要学习里面的CKKS部分. CKKS是一种同态加密方案,其安全性 ...

  6. CKKS :Part1,普通编码/解码

    这篇文章,翻译于:[CKKS EXPLAINED: PART 1, VANILLA ENCODING AND DECODING] 主要介绍为CKKS中编码/解码做铺垫,讲一些基础知识 介绍 同态加密是 ...

  7. SIMD编码/解码

    在看SEAL库和HElib库中经常在编码中碰到打包(batch)技术,另外还提到了SIMD编码技术,有点困惑,编码.打包.SIMD到底有什么关系? 编码 在CKKS方案中,因为明文空间在复数域上,简单 ...

  8. HEAAN库学习

    本文主要学习HEAAN同态库,选择最老的一版:地址,最新版在:位置,HEAAN是CKKS17论文的主要代码复现. 版本 1.地址这是最老的一版,对应的论文CKKS17 2.在1的基础上,实现了boot ...

  9. Packed Ciphertexts in LWE-based Homomorphic Encryption:解读

    本节内容记录阅读该论文的笔记 介绍 首先,介绍了两种明文"打包"的方法:PVW和SV PVW:对应论文(PVW:A framework for efficient and comp ...

随机推荐

  1. 【Java例题】3.4求a+aa+aaa+aaaa+... ...+aa...a(n个

    4. package chapter3; import java.util.*; public class demo4 { public static void main(String[] args) ...

  2. Bayesian Optimization with a Finite Budget: An Approximate Dynamic Programming Approach

    目录 概 主要内容 Lam R, Willcox K, Wolpert D H, et al. Bayesian Optimization with a Finite Budget: An Appro ...

  3. rabbitmq-安装部署及基础操作

    rabbitmq 官网: https://www.rabbitmq.com/ yum 安装 rabbitmq # centos7 # In /etc/yum.repos.d/rabbitmq.repo ...

  4. [linux]ubuntu18.04 屏幕分辨率不适应问题

    今天换了新显示器,发现更大的屏幕不适应原有的屏幕分辨率,看起来特别变扭. 在设置处查看最高分辨率仅为1024*748,没有与屏幕相适应的1920*1080(16:9). 解决方式: 1. 终端输入命令 ...

  5. JDK HttpClient 多重请求-响应的处理

    HttpClient 多重请求-响应的处理 目录 HttpClient 多重请求-响应的处理 1. 简述 2. 请求响应流程图 3. 用户请求的复制 4. 多重请求处理概览 5. 请求.响应过滤的执行 ...

  6. linux 设置开机自动启动应用

    作为一个开发,项目现在一般都是部署在虚拟机上的linux,数据库也是按照在l虚拟机上的linux,一旦关机了,在开机程序都没打开,又要一个个去开,很麻烦,所以现在我现在使用supervisor去做一个 ...

  7. 【优雅代码】07-spring下的优秀工具类

    [优雅代码]07-spring下的优秀工具类 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点 ...

  8. 《手把手教你》系列技巧篇(五十四)-java+ selenium自动化测试-上传文件-中篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...

  9. Count Sequences

    \(考虑问题的转换,即把用n个球,分为r-l+2个部分,其中第1部分表示该区域的球值为l,第二部分表示该区域的球值为l+1\) \(......第r-l+2部分为不选该区域的球\) \(该问题等价于在 ...

  10. 《python深度学习》(高清、源码).PDF,免费无需任何解压密码

    链接:https://pan.baidu.com/s/1zx20XEpPBJeBG2e1IGMc6g 提取码:wub3