CKKS EXPLAINED: PART 1, VANILLA ENCODING AND DECODING

CKKS EXPLAINED: PART 1, VANILLA ENCODING AND DECODING

Introduction

同态加密是一个有前途的领域,它允许在加密数据上进行计算。一篇名为“同态加密是什么”的博文提供了广泛的解释,说明了同态加密的含义以及这一研究领域的重要性。

在本系列文章中,我们将深入研究 Cheon-Kim-Kim-Song (CKKS) 方案,该方案首次在论文《用于近似数算术的同态加密》中进行了讨论。CKKS 允许我们在复数值向量上进行计算(因此也包括实数值)。我们的目标是使用 Python 从头开始实现 CKKS,然后通过使用这些密码学原语,探索如何执行复杂操作,比如线性回归、神经网络等等。

在这里插入图片描述

上图提供了 CKKS 的高层视图。我们可以看到,一个消息 m m m,即我们想要进行某些计算的值向量,首先被编码成一个明文多项式 p ( X ) p(X) p(X),然后使用公钥进行加密。

CKKS 使用多项式进行操作,因为与向量上的标准计算相比,它们在安全性和效率之间提供了很好的折衷。

一旦消息 m m m 被加密为 c c c,即一对多项式,CKKS 提供了几种可以在其上执行的操作,例如加法、乘法和旋转。

如果我们用 f f f 表示一个函数,它是同态操作的组合,那么用秘密密钥解密 c ′ = f ( c ) c' = f(c) c=f(c) 将产生 p ′ = f ( p ) p' = f(p) p=f(p)。因此,一旦解码,我们将得到 m = f ( m ) m = f(m) m=f(m)

实现同态加密方案的核心思想是在编码器、解码器、加密器和解密器上具有同态属性。这样,密文上的操作将被正确地解密和解码,并且提供的输出就像直接在明文上进行操作一样。

因此,在本文中,我们将看到如何实现编码器和解码器,而在后续文章中,我们将继续实现加密器和解密器,以构建一个同态加密方案。

相关知识:

循环多项式

在数学中,对于任意正整数 n n n,第 n n n 个循环多项式是满足以下条件的唯一不可约多项式:

  1. 它具有整数系数;
  2. 它是多项式 x n − 1 x^n - 1 xn1 的因式,但不是 x k − 1 x^k - 1 xk1 的因式,其中 k < n k < n k<n
  3. 它的根是所有与 n n n 互质的正整数 k k k 所对应的第 n n n 个原始单位根 e 2 i π k n e^{2i\pi \frac{k}{n}} e2nk

换句话说,第 n n n 个循环多项式可以表示为:

Φ n ( x ) = ∏ 1 ≤ k ≤ n gcd ⁡ ( k , n ) = 1 ( x − e 2 i π k n ) \Phi_n(x) = \prod_{\substack{1 \leq k \leq n \\ \gcd(k,n)=1}} (x - e^{2i\pi \frac{k}{n}}) Φn(x)=1kngcd(k,n)=1(xe2nk)

这个多项式也可以定义为具有整数系数的首一多项式,它是有理数域上任意一个原始 n n n 次单位根的最小多项式。一个重要的关系是:

∏ d ∣ n Φ d ( x ) = x n − 1 \prod_{d|n} \Phi_d(x) = x^n - 1 dnΦd(x)=xn1
这表明如果 x x x x n − 1 x^n - 1 xn1 的根,那么它就是某个能整除 n n n d d d 次原始单位根的根。

这些公式描述了循环多项式的形式,具体如下:

  1. 如果 n n n 是一个素数,循环多项式 Φ n ( x ) \Phi_n(x) Φn(x) 为:

Φ n ( x ) = 1 + x + x 2 + … + x n − 1 = ∑ k = 0 n − 1 x k \Phi_n(x) = 1 + x + x^2 + \ldots + x^{n-1} = \sum_{k=0}^{n-1} x^k Φn(x)=1+x+x2++xn1=k=0n1xk

这里的 x n − 1 x^{n-1} xn1 表示最高次幂是 n − 1 n-1 n1 的项,系数 1 , x , x 2 , … , x n − 1 1, x, x^2, \ldots, x^{n-1} 1,x,x2,,xn1 都是整数。

  1. 如果 n = 2 p n = 2p n=2p,其中 p p p 是一个奇素数,循环多项式 Φ 2 p ( x ) \Phi_{2p}(x) Φ2p(x) 为:

Φ 2 p ( x ) = 1 − x + x 2 − … + ( − 1 ) p − 1 x p − 1 = ∑ k = 0 p − 1 ( − x ) k \Phi_{2p}(x) = 1 - x + x^2 - \ldots + (-1)^{p-1}x^{p-1} = \sum_{k=0}^{p-1} (-x)^k Φ2p(x)=1x+x2+(1)p1xp1=k=0p1(x)k

在这个公式中,奇数次幂的系数是负的,这是为了满足循环多项式的定义,其中的系数必须交替正负。

规范嵌入(Canonical embedding)

规范嵌入(Canonical embedding)是用于编码和解码的一种技术,常用于将向量映射到多项式空间中。规范嵌入具有很好的性质,其中一个重要性质是它们是同构的(isomorphism),即向量空间与多项式空间之间存在一一映射,保持了向量和多项式之间的关系。

具体来说,规范嵌入确保了向量空间中的每个向量都对应唯一的多项式,反之亦然。这意味着,通过规范嵌入,我们可以将向量空间中的运算映射到多项式空间中,从而实现对编码和解码过程的管理和控制。

同构性质使得向量和多项式之间的转换更加灵活和高效,这在许多应用中都是非常有用的,尤其是在使用多项式表示数据时,比如在密码学中的同态加密方案中。

让我们以一个简单的例子来说明规范嵌入的概念。

假设我们有一个 n n n 维的向量空间,其中的向量可以表示为 ( a 1 , a 2 , … , a n ) (a_1, a_2, \ldots, a_n) (a1,a2,,an),其中 a i a_i ai 是向量的第 i i i 个分量。

现在,我们希望将这个向量空间中的向量映射到一个 n n n 次多项式空间中。我们可以使用规范嵌入来实现这个映射,其中每个向量对应一个唯一的多项式。

例如,对于一个二维向量空间 ( x , y ) (x, y) (x,y),我们可以将其映射到一个二次多项式空间中。规范嵌入可以将向量 ( x , y ) (x, y) (x,y) 映射为多项式 a x + b y ax + by ax+by,其中 a a a b b b 是我们选择的系数。

同样地,我们可以将多项式 a x + b y ax + by ax+by 解码为向量 ( a , b ) (a, b) (a,b)。这样,我们就建立了向量空间和多项式空间之间的一一对应关系,这就是规范嵌入的作用。

在实际应用中,规范嵌入可以用于将数据转换为多项式形式,从而应用于密码学、信号处理和编码理论等领域中。

范德蒙矩阵(Vandermonde matrices)

范德蒙矩阵(Vandermonde matrices)是一种特殊的矩阵,通常用于将一组数据映射到多项式空间中,以及在多项式插值和拟合问题中的求解中。在文中提到的背景下,范德蒙矩阵被用于实现规范嵌入的逆运算。

规范嵌入将向量映射到多项式空间中,而逆运算则将多项式映射回向量空间。使用范德蒙矩阵可以实现逆运算。具体来说,如果我们有一个 n n n 维的向量空间,我们可以通过规范嵌入将其映射到一个 n n n 次多项式空间中,形式如下:

f ( x ) = a 0 + a 1 x + a 2 x 2 + … + a n − 1 x n − 1 f(x) = a_0 + a_1 x + a_2 x^2 + \ldots + a_{n-1} x^{n-1} f(x)=a0+a1x+a2x2++an1xn1

其中 a 0 , a 1 , … , a n − 1 a_0, a_1, \ldots, a_{n-1} a0,a1,,an1 是多项式的系数。

如果我们想要从多项式空间映射回向量空间,我们可以利用范德蒙矩阵的逆来实现。范德蒙矩阵的逆矩阵可以将多项式的系数转换回原始的向量形式。

让我们以一个简单的例子来说明范德蒙矩阵的使用,特别是在规范嵌入的逆运算中。

考虑一个三维的向量空间 ( a , b , c ) (a, b, c) (a,b,c),我们希望将其映射到一个三次多项式 f ( x ) = a x 2 + b x + c f(x) = ax^2 + bx + c f(x)=ax2+bx+c。这是一个规范嵌入的过程。

现在,如果我们有一个包含不同 x x x 值的数据集,例如 x 1 , x 2 , x 3 x_1, x_2, x_3 x1,x2,x3,我们可以构建范德蒙矩阵。对于 n n n 次多项式,范德蒙矩阵的第 i i i 行第 j j j 列的元素是 x i j − 1 x_i^{j-1} xij1

范德蒙矩阵 V V V 如下:

V = [ 1 x 1 x 1 2 1 x 2 x 2 2 1 x 3 x 3 2 ] V = \begin{bmatrix} 1 & x_1 & x_1^2 \\ 1 & x_2 & x_2^2 \\ 1 & x_3 & x_3^2 \\ \end{bmatrix} V= 111x1x2x3x12x22x32
然后,我们可以将向量 ( a , b , c ) (a, b, c) (a,b,c) 通过矩阵乘法 V × a V \times \mathbf{a} V×a 映射到多项式空间,其中 a \mathbf{a} a 是包含系数 a , b , c a, b, c a,b,c 的列向量。

如果我们现在有多项式 f ( x ) = a x 2 + b x + c f(x) = ax^2 + bx + c f(x)=ax2+bx+c 的系数 a , b , c a, b, c a,b,c,我们可以通过范德蒙矩阵的逆 V − 1 V^{-1} V1 进行逆运算,得到原始向量:

a = V − 1 × [ f ( x 1 ) f ( x 2 ) f ( x 3 ) ] \mathbf{a} = V^{-1} \times \begin{bmatrix} f(x_1) \\ f(x_2) \\ f(x_3) \\ \end{bmatrix} a=V1× f(x1)f(x2)f(x3)

这个例子展示了范德蒙矩阵如何在规范嵌入的逆运算中发挥作用,通过逆运算,我们可以从多项式的系数还原回原始的向量。

因此,范德蒙矩阵在规范嵌入的逆运算中具有重要作用,它允许我们从多项式空间返回到原始的向量空间。

Encoding in CKKS

CKKS利用整数多项式环的丰富结构来构建其明文空间和密文空间。然而,数据更常见地以向量的形式出现,而不是多项式的形式。

因此,有必要将输入 z ∈ C N / 2 z \in \mathbb{C}^{N/2} zCN/2 编码成一个多项式 m ( X ) ∈ Z [ X ] / ( X N + 1 ) m(X) \in \mathbb{Z}[X]/(X^N+1) m(X)Z[X]/(XN+1)

我们将我们的多项式的度数模数记为 N N N,它将是2的幂。我们用 Φ M ( X ) = X N + 1 \Phi_M(X) = X^N+1 ΦM(X)=XN+1 表示第 m m m 个循环多项式(注意这里 M = 2 N M=2N M=2N)。明文空间将是多项式环 R = Z [ X ] / ( X N + 1 ) R = \mathbb{Z}[X]/(X^N+1) R=Z[X]/(XN+1)。让我们用 ξ M \xi_M ξM 表示第 M M M 个单位根: ξ M = e 2 i π / M \xi_M = e^{2i\pi/M} ξM=e2/M

为了理解如何将向量编码为多项式以及多项式上的计算如何反映在底层向量中,我们首先通过一个简单的示例来实验,其中我们简单地将一个向量 z ∈ C N z \in \mathbb{C}^N zCN 编码为一个多项式 m ( X ) ∈ C [ X ] / ( X N + 1 ) m(X) \in \mathbb{C}[X]/(X^N+1) m(X)C[X]/(XN+1)。然后,我们将讨论CKKS的实际编码,它将一个向量 z ∈ C N / 2 z \in \mathbb{C}^{N/2} zCN/2 编码成一个多项式 m ( X ) ∈ Z [ X ] / ( X N + 1 ) m(X) \in \mathbb{Z}[X]/(X^N+1) m(X)Z[X]/(XN+1)

Vanilla Encoding

在这里,我们将讨论简单情况下将 z ∈ C N z \in \mathbb{C}^N zCN编码成多项式 m ( X ) ∈ C [ X ] / ( X N + 1 ) m(X) \in \mathbb{C}[X]/(X^N+1) m(X)C[X]/(XN+1)

为此,我们将使用规范嵌入 σ : C [ X ] / ( X N + 1 ) → C N \sigma: \mathbb{C}[X]/(X^N+1) \rightarrow \mathbb{C}^N σ:C[X]/(XN+1)CN,它解码和编码我们的向量。

这个想法很简单:要将多项式 m ( X ) m(X) m(X)解码为向量 z z z,我们在某些值上评估多项式,这些值将是循环多项式 Φ M ( X ) = X N + 1 \Phi_M(X) = X^N+1 ΦM(X)=XN+1的根。这些 N N N个根是: ξ , ξ 3 , … , ξ 2 N − 1 \xi, \xi^3, \ldots, \xi^{2N-1} ξ,ξ3,,ξ2N1

因此,要解码一个多项式 m ( X ) m(X) m(X),我们定义 σ ( m ) = ( m ( ξ ) , m ( ξ 3 ) , … , m ( ξ 2 N − 1 ) ) ∈ C N \sigma(m) = (m(\xi), m(\xi^3), \ldots, m(\xi^{2N-1})) \in \mathbb{C}^N σ(m)=(m(ξ),m(ξ3),,m(ξ2N1))CN。注意, σ \sigma σ定义了一个同构,这意味着它是一个双射同态,因此任何向量将被唯一编码为其相应的多项式,反之亦然。

棘手的部分是将一个向量 z ∈ C N z \in \mathbb{C}^N zCN编码成相应的多项式,这意味着计算逆变换 σ − 1 \sigma^{-1} σ1。因此,问题就是找到一个多项式 m ( X ) = ∑ i = 0 N − 1 α i X i ∈ C [ X ] / ( X N + 1 ) m(X) = \sum_{i=0}^{N-1} \alpha_i X^i \in \mathbb{C}[X]/(X^N+1) m(X)=i=0N1αiXiC[X]/(XN+1),给定一个向量 z ∈ C N z \in \mathbb{C}^N zCN,使得 σ ( m ) = ( m ( ξ ) , m ( ξ 3 ) , … , m ( ξ 2 N − 1 ) ) = ( z 1 , … , z N ) \sigma(m) = (m(\xi), m(\xi^3), \ldots, m(\xi^{2N-1})) = (z_1, \ldots, z_N) σ(m)=(m(ξ),m(ξ3),,m(ξ2N1))=(z1,,zN)

进一步追求这个线索,我们得到以下方程组:

∑ j = 0 N − 1 α j ( ξ 2 i − 1 ) j = z i , i = 1 , … , N . \sum_{j=0}^{N-1} \alpha_j (\xi^{2i-1})^j = z_i, \quad i=1, \ldots, N. j=0N1αj(ξ2i1)j=zi,i=1,,N.

这可以看作是一个线性方程:

A α = z A \alpha = z Aα=z
其中 A A A N N N个根 ( ξ 2 i − 1 ) i = 1 , … , N (\xi^{2i-1})_{i=1,\ldots,N} (ξ2i1)i=1,,N的范德蒙德矩阵, α \alpha α是多项式系数的向量, z z z是我们想要编码的向量。

因此我们有: α = A − 1 z \alpha = A^{-1} z α=A1z,并且 σ − 1 ( z ) = ∑ i = 0 N − 1 α i X i ∈ C [ X ] / ( X N + 1 ) \sigma^{-1}(z) = \sum_{i=0}^{N-1} \alpha_i X^i \in \mathbb{C}[X]/(X^N+1) σ1(z)=i=0N1αiXiC[X]/(XN+1)

Example

让我们现在看一个例子,以更好地理解我们到目前为止所讨论的内容。

M = 8 M=8 M=8 N = M / 2 = 4 N=M/2=4 N=M/2=4 Φ M ( X ) = X 4 + 1 \Phi_M(X)=X^4+1 ΦM(X)=X4+1 ω = e 2 i π / 8 = e i π / 4 \omega=e^{2i\pi/8}=e^{i\pi/4} ω=e2/8=e/4
我们的目标是编码以下向量: [ 1 , 2 , 3 , 4 ] [1,2,3,4] [1,2,3,4] [ − 1 , − 2 , − 3 , − 4 ] [-1,-2,-3,-4] [1,2,3,4],对它们进行解码,然后对它们的多项式进行加法和乘法,并最终解码结果。

在这里插入图片描述

正如我们所看到的,在解码多项式时,我们只需要在M次单位根的幂上对其进行评估。在这里,我们选择 ξ M = ω = e i π / 4 ξ_M = ω = e^{i\pi/4} ξM=ω=e/4

一旦我们有了 ξ ξ ξ M M M,我们就可以定义 σ σ σ 及其逆 σ − 1 σ^{-1} σ1,分别用于解码和编码。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序(3)——直接选择排序

目录 直接选择排序 基本思想 整体思路&#xff08;升序&#xff09; 单趟 多趟 代码实现 特性总结 直接选择排序 基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的…

使用OpenCV和mediapipe实现手部信息抓取

目录 运行效果 挨行解读 &#xff08;1&#xff09;初始化MediaPipe Hand模块 &#xff08;2&#xff09;打开摄像头 &#xff08;3&#xff09;初始化计时器 &#xff08;4&#xff09;开始程序主题部分 &#xff08;5&#xff09;读取视频帧 &#xff08;6&#xff09…

美团分布式 ID 框架 Leaf 介绍和使用

一、Leaf 在当今日益数字化的世界里&#xff0c;软件系统的开发已经成为了几乎所有行业的核心。然而&#xff0c;随着应用程序的规模不断扩大&#xff0c;以及对性能和可扩展性的需求不断增加&#xff0c;传统的软件架构和设计模式也在不断地面临挑战。其中一个主要挑战就是如…

LeetCode---386周赛

题目列表 3046. 分割数组 3047. 求交集区域内的最大正方形面积 3048. 标记所有下标的最早秒数 I 3049. 标记所有下标的最早秒数 II 一、分割数组 这题简单的思维题&#xff0c;要想将数组分为两个数组&#xff0c;且分出的两个数组中数字不会重复&#xff0c;很显然一个数…

2024第二次培训:win11系统下使用nginx、JDK、mysql搭建基于vue2、java前后端分离的web应用运行环境

一.背景 公司安排了带徒弟的任务&#xff0c;给培训写点材料。前面分开介绍了mysql、jdk、nginx的安装&#xff0c;都只是零星的介绍&#xff0c;只能算零散的学习。学习了有什么用呢&#xff1f;能解决什么问题&#xff1f;能完成什么工作&#xff1f; 今天我们要用之前的几篇…

高中数学:分式函数值域的求法

一、求值域的两种基本思路 1、根据函数图像和定义域求出值域。 难点&#xff1a;画出函数图像 2、研究函数单调性和定义域求出值域。 本篇主要讲一下&#xff0c;画图法求值域 二、函数图像画法 高中所学的分式函数&#xff0c;基本由反比例函数平移得到。 复杂分式函数图…

web漏洞与规避

文章目录 一、XSS 跨站脚本攻击1.1 XSS攻击的主要类型反射型XSS存储型XSSDOM型XSS 1.2 前端开发如何应对XSS 二、CSRF 跨站请求伪造2.1 CSRF例子2.2 前端开发如何应对CSRF 三、SQL 注入3.1 前端如何防御SQL注入 四、前端如何使用CSP 一、XSS 跨站脚本攻击 攻击者通过在受害者的…

Day12:信息打点-Web应用源码泄漏开源闭源指纹识别GITSVNDS备份

目录 开源-CMS指纹识别源码获取方式 闭源-习惯&配置&特性等获取方式 闭源-托管资产平台资源搜索监控 思维导图 章节点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/API接口/微…

【Python】进阶学习:pandas--如何根据指定条件筛选数据

【Python】进阶学习&#xff1a;pandas–如何根据指定条件筛选数据 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

synchrosized 的可重入特性、死锁、哲学家就餐问题以及解决死锁的方法等干货

文章目录 &#x1f490;synchrosized的可重入特性关于死锁&#xff1a;哲学家就餐问题&#x1f4a1;如何避免/解决死锁 &#x1f490;synchrosized的可重入特性 可重入特性&#xff1a;当一个线程针对一个对象同时加锁多次&#xff0c;不会构成死锁&#xff0c;这样的特性称为…

NoSQL--虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

今日Arxiv最热NLP大模型论文:Llama-2上下文扩大48倍的方法来了,港大发布,无需训练

引言&#xff1a;大语言模型的长上下文理解能力 在当今的人工智能领域&#xff0c;大语言模型&#xff08;Large Language Models&#xff0c;简称LLMs&#xff09;的长上下文理解能力成为了一个重要的研究方向。这种能力对于模型来说至关重要&#xff0c;因为它使得LLMs能够有…