CKKS加密简介

CKKS是目前比较流行的同态加密方案,出自于论文《Homomorphic encryption for arithmetic of approximate numbers》,名称是其作者的首字母简称。

CKKS相较于BGV和BFV,最大的优势是能够处理浮点数,甚至是复数。CKKS的明文域是复数向量。

其实,CKKS是基于BGV或者BFV构造的,其亮点,是编码。但是其编码需要的数学知识很复杂,在这里只是大概介绍一下。

首先,有一个多项式f(x)=x^d+1,其中d是2的整数次幂,也就是一个分圆多项式。构造环R=\mathbb{Z}[x]/f(x)。CKKS的明文空间\mathbb{C}^{\frac{d}{2}}(维度为d/2的复数向量)与环R是同构的。编码就是将明文从\mathbb{C}^{\frac{d}{2}}映射到环R上,使得加密的明文是一个多项式m。其解码是编码的逆过程。其具体过程是通过f(x)的单位本原根来实现的。把f(x)的本原根代入,每一个本原根对应向量中的一个值。实际上是两个本原根对应一个复数。然后,多项式的系数,得到一个实多项式。

但是,一个实多项式,并不能够直接加解密。所以呢,需要乘以一个大整数\Delta,然后借取整数部分,使之变为整数系数多项式。这样完全就可以使用BGV或者BFV来加密。但是,CKKS这里采用的并不是像BGV或者BFV采用的是噪声在一定范围内,是无误差解密的。CKKS采用的是有小差错的解密。也就是私钥和密文点乘以后,得到的结果是m+ee是一个小的噪声,也就是解密误差。但是,在解码的时候除以\Delta后,就可以将误差控制得非常小了。

在具体介绍CKKS的加解密时,首先介绍一下CKKS中提出的重缩放技术。CKKS是一个层次的加密,其乘法的深度在初始化参数中就已经确定。每一次重缩放操作,会在减少噪声的同时,降低密文的层次。将CKKS的深度记为L,那么我们需要一个递增的密文模序列\{q_0,q_1,q_2,...,q_L\},相邻密文模的商应该接近\Delta。每一次的重缩放操作,将密文从密文模q_l降到q_{l-1}。我描述为密文从q_l降到了q_{l-1}。具体做法是,假设密文为\mathbf{c},则重缩放后的密文\mathbf{c^\prime}=\lfloor \frac{q_{l-1}}{q_l}\rceil \mathbf{c} \mod q_{l-1}

接下来描述CKKS的密钥生成和加解密。

假设噪声分布为\chi是一个与安全级别\lambda有关的在环R上的离散高斯分布,\chi ^\prime是环R上的均匀随机分布。

密钥生成:在噪声\chi中采样得到s,则私钥sk=(1,s)。然后,在\chi ^\prime中采样得到aa^\prime,在\chi中采样得到ee^\prime,计算公钥pk=(b=-as+e,a),辅助密钥evk=-a^\prime s+e^\prime +Ps^2 \mod P \cdot q_L,其中P是一个大数。

加密m是编码过的明文多项式,在\chi ^\prime中采样得到v,在\chi中采样得到e_0e_1。则密文\mathbf{c}=v \cdot pk +(m+e_0,e_1) \mod q_L。注意,加密得到的新鲜密文都是q_L层的。

解密:\mathbf{c}=(c_0,c_1)q_l层的密文,则m+e=\mathbf{c} \cdot sk=c_0+c_1s \mod q_l,e是解密噪声。

重线性化:两个q_l层的密文(b_0,a_0)(b_1,a_1)相乘后,得到(d_0,d_1,d_2)=(b_0b_1,b_0a_1+b_1a_0,b_1a_1) \mod q_l\mathbf{c^\prime}=(d_0,d_1)+\lfloor P^{-1} \cdot d_2 \cdot evk \rceil \mod q_l,将三维的密文,变为两维,且私钥不变。

<think>好的,我现在要处理用户关于CKKS同态加密解密原理和实现的问题。首先,我需要回忆一下CKKS的基本概念和结构。CKKS是一种支持近似数运算的同态加密方案,主要用于实数或复数上的计算,这在机器学习中非常有用。用户之前提到的参考内容提到了噪声问题和现有方案的一些特点,这可能与CKKS中的噪声管理有关。 首先,我应该从CKKS的整体流程开始,包括加密、解密以及同态操作的过程。需要解释其数学基础,比如环LWE问题、多项式环结构,以及编码解码的部分,因为CKKS的关键在于将浮点数向量编码到多项式环上,然后再加密。这里可能需要提到FFT和逆FFT在编码中的作用,以及如何通过缩放因子来保持精度。 接下来是加密的具体步骤,包括公钥的使用,如何生成密文。然后解密过程,用私钥解密出编码后的多项式,再通过解码得到原始向量的近似值。这里需要强调噪声的影响,每次操作后噪声会增加,当超过阈值时解密会失败,所以需要噪声管理技术,比如模切换和重线性化。 然后是同态操作,加法和乘法的处理方式,特别是乘法后如何用重线性化来减少密文大小,以及模切换控制噪声增长。这部分需要详细说明,因为用户可能对如何实现这些操作感兴趣。 关于实现,可能需要提到常用的库,比如Microsoft SEAL或PALISADE,以及实现中的关键参数选择,比如多项式次数、模数链的设置、缩放因子的大小等。这部分需要结合理论,说明参数如何影响安全性和计算能力。 用户的问题还提到了参考中的噪声问题,所以在解释过程中要特别强调噪声管理的策略,比如在乘法和加法后如何处理噪声,以及如何通过调整参数来平衡计算深度和噪声增长。 最后,生成相关问题需要考虑用户可能的后续疑问,比如与BFV的区别、参数选择、实际应用中的挑战、如何评估安全性等。这些问题应该覆盖理论和实践的不同方面,帮助用户进一步探索。 检查是否有遗漏的部分,比如是否涵盖了加密解密的数学表达式,是否正确使用了$$...$$格式,是否引用了提供的参考内容。确保所有数学公式都正确使用LaTeX,行内公式用$...$,独立公式单独成段。同时,回答需要用中文,结构清晰,分步骤解释。</think>### CKKS同态加密原理与实现 #### 1. 基础结构 CKKS方案基于**环LWE问题**构建,核心数学结构为多项式环$R_q = \mathbb{Z}_q[X]/(X^N + 1)$,其中$N=2^k$为多项式次数。加密对象为复数向量$z \in \mathbb{C}^{N/2}$,通过**编码-加密-计算-解密-解码**流程实现近似计算[^1]。 #### 2. 编码/解码过程 **编码**:将向量$z$映射到多项式$m(X) \in R$: $$ \text{Encode}(z) = \Delta \cdot \tau^{-1}(z) $$ 其中$\Delta$为缩放因子(保留小数精度),$\tau$为**规范嵌入映射**,利用FFT实现快速转换。 **解码**:通过逆过程恢复近似值: $$ \text{Decode}(m) = \tau(m/\Delta) $$ #### 3. 加密/解密流程 - **密钥生成**:生成私钥$s \leftarrow R_2$(二元多项式),公钥$pk=(b,a)=(-a\cdot s + e \mod q, a)$ - **加密**:对消息$m$生成密文$ct=(c_0,c_1)= (v\cdot b + m + e_0, v\cdot a + e_1) \mod q$ - **解密**:计算$m' = c_0 + c_1 \cdot s \mod q$,再解码得到近似结果 #### 4. 同态操作 - **加法**:直接相加对应位置多项式 $$ ct_{add} = (ct_1[0]+ct_2[0], ct_1[1]+ct_2[1]) $$ - **乘法**:使用张量积后重线性化 $$ ct_{mult} = \text{Relin}(ct_1 \otimes ct_2) $$ 引入**重线性化密钥**$rlk$将三次密文降为二次 #### 5. 噪声管理 - **模切换**:每次乘法后降低模数$q \rightarrow q'$,按比例缩放噪声 $$ ct' = \lfloor (q'/q) \cdot ct \rceil $$ - **缩放因子调节**:动态调整$\Delta$值保持计算精度 #### 6. 实现示例(伪代码框架) ```python class CKKS: def __init__(self, poly_degree=1024, scale=2**30): self.N = poly_degree # 多项式次数 self.scale = scale # 缩放因子 self.q = 60 # 初始模数 def encode(self, z): # 使用FFT将向量转换为多项式 m = inverse_fft(z) * self.scale return m.round() def encrypt(self, m, pk): v = random_poly() e = error_poly() ct0 = pk.b * v + m + e ct1 = pk.a * v + e return Ciphertext(ct0, ct1) def decrypt(self, ct, sk): m_approx = ct[0] + ct[1] * sk return m_approx / self.scale ``` #### 7. 关键技术点 1. **近似计算特性**:允许有限精度的浮点运算误差 2. **复数支持**:通过编码方案处理实部和虚部 3. **打包加密**:单次加密可处理$N/2$个复数 4. **模数链设计**:$q = \prod_{i=0}^L q_i$ 实现多级计算
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值