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

介绍

在CKKS的前一篇文章 CKKS Part4: CKKS的乘法和重线性化 中,我们了解了密文乘法在CKKS中的工作原理,为什么需要重新线性化输出以及保持恒定的密文大小,以及如何做到这一点。

尽管如此,正如我们将看到的,我们需要一个名为“重缩放”的最终操作来管理噪音并避免溢出。这将是本系列的最后一篇理论性文章,在下一篇也是最后一篇文章中,我们将用Python实现所有内容!

为了了解它是如何工作的,我们首先要有一个整体图,然后再详细了解它是如何工作的。

模数链的高级视图

到目前为止,我们已经深入挖掘了CKKS的细节,但对于这一点,我们将后退一步。CKKS使用我们所说的level,级数,也就是说,在噪声太大而无法正确解密输出之前,所允许的有限乘法次数。

你可以想象这是一个油箱。最初,油箱充满了汽油,但当你执行越来越多的操作时,汽油将被排空,直到没有剩余的汽油,就不能再做任何事情。同样的道理也适用于同态加密方案:你先从一定量的汽油开始,但当你进行乘法时,汽油越来越少,直到用完为止,你不能再执行任何操作。

下图说明了这一点。当你开始的时候,你的初始油箱已经满了。但当你们执行乘法和重缩放时,你们会降低级数,这相当于消耗了你们的一些汽油。如果你从L层开始,表示为\(q_L,q_{L−1},…,q_1\),处于级别\(q_l\)意味着还剩下\(l\)个乘法,执行一个乘法会将级别从\(q_l\)降低到\(q_{l−1}\).



现在,一旦你的汽油用完了,就像在现实生活中一样,你可以把油箱加满,这样你就可以在路上走得更远。此操作称为bootstrap,引导,本文将不介绍它。因此,如果我们假设我们不可能重新加注油箱,那么在使用有限级同态加密方案时,必须考虑一个有趣的方面:您需要提前知道将要进行的乘法数量!

事实上,就像在现实生活中一样,如果你打算走很远的路,你将需要比你只是在附近走走更多的汽油。同样的道理也适用于这里,根据需要执行的乘法次数,您必须调整油箱的大小。但是油箱越大,计算就越繁重,你的参数也就越不安全。事实上,就像在现实生活中一样,如果你需要一个更大的油箱,它会更重,这会使事情变得更慢,同时也会降低安全性。

我们不会详细讨论所有细节,但知道CKKS方案的难度取决于比率\(N/q\),N是多项式的阶数,也就是向量的的大小;q是多项式系数模数,即我们的油箱大小。

因此,我们需要的乘法越多,油箱就越大,我们的参数就越不安全。为了保持相同的安全强度,我们需要增加N,这将增加我们操作的计算成本。(不是增加q么?)

下面的图,从 Microsoft Private AI Bootcamp 中,展示了在使用CKKS时必须考虑的折衷,显示了多项式次数和模数的安全性之间的关系。为了保证128位的安全性,我们必须增加多项式次数,即使我们不需要它提供的“额外插槽”【是明文槽么?】,因为增加模数可能会使我们的参数不安全。

因此,在我们进入更理论的部分之前,让我们看看关键的收获是什么:

1、重缩放和噪音管理可以被视为管理一个油箱,你从一个初始预算(油量)开始,使用(做乘法)后预算(油量)将会减少,如果汽油用完了,你就什么都做不了。

2、你需要提前知道你将进行多少次乘法,这将决定油箱的大小,这将影响你将使用的多项式次数的大小。

背景

现在,我们看到了整体图,让我们深入了解为什么以及如何运作。

如果你正确地记得 CKKS Part2: CKKS的编码和解码 第二部分关于编码的内容,如果我们有一个初始向量z,它在编码过程中乘以一个缩放因子Δ,以保持一定的精度。

因此,包含在明文μ和密文c的基本值是\(Δ.Z\),所以当我们把两个密文c和c'相乘时,最后的结果是\(z.z'.\Delta ^{2}\),所以它包含了缩放因子的平方,当缩放因子指数增长时,经过几次乘法后可能会导致溢出。此外,正如我们之前看到的,每次乘法后噪声都会增加。

因此,重缩放操作的目标实际上是保持缩放因子恒定,同时减少密文中存在的噪声。

普通做法

那么我们如何解决这个问题呢?要做到这一点,我们需要了解如何定义q。记住,这个参数q被用作多项式环\(R_{q}=Z_{q}\left[ X \right]/\left( X^{N}+1 \right)\)中系数的模数。

正如高级视图中所述,q比作一个汽油箱的大小,我们将逐步进行计算,清空该汽油箱。

如果我们假设我们用一个缩放因子Δ,进行L次乘法,那么我们将q定义为:\(q=\Delta ^{L}.q_{0}\),其中\(q_{0}\geq \Delta\),这将决定小数部分之前需要多少整数位。实际上,如果我们假设小数部分需要30位精度,整数部分需要10位精度,我们将设置:

一旦我们为整数和小数部分设置了我们想要的精度,选择了我们想要执行的乘法的数量L,就能相应地求得q,接下来很容易定义重缩放操作,我们只需对密文进行分割和取整。

事实上,假设我们在一个给定的级数\(l\),那么模是\(q_l\)。我们有密文\(c\in R_{q_{_{l}}}^{2}\),然后我们可以定义从\(l\)级到\(l-1\):

\[R\mbox{S}_{l->l-1}\left( c \right)=\left\lfloor \frac{q_{l-1}}{q_{l}}.c \right\rfloor\left( \mbox{mod}\; q_{l-1} \right)=\left\lfloor \Delta ^{-1}.c \right\rfloor\left( \mbox{mod}\; q_{l-1} \right)
\]

因为\(q_l=\Delta ^{l}.q_{0}\)

因此,通过这样做,我们可以做到两件事:

1、一旦我们解密了两个密文c,c′的乘积,以及对应底层明文值\(\Delta .z,\Delta .z'\),应用重缩放后,我们有\(\Delta .z.z'\),因此,只要我们在每次乘法后重缩放,在整个计算过程中,缩放因子保持不变。

2、噪声被减少了,因为我们既分割底层的明文值,也分割了解密时的噪声,如果你记得清楚的话,它的形式是μ+e,(此时解密,再舍入得到的u不是原先的明文值)。因此,重缩放也可以达到降噪的目的。

所以,如果我们把所有的东西都放在一起,要在CKKS中进行乘法,你需要做三件事:

1、做乘法:\(c_{mult}=\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、重缩放:\(c_{rs}=R\mbox{S}_{l->l-1}\left( c \right)\)

如果你做好上面的工作,使用正确的密钥就可解密成功!差不多了,下面还有最后一个细节我们要讲。

CRT,中国剩余定理

所以我们得到了我们需要的一切,但有一个技术问题:计算是在大数上完成的!事实上,我们已经知道,操作是在大模数\(q_l=\Delta ^{l}.q_{0}\)上完成的。例如,想象一下,小数部分需要30位精度,整数部分需要10位精度,乘法需要10位精度(即进行10次乘法),那么我们有\(q_{L}=\Delta ^{L}.q_{0}=2^{30\cdot 10+40}=2^{340}\)。

因为我们有时会计算有大系数的多项式,比如均匀采样得到的多项式,然而一些计算不适合常用的64位系统,所以我们必须找到一种方法使其工作。

这就是中国剩余定理的由来!这个定理表明,如果我们有L个互素数\(p_{1},...,p_{L},p=\prod_{l=1}^{L}{p_{l}}\),然后映射:$$Z\ /pZ\ ->\ Z/ p_{1}Z\times \ ...\ \times Z/ p_{L}Z:\ x\left( \mbox{mod}\ p \right)\ ->\left( x\left( \mbox{mod}/ p_{1} \right),\ ...\ ,x\left( \mbox{mod}\ p_{L} \right) \right)$$,是一个环同构,即如果你想在大环\(Z\ /pZ\)上做算术运算,那么你可以在小环\(Z\ /p_lZ\)上执行,这样就不会在执行计算时超过64位的问题了。

所以在实际中有\(q_{L}=\Delta ^{L}.q_{0}\),我们选择\(p_{1},...,p_{L}\),其中\(p_l约等于\Delta ,q_0\)是远大于\(\Delta\)的素数,然后设置\(q_{L}=\prod_{l=1}^{L}{p_{l}.q_{0}}=q_0*p\)。

这样,我们就可以使用CRT完成上面描述的小技巧,从而能够执行大模数运算。必须稍微修改重缩放操作:\(R\mbox{S}_{l->l-1}\left( c \right)=\left\lfloor \frac{q_{l-1}}{q_{l}}.c \right\rfloor\left( \mbox{mod}\; q_{l-1} \right)=\left\lfloor p_{l}^{-1}.c \right\rfloor\left( \mbox{mod}\; q_{l-1} \right)\)

因此,我们在本文中看到了什么是重缩放,为什么需要它,以及如何在实践中实现它。在下一篇也是最后一篇文章中,我们将把所有内容放在一起,用Python编写一个类似CKKS的同态加密方案!

CKKS Part5: CKKS的重缩放的更多相关文章

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

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

  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. HEAAN新版学习

    本篇文章对最新版的HEAAN库进行研究,老版的介绍见 HEAAN库学习 主要参考:slide-HEAAN.pdf HEAAN介绍 HEAAN是一个支持在加密的复数数组之间进行操作的库,方案的安全性取决 ...

  8. SIMD编码/解码

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

  9. R语言实战(三)基本图形与基本统计分析

    本文对应<R语言实战>第6章:基本图形:第7章:基本统计分析 =============================================================== ...

随机推荐

  1. 永中dcs实现浏览器上面的手绘效果

    永中dcs是一款在线预览各种办公文件的网络产品,我们可以只用一个浏览器就可以实现对word,ppt和excel等文件的在线浏览,在其中有一个在线手绘功能很有特色,让我们来探一探它的实现原理吧. 第一, ...

  2. anaconda 如何更换镜像源

    今天需要对anaconda更换其镜像源. 故而做一个小记: 一 查看anaconda的本源方法 电脑路径:C:\Users\14269,找到  .condarc 文件. 打开.condarc文件,可看 ...

  3. 【C/C++笔记】友元类函数

    最近学了友元,有三个用法: 1友元函数 2友元类 3友元类函数 我发现友元类函数的用法要比上两个用法要严格,不按格式写会各种出错,要把两个类都拆开来写,共分4步. 第一步: class A; //有 ...

  4. ROC and AUC

    目录 概 TPR, FPR ROC and AUC 代码 ROC-wiki 概 AUC常常在文章中作为评价一个分类器优劣的指标, 却总是忘记其原由, 索性记上一笔. TPR, FPR 首先理解TP, ...

  5. Orthogonal Convolutional Neural Networks

    目录 概 主要内容 符号说明 的俩种表示 kernel orthogonal regularization orthogonal convolution Wang J, Chen Y, Chakrab ...

  6. ZFNet: Visualizing and Understanding Convolutional Networks

    目录 论文结构 反卷积 ZFnet的创新点主要是在信号的"恢复"上面,什么样的输入会导致类似的输出,通过这个我们可以了解神经元对输入的敏感程度,比如这个神经元对图片的某一个位置很敏 ...

  7. 2.spring系列之404异常的捕获

    回顾 我在之前发布了一篇spring统一返回的文章,最后提到是无法捕获404异常的,这里我们先来测试一下 @RestController public class TestController { @ ...

  8. Drools集成SpringBoot

    1.说明 为了更好的在项目中使用Drools, 需要把Drools集成到Spring Boot, 下面介绍集成的方法, 并且开发简单的Demo和测试用例. 2.创建Maven工程 pom.xml工程信 ...

  9. MySQL数据库安装Version5.5

    1.新建mysql用户 useradd -g hadoop -s /bin/bash -md /home/mysql mysql 创建.bash_profile,加载.bashrc 2.检查并且卸载系 ...

  10. 【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈

    题目一 从尾到头打印链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-l ...