这篇文章简单地讲了一下CKKS算法中旋转操作的原理。

CKKS的旋转

其实,BFV,BGV,CKKS的旋转操作的原理都是一样的。只不过是对应的代数结构不一样。比如CKKS是在C\mathbb CC上进行的,而BFV和BGV是在FpF_pFp​上进行的。

想要理解旋转操作,首先需要理解CKKS的编码和解码。

CKKS的编码和解码

这个操作的原理我在之前的博客已经有所涉及。其原理如下:

考虑XN+1=Φ2N(X)X^N+1 = \Phi_{2N}(X)XN+1=Φ2N​(X),其中NNN是2的幂。在 C\mathbb CC 上,XN+1X^N+1XN+1的根是ωj=e−2πji/2N\omega_j = e^{-2\pi ji/ 2N}ωj​=e−2πji/2N,jjj是小于2N2N2N的奇数(共NNN个),并且两两共轭。为了方便起见,我们记ω1=ω\omega_1 = \omegaω1​=ω,此时有ωj=ωj\omega_j = \omega^jωj​=ωj。

于是我们可以做自然嵌入。具体地,我们有一个复向量vvv,长度为N/2N/2N/2,目标是生成一个实系数多项式fff,使得f(ωj)=vjf(\omega_j) = v_jf(ωj​)=vj​。上述操作(把复向量弄成实多项式)就叫自然嵌入了。这玩意本质上就是插值运算。

为了满足实系数的约束,我们可以做f(ωj)=vjf(\omega_j) = v_jf(ωj​)=vj​和f(ωjˉ)=vjˉf(\bar{\omega_j}) = \bar{v_j}f(ωj​ˉ​)=vj​ˉ​。也可以直接限定多项式系数为实数并求解f(ωj)=vjf(\omega_j) = v_jf(ωj​)=vj​。

CKKS的旋转

举个例子。令N=8N = 8N=8,其分圆多项式对应的根为ωj\omega^jωj,j=1,3,5,7,9,11,13,15j=1,3,5,7,9,11,13,15j=1,3,5,7,9,11,13,15。ω=e−2πi/8\omega=e^{-2\pi i/8}ω=e−2πi/8。

自然的想法是可以用 ω1,3,5,7\omega_{1,3,5,7}ω1,3,5,7​ 来做自然嵌入,但是这样其实不太方便做旋转操作。

因为,从向量的角度来看,旋转干的事情类似于:

[1,3,5,7] --左旋1-> [3,5,7,1] --左旋1-> [5,7,1,3]

这意味着对编码后的向量变换多项式插值。假如我们用的是ω1,3,5,7\omega_{1,3,5,7}ω1,3,5,7​ 来做自然嵌入,那么旋转之前

f(ω1)=1f(\omega^1) = 1f(ω1)=1
f(ω3)=3f(\omega^3) = 3f(ω3)=3
f(ω5)=5f(\omega^5) = 5f(ω5)=5
f(ω7)=7f(\omega^7) = 7f(ω7)=7

现在向左旋转1位之后:

f(ω1)=3f(\omega^1) = 3f(ω1)=3
f(ω3)=5f(\omega^3) = 5f(ω3)=5
f(ω5)=7f(\omega^5) = 7f(ω5)=7
f(ω7)=1f(\omega^7) = 1f(ω7)=1

这种编码方式其实是不太方便做旋转的。因为这些根之间的转换不太方便实现。

不过肯定还是要用这些根,只是根的排列不同。

我们考虑{1,3,...,2N−1}mod2N\{1,3,...,2N-1\} \mod 2N{1,3,...,2N−1}mod2N 。在这个结构里,整数5的阶是NNN,5的所有整数次幂可构成阶是NNN的<a href=https://www.bilibili.com/video/BV1u7411U78w/?vd_source=ef299d7901f45ee7418f108bc489c8f1>缩系。

比如说,在 N=8N=8N=8 的情况下,整数5构成的缩系是
{5=51mod16,9=52mod16,13=53mod16,1=54mod16}\{5=5^1\mod16, 9=5^2\mod16, 13=5^3\mod16, 1=5^4\mod16\}{5=51mod16,9=52mod16,13=53mod16,1=54mod16}
对这个缩系中的元素都乘-1,得到
{11=−5mod16,7=−9mod16,3=−13mod16,15=−1mod16}\{11=-5\mod16, 7=-9\mod16, 3=-13\mod16, 15=-1\mod16\}{11=−5mod16,7=−9mod16,3=−13mod16,15=−1mod16}

把这两个集合做不交并就生成了完整的 {1,3,...,2N−1}mod2N\{1,3,...,2N-1\} \mod 2N{1,3,...,2N−1}mod2N。

现在我们改变一下编码方式:
f(ω5)=1=f(ω5)f(\omega^5) = 1 = f(\omega^5)f(ω5)=1=f(ω5)
f(ω25)=3=f(ω9)f(\omega^{25}) = 3 = f(\omega^9)f(ω25)=3=f(ω9)
f(ω125)=5=f(ω13)f(\omega^{125}) = 5 = f(\omega^{13})f(ω125)=5=f(ω13)
f(ω625)=7=f(ω1)f(\omega^{625}) = 7 = f(\omega^1)f(ω625)=7=f(ω1)

计算5次幂(意味着旋转一位),就得到
f((ω5)5)=1=f(ω25)=f(ω9)f((\omega^5)^5) = 1 = f(\omega^{25}) = f(\omega^9)f((ω5)5)=1=f(ω25)=f(ω9)
f((ω25)5)=3=f(ω125)=f(ω13)f((\omega^{25})^5) = 3 = f(\omega^{125}) = f(\omega^{13})f((ω25)5)=3=f(ω125)=f(ω13)
f((ω125)5)=5=f(ω625)=f(ω1)f((\omega^{125})^5) = 5 = f(\omega^{625}) = f(\omega^1)f((ω125)5)=5=f(ω625)=f(ω1)
f((ω625)5)=7=f(ω3125)=f(ω5)f((\omega^{625})^5) = 7 = f(\omega^{3125}) = f(\omega^5)f((ω625)5)=7=f(ω3125)=f(ω5)

计算25次幂(意味着旋转两位),可以自行计算。

具体地,在CKKS的编码操作完成之后,会从向量vvv得到一个多项式f(x)f(x)f(x)。
我们把多项式的未定元从xxx换成x5x^5x5,就可以实现上面的旋转一位的操作。

在密文情况下,因为c0(x)+c1(x)s(x)=m(x)c_0(x) + c_1(x)s(x) = m(x)c0​(x)+c1​(x)s(x)=m(x),所以做旋转的时候有c0(x5)+c1(x5)s(x5)=m(x5)c_0(x^5) + c_1(x^5)s(x^5) = m(x^5)c0​(x5)+c1​(x5)s(x5)=m(x5)。这意味着,我们需要为每一个旋转步数生成一个转换密钥,目的是把s(xk)s(x^k)s(xk)弄成s(x)s(x)s(x)。为了简便起见,我这里直接称为旋转密钥。在SEAL库的实现中,他们依据2的幂来进行生成旋转密钥:比如生成旋转1, 2, 4, 8…位的密钥,在旋转具体步数时再进行拆分。

下面这张图简单地概括了一下我上面所说旋转操作的原理。

总结一下,不论是在C\mathbb CC上还是Fp\mathbb F_pFp​上做旋转,本质上都是需要找到一个缩系生成元和一个共轭元,然后利用生成元进行嵌入(编码),就可以支持旋转操作了。

同态加密:CKKS原理之旋转(Rotation)相关推荐

  1. Paillier半同态加密:原理、高效实现方法和应用

    简介: <数据安全法>已于9月1日起正式实施,两个月后<个人信息保护法>也将开始施行,意味着数据安全和隐私保护方面的监管将会在年内陆续到位.在合规收紧大背景下,"数据 ...

  2. Paillier 半同态加密:原理、高效实现方法和应用

    一 简介 1 背景 <数据安全法>已于9月1日起正式实施,两个月后<个人信息保护法>也将开始施行,意味着数据安全和隐私保护方面的监管将会在年内陆续到位. 在合规收紧大背景下,& ...

  3. bfv同态加密_微软同态加密库SEAL使用

    近期刚接触SEAL库,本文记录该库的使用方法,具体的同态加密的原理不过多介绍,若有错误,请各位大佬批评指正. SEAL(Simple Encrypted Arithmetic Library)是微软开 ...

  4. DGHV:整数上的同态加密(2)-解决噪声与构建全同态蓝图

    上一节我们学习了DGHV somewhat同态(类全同态加密)的基本构建: DGHV:整数上的同态加密(1)-算法构建 这一节将更进一步的探讨S 一.再谈同态加密 通过一些资料的查看,对同态加密的几个 ...

  5. 同态加密:CKKS方案详解及一个python实现:TenSEAL

    部分资料来自于HEAAN作者的个人主页:https://yongsoosong.github.io/files/slides/intro_to_CKKS.pdf 0x00 引流 本文是CKKS方案的简 ...

  6. 同态加密:以CKKS为例的Bootstrapping操作介绍(不定期更新)

    同态加密的Bootstrapping操作最早由Gentry在他的博士论文里提出,是实现分级同态加密到全同态加密之间转换的关键步骤.目前所有的bootstrapping工作都是基于Gentry的这个想法 ...

  7. 密码学学习笔记(五)——CKKS同态加密方案

    文章目录 1. 提出背景 2. 方案原理 3. 算法描述 4.方案改进 4.1 自举方案 4.2 RNS变体 1. 提出背景 1978年,Rivest.Adleman和Dertouzos在文献[1]中 ...

  8. 全同态加密:CKKS

    参考文献: Cheon J H, Kim A, Kim M, et al. Homomorphic encryption for arithmetic of approximate numbers[C ...

  9. 全同态加密知识体系整理

    文章由AdijeShen整理,供个人学习使用. 整理了到2022年为止,同态加密比较重要的知识和方法. 文章目录 引 基础知识 基于RLWE的同态加密方案(BGV,BFV,CKKS) 通用的格式 效率 ...

最新文章

  1. 挣值管理不是搞数字游戏
  2. Catalyst3560密码破解
  3. jquery 总结
  4. boost::gregorian模块实现使用公历精确地推进一个月的测试程序
  5. glup打包代码不更新
  6. LeetCode每日打卡 - 汉明距离总和
  7. Webpack实战(五):轻松读懂Webpack如何分离样式文件
  8. 对CloseHandle用法的理解
  9. Python多线程好文
  10. android.opengl.GLSurfaceView概述
  11. asp.net的优化 服务器控件背后友好的Html和JS
  12. Dev C++支持c++11标准的编译方法
  13. 无监督学习——非负矩阵分解(NMF)
  14. 一道简单的百度笔试题
  15. 微信小程序开发学习3(WXSS模板和全局配置)
  16. java生成二维码QRcode方式
  17. 【c语言】多项式求和
  18. CentOS 7 安全加固、检测、审计
  19. 【论文翻译】Automatic Conversion of Road Networks from OpenDRIVE to Lanelets
  20. MicroNet论文复现:用极低的FLOPs改进图像识别

热门文章

  1. 网页版滑动验证码+短信验证码(史上最全版)
  2. 面部表情识别1:表情识别数据集(含下载链接)
  3. Java简介和发展史
  4. Android全屏背景布局,android-将彩色背景和边框半径添加到布局
  5. 使用picard工具去重自己的sam/bam数据
  6. word中表中横线断开的排法
  7. jenkins + gitlab实现自动化打包前端项目
  8. This application failed to start because it could not find or load the Qt platfo rm plugin “windows“
  9. 查询linux进程状态
  10. codeforces D. Boboniu Chats with Du