CKKS同态加密方案初步学习

news2024/10/7 10:13:19

如论文标题所示,CKKS允许复数和实数运算,是一个近似精度计算的方案,也就是解密出来的明文和加密之前的明文不会完全一致。也就是采用丢失部分精度来换取较高的效率。
CKKS的核心是把加密噪声视为近似计算误差的一部分,也就是解密出来的结果直接视为原始消息的近似值。将重要的消息放在MSB以防计算后数据被破坏,把误差放在LSB来保障安全性,如果误差噪声相比消息来说足够小,那么噪声就不会破坏消息,在加密之前,将消息乘以一个缩放因子扩大消息,这样就可以减少添加噪声带来的误差。由此,消息+噪声可以用来替代原消息。当然,CKKS还使用了重缩放技术来减小密文计算时的扩张问题(有点像BV11、BGV、BFV结合的思想)让密文规模呈线性增长而不是指数级以增大乘法次数,还能顺带消除LSB位上的噪声,有点类似舍入运算。

近似计算

当前的近似计算主要分为两类定点运算和浮点运算,区别在于缩放因子是否固定。
image.png
CKKS方案采用的是定点运算,更加稳定(浮点运算很复杂,很难确定位的变化)。

大致流程

来看看整个算法的大致流程
大致包含编码(解码)、加解密、同态加乘、重缩放、自同构旋转等等。
image.png
image.png
这里的 C N / 2 \mathbb C^{N/2} CN/2表示复数向量空间, R = Z [ X ] / ( X N + 1 ) R=\mathbb Z[X]/(X^N+1) R=Z[X]/(XN+1) R q = Z [ X ] q / ( X N + 1 ) R_q =\mathbb Z[X]_q/(X^N+1) Rq=Z[X]q/(XN+1)

编码与解码

一般的基于RLWE同态算法如BGV、BFV等的明文空间都是整数多项式,而CKKS由于是进行复数(实数)计算,它的消息空间是复数空间,为此,需要将消息从复数向量给“编码”成整数多项式。也就是实现 C N / 2 → R = Z [ X ] / ( X N + 1 ) \mathbb C^{N/2} \rightarrow R=\mathbb Z[X]/(X^N+1) CN/2R=Z[X]/(XN+1)映射。
image.png

一些概念

  • 分圆多项式 Φ M ( X ) = X N + 1 \Phi_M(X) = X^N+1 ΦM(X)=XN+1,度数 N = ϕ ( M ) N=\phi(M) N=ϕ(M)(就是欧拉函数),它有 N N N个本原根,记为 ξ i , i ∈ Z M ∗ \xi^i,i \in \mathbb Z^*_M ξi,iZM(i属于模M的剩余类,个数为欧拉函数个,如M=8,N就等于4,i就为1,3,5,7)
  • 把一个多项式解码为一个向量,假定多项式为 m ( X ) m(X) m(X),消息空间的向量为 z z z,有 m ( ξ i ) = z i m(\xi^i)=z_i m(ξi)=zi,把这个转换定义为 σ ( m ) = ( m ( ξ ) , m ( ξ 3 ) , … , m ( ξ 2 N − 1 ) ) \sigma(m)=(m(\xi),m(\xi^3),\dots,m(\xi^{2N-1})) σ(m)=(m(ξ),m(ξ3),,m(ξ2N1))(原文中也叫正则嵌入),也就是把多项式根代入,就能得到对应的唯一的向量值。

消息为复数向量,要将它编码为多项式,需要进行上面的逆操作 σ − 1 \sigma^{-1} σ1,得到如下结论 ∑ j = 0 N − 1 α j ( ξ 2 i − 1 ) j = z i , i = 1 , … , N \sum_{j=0}^{N-1} \alpha_{j}\left(\xi^{2 i-1}\right)^{j}=z_{i}, i=1, \ldots, N j=0N1αj(ξ2i1)j=zi,i=1,,N,可以简化为 A α = z A\alpha=z Aα=z(其中 A A A是一个范德蒙矩阵, α \alpha α是多项式的系数)

  • H = { z ∈ C N : z j = z N − j ‾ } \mathbb H = \{z\in \mathbb C^N:z_j=\overline{z_{N-j}}\} H={zCN:zj=zNj} R [ x ] R[x] R[x]实数)
  • σ ( R ) ⊂ H \sigma(R) \subset \mathbb H σ(R)H Z [ x ] Z[x] Z[x]整数)
  • π : ∀ t ∈ H , π ( t ) = ( t 0 , t 1 , … , t N / 2 ) ∈ C N / 2 \pi: \forall t \in \mathbb H,\pi(t)=(t_0,t_1,\dots,t_{N/2}) \in \mathbb C^{N/2} π:tH,π(t)=(t0,t1,,tN/2)CN/2:逆操作就是将向量取共轭,然后拼接到原向量的尾部,以达到扩张的目的。
  • 编码的简单描述就是 m ( ξ i ) = Δ ⋅ z i m(\xi^i)=\Delta\cdot z_i m(ξi)=Δzi

步骤

编码具体步骤如下

  1. z ∈ C N / 2 z \in \mathbb C^{N/2} zCN/2

  2. 将扩张维度到 N N N π − 1 ( z ) ∈ H \pi^{-1}(z) \in \mathbb H π1(z)H

从消息空间取出的消息是 N / 2 N/2 N/2维的复向量,需要将它扩充到 N N N维,方法就是对它取一下共轭(复数的操作,就是实部不变,虚部取反),再将它和原向量拼接到一起得到一个增广的 N N N维消息。

  1. 为保持精确度所乘以一个缩放因子 Δ \Delta Δ

后面的操作出来需要用到取整,即将实数多项式变为整数多项式,如果直接取整那么误差会很大,所以这里乘以了一个缩放因子,之后再进行取整,这样可以尽可能的保留小数位上的数,提高精确度。

  1. 取整到 σ ( R ) \sigma(R) σ(R): ⌊ Δ ⋅ π − 1 ( z ) ⌉ σ ( R ) ∈ σ ( R ) \left\lfloor\Delta \cdot \pi^{-1}(z)\right\rceil_{\sigma(\mathcal{R})} \in \sigma(R) Δπ1(z)σ(R)σ(R)

由于任给一个复向量 z ∈ C N / 2 z\in \mathbb C^{N/2} zCN/2,它的 π − 1 ( z ) \pi^{-1}(z) π1(z)是不一定落在 σ ( R ) \sigma(R) σ(R)上的,所以需要一个取整操作,使其落在范围内。(其实就是把实数变为整数)

  1. 使用 σ \sigma σ进行编码: m ( X ) = σ − 1 ( ⌊ Δ ⋅ π − 1 ( z ) ⌉ σ ( R ) ) ∈ R m(X)=\sigma^{-1}(\lfloor\Delta \cdot\pi^{-1}(z) \rceil_{\sigma(\mathbb{R})}) \in R m(X)=σ1(Δπ1(z)σ(R))R

这一步就是转变为多项式。
图解如下
image.png
解码就是编码逆操作。
大致就是这个过程,可能有不少数学错误(非数学系,能写到这个程度已经很尽力了),总之大概能够理解就行了。
编码解码的算法如下:
image.png
对于理解后面方案来说,知道算法名字和参数就行了。

方案

大致包含密钥生成,编码与解码,加解密,和重缩放(也叫模交换)
先提一嘴模数的选取:选取一个模数 q 0 > 0 q_0>0 q0>0和一个特殊的基模数 p > 0 p>0 p>0(更精确的说是接近 Δ \Delta Δ),用它们组成一个模数链 q l = q 0 ⋅ p l = q 0 ⋅ p 1 p 2 … p l , 0 < l ≤ L q_l=q_0 \cdot p^l= q_0 \cdot p_1p_2\dots pl,0<l\le L ql=q0pl=q0p1p2pl,0<lL,就像BGV里面的模交换一样,这个将用于重缩放。
至于为什么要拆成两个相乘而不是用一个数,原因在于,CKKS需要100位,而目前计算机只有64位,于是采用了中国剩余定理将大数分成小数分别来存。

CKKS用了多种分布(对于理解方案来说不是重点),具体如下:
image.png

密钥生成算法:

image.png
总体来说这一步的目的就是生成私钥 s k = ( 1 , s ) , p k = ( b = − a s + e , a ) , e v k = ( b ′ = − a ′ s + e ′ + P s 2 , a ′ ) sk=(1, s),pk = (b=-as+e,a),evk=(b'=-a's+e'+Ps^2,a') sk=(1,s),pk=(b=as+e,a),evk=(b=as+e+Ps2,a)(这里的 a , a ′ a,a' a,a等等的取值分布是不一样的)

加密与解密

image.png
这里 c = v ⋅ p k + ( m + e 0 , e 1 ) = ( b ⋅ v + m + e 0 , a ⋅ v + e 1 ) c=v \cdot pk + (m+e_0,e_1)=(b\cdot v+m+e_0,a\cdot v+e_1) c=vpk+(m+e0,e1)=(bv+m+e0,av+e1)
可以验证一下解密正确性:
< c , s k > = < ( b ⋅ v + m + e 0 , a ⋅ v + e 1 ) , ( 1 , s ) > = m + e ⋅ v + e 0 + e 1 ⋅ s ≈ m \begin{aligned} <c,sk> &=<(b\cdot v+m+e_0,a\cdot v+e_1),(1,s)>\\ &= m+e\cdot v + e_0+e_1 \cdot s\\ &\approx m \end{aligned} <c,sk>=<(bv+m+e0,av+e1),(1,s)>=m+ev+e0+e1sm
可以看到误差噪声是很小的。
注意,原文这里的算法应该是使用了BFV中的LPR方案作为基准,即解密结构为 c 0 + c 1 ⋅ s c_0 +c_1\cdot s c0+c1s
所以原文中的 b = c 0 = b ⋅ v + m + e 0 , a = c 1 = a ⋅ v + e 1 b=c_0= b\cdot v+m+e_0,a=c_1=a\cdot v+e_1 b=c0=bv+m+e0,a=c1=av+e1。这样解密才正确(我感觉应该是作者有点符号串用?tmd😡)

同态运算与重线性化

image.png

  • 加法:对于加法没什么好说的,误差噪声就是和
  • 乘法:

我们知道,密文乘法的时候会导致密文扩张,假设是两个密文相乘,那么乘积密文就会由两项变为三项,多次乘法后将会继续扩大,为了遏制这种扩张,这里采用了重线性化方法(有点类似BV11和BFV中的结合体)增加了一个修补项,目的就是把三项重新化为二项,代价就是会增加一点噪声。
先看看密文乘积解密
D e c ( c 1 ) ⋅ D e c ( c 2 ) = ( b 1 + a 1 ⋅ s ) ( b 2 + a 2 ⋅ s ) = b 1 b 2 + ( a 1 b 2 + a 2 b 1 ) ⋅ s + a 1 a 2 ⋅ s 2 = d 0 + d 1 ⋅ s + d 2 ⋅ s 2 \begin{aligned} Dec(c_1)\cdot Dec(c_2) &= (b_1+a_1 \cdot s)(b_2+a2\cdot s) \\ & = b_1b_2+(a_1b_2+a_2b_1)\cdot s + a_1a_2\cdot s^2 \\ & = d_0+d_1 \cdot s +d_2 \cdot s^2 \end{aligned} Dec(c1)Dec(c2)=(b1+a1s)(b2+a2s)=b1b2+(a1b2+a2b1)s+a1a2s2=d0+d1s+d2s2
再来看看修补项的作用
< P − 1 ⋅ d 2 ⋅ e v k , s k > = P − 1 ⋅ d 2 ⋅ b ′ + P − 1 ⋅ d 2 ⋅ a ′ ⋅ s = d 2 ( P − 1 ⋅ e ′ + s 2 ) ≈ d 2 ⋅ s 2 \begin{aligned} <P^{-1} \cdot d_2 \cdot evk,sk> &= P^{-1}\cdot d_2\cdot b'+P^{-1}\cdot d_2 \cdot a' \cdot s \\ &= d_2(P^{-1}\cdot e'+s^2) \\ &\approx d_2 \cdot s^2 \end{aligned} <P1d2evk,sk>=P1d2b+P1d2as=d2(P1e+s2)d2s2
由于 P P P是一个大数,所以这里的误差就很小,就能近似的将三项化为二项。

重缩放

先回想一下,我们在消息编码中乘以了一个缩放因子 Δ \Delta Δ,作用是提高精度。假定编码后的消息为 E c d ( m ) = ⌊ Δ m ⌉ Ecd(m) = \lfloor \Delta m \rceil Ecd(m)=Δm,那么在乘法计算中将得到 E c d ( m 1 ) ⋅ E c d ( m 2 ) = Δ ⋅ E c d ( m 1 m 2 ) Ecd(m_1) \cdot Ecd(m_2) = \Delta \cdot Ecd(m_1m_2) Ecd(m1)Ecd(m2)=ΔEcd(m1m2),可以看到消息是被放大了的,所以要将其还原,就需要乘以一个 1 / Δ 1/\Delta 1/Δ。另外,这个还有一个作用就是,能够缩小噪声。
这也表明CKKS支持的是定点的近似运算。

image.png
image.png
前面我们也提到了,模数链为 q l = q 0 ⋅ p l = q 0 ⋅ p 1 p 2 … p l q_l=q_0 \cdot p^l = q_0 \cdot p_1p_2\dots pl ql=q0pl=q0p1p2pl,其中把 q i ≈ Δ q_i \approx \Delta qiΔ,这样 q l ′ / q l ≈ 1 / Δ q_{l'}/q_l \approx 1/\Delta ql/ql1/Δ,就能达到还原明文的同时,进一步减少误差。
当然,方案的深度就受制于模数链了,做一次乘法就会消耗一个 q i q_i qi。(和BGV中模切换一样)

参考

CKKS同态加密算法简介
全同态加密:CKKS
同态加密:CKKS方案详解及一个python实现:TenSEAL(不定期更新)
CKKS explained series
十分简明易懂的FFT(快速傅里叶变换)
Jung Hee Cheon, Andrey Kim, Miran Kim, and Yongsoo Song. 2017. Homomorphic encryption for arithmetic of approximate numbers. In Int’l Conf. on the Theory and Application of Cryptology and Information Security. Springer, 409–437

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python项目一:pygname

1.安装pip install pygame 2.加载模块初始化&#xff1a;开始 import sys import pygamepygame.init() #初始化3.创建窗口 3.1pygame .display模块 作用&#xff1a;创建游戏窗口 常见的内置方法&#xff1a; 方法作用 pygame。display.init() 初始化display模块p…

C++11标准模板(STL)- 算法(std::partial_sort)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 排序一个范围的前 N 个元素…

阿里巴巴最新总结「百亿级别并发设计手册」GitHub收获70K标星

随着淘宝购物节和抖音直播平台带货的火热&#xff0c;大批促销活动涌现&#xff0c;「秒杀」这个词也越来越频繁地出现在我们的生活里。 除了那些头部的电商公司&#xff0c;某多、某东&#xff0c;还有各种街、某会、某品等&#xff0c;甚至是一些老牌的传统企业&#xff0c;…

Android持久化技术,好内存不如烂存储

Android持久化技术&#xff0c;好内存不如烂存储前言六、Android持久化技术&#xff0c;好内存不如烂存储6.1 持久化技术介绍6.2 简单文件存储方案6.3 SharedPreferences存储方案6.3.1 获取SharedPreferences对象的三种方式6.3.2 使用SharedPreferences对象存储和读取数据6.4 S…

Model Fusion of Heterogeneous Neural Networks via Cross-Layer Alignment论文阅读

论文地址点这里 一. 介绍 本文是针对异构的网络融合技术&#xff0c;是基于上一篇OTFusion的论文进行的工作&#xff0c;解决了神经元关联问题。当所有的网络都具有相同的架构时&#xff0c;OTFusion比普通平均算法有明显的改进。与其他基于平均的模型融合方法相比&#xff0…

如何制作一个实时在线显示评论

通过循环容器及数据表功能&#xff0c;制作一个发送评论实时显示的功能 效果展示 具体步骤 制作评论背景 制作评论样式 制作一个发送评论输入框 制作一个发送按钮 创建评论数据表 添加获取评论事件 创建发送评论触发器 数据绑定与设置 步骤分解 制作评论背景 拖拽 循环容器 到…

Go基础学习【2】

文章目录一&#xff1a;数组二&#xff1a;map集合三&#xff1a;包四&#xff1a;结构体一&#xff1a;数组 1.命名 var arrAge [5]int{1,2,3,4,5} var arrAge […]int{1,2,4,5,6} var arrAge [5]string{3:“sfd”,5:“asdf”} 2.传递 通过传递数组的指针 和 使用数组的切片…

[go学习笔记.第十六章.TCP编程] 2.项目-海量用户即时通讯系统

一.项目介绍 1.项目开发流程 需求分析->设计阶段->编码实现->测试阶段->实施阶段 2.需求分析 (1).用户注册 (2).用户登录 (3).显示在线用户列表 (4).群聊(广播) (5).点对点聊天 (6).离线留言 3.示意图 4.项目开发前技术准备 项目要保存用户信息和消息数据,因此需…

【Vue】vue项目用qrcodejs2生成带log的二维码图片,vue生成二维码图片中间带log,自定义log

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、安装qrcodejs2二、在页面中使用1.引入…

英国Paper写作思路和精髓如何了解?

第一学期即将结束&#xff0c;为了能帮助更多英国留学生顺利完成Paper&#xff0c;增加对英国Paper写作的理解&#xff0c;取得高分。本文小编为大家分享英国Paper写作的思路和精髓&#xff0c;帮助自己修改提升Paper质量。 The first semester is coming to an end.In order t…

flutter AnimatedSwitcher 动画切换过渡组件 跑马灯动画封装

flutter AnimatedSwitcher 动画切换过渡组件前言一、AnimatedSwitcher 简介二、AnimatedSwitcher 的简单使用三、AnimatedSwitcher 自定义跑马灯动画四、SlideTransitionX 的封装总结前言 本篇文章将记录 AnimatedSwitcher 过渡组件&#xff0c;这个组件动画是一个新的小部件来…

制作一个简单HTML宠物猫网页(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

在 Spring Boot中配置日志

Spring Boot 在引擎盖下使用Apache Commons Logging。但是&#xff0c;它允许您选择所需的日志记录库。让我们来看看使用 Spring Boot 时的一些配置和最佳实践。 目录 概述简单日志记录示例配置日志记录 更改日志级别将日志写入文件在 Spring 引导中更改日志记录模式对日志条…

基于小波域的隐马尔可夫树模型的图像去噪方法的matlab实现代码

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 为适应图像的空域非平稳变化, 提出了一种基于小波域分类隐马尔可夫树(CHMT)模型的图像去噪方法.该模型中,图像在每一尺度每一子带的小波系数均被分成C组以突出其空域非平稳变化 的特征,这…

MySQL有哪些锁

这次&#xff0c;来说说 MySQL 的锁&#xff0c;主要是 Q&A 的形式&#xff0c;看起来会比较轻松。 在 MySQL 里&#xff0c;根据加锁的范围&#xff0c;可以分为全局锁、表级锁和行锁三类。 全局锁 全局锁是怎么用的&#xff1f; 要使用全局锁&#xff0c;则要执行这条命…

彻底搞明白概率论:事件间的关系与运算;频率与概率

文章目录事件间的关系事件间的运算事件间的运算法则概率描述性定义统计性定义频率频率的性质频率是否能够作为概率呢&#xff1f;公理化定义概率的重要性质事件间的关系 注意互斥关系和对立关系&#xff1a; 互斥关系是&#xff1a;只要 A,BA,BA,B 不同时发生&#xff08;不存在…

山东菏泽家乡网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

MindFusion JavaScript R2 套件 Crack

MindFusion JavaScript R2将您的 JAVASCRIPT 应用程序更快地推向市场 MindFusion JavaScript 库旨在显着缩短开发任何类型的交互式 JS 应用程序所需的时间。它们还使开发更加容易。 用于 JavaScript 的 MindFusion 包 JavaScript 数据视图 数据网格JavaScript 图 绘图JavaScr…

DJYGUI系列文章八:GDD绘图系统

目录 1 GDD绘图系统概述 1.1绘图上下文 1.2 DrawColor&#xff0c;FillColor&#xff0c;TextColor的作用与区别 2 API说明 2.1 SetRopCode&#xff1a; 设置当前光栅码 2.2 GetRopCode&#xff1a; 获得当前光栅码 2.3 MoveTo&#xff1a; 设置当前坐标位置 2.4 SetDr…

Web基础习题

1.语义化标签 1.现需要设置一个按钮&#xff0c;请填写语义化标签补全代码片段&#xff08;仅填写一个标签名即可&#xff09; <_____>点我!</_____> 2.在HTML中一般用哪个语义化标签表示斜体文本效果 3.在HTML中一般用哪个语义化标签表示头部导航 4.在HTML中一…