Yang's blog Yang's blog
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xiaoyang

编程爱好者
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 现代密码学

    • Chapter 0:Introduction to Modern Cryptography
    • Chapter 1:Introduction and Classical Cryptography
    • Chapter 2:Perfectly Secret Encryption
    • PChapter 3:rivate-Key Encryption
    • Chapter 4:Message Authentication Codes
    • Chapter 5:CCA-Security and Authenticated Encryption
    • Chapter 6:Hash Functions and Applications
    • Chapter 9:Number Theory and Cryptographic Hardness Assumptions
    • Chapter 11:Key Management and the Public-Key Revolution
  • 对称加密

    • DES加密算法详解
  • 同态加密方案

    • RSA乘法同态
    • Paillier 加法同态
    • 可验证Paillier同态加密
    • CKKS EXPLAINED PART 1, VANILLA ENCODING AND DECODING
      • Introduction
      • Encoding in CKKS
      • Vanilla Encoding
      • Example
    • CKKS EXPLAINED, PART 2 FULL ENCODING AND DECODING
    • CKKS EXPLAINED, PART 3 ENCRYPTION AND DECRYPTION
    • CKKS EXPLAINED, PART 4 MULTIPLICATION AND RELINEARIZATION
    • CKKS EXPLAINED, PART 5 RESCALING
  • 隐私计算框架

    • pysyft

      • README
      • PySyfy介绍
      • 数据集与资产
      • 客户端和 Datasite 访问
      • 提出研究问题
      • 审查代码请求
      • 检索结果
  • 安全知识

    • 信息安全四大顶会与分级
    • 数字签名与数字证书关系
    • 伪随机函数在密码学中的作用及其应用实例
    • 伪随机函数在与哈希函数的关系
  • 密码学
  • 同态加密方案
xiaoyang
2024-05-10
目录

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,即我们想要进行某些计算的值向量,首先被编码成一个明文多项式p(X),然后使用公钥进行加密。

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

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

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

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

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

相关知识:

分圆多项式

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

  1. 它具有整数系数;
  2. 它是多项式xn−1的因式,但不是xk−1的因式,其中k<n;
  3. 它的根是所有与n互质的正整数k所对应的第n个原始单位根e2iπkn。

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

Φn(x)=∏1≤k≤ngcd(k,n)=1(x−e2iπkn)

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

∏d|nΦd(x)=xn−1

这表明如果x是xn−1的根,那么它就是某个能整除n的d次原始单位根的根。

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

  1. 如果n是一个素数,分圆多项式Φn(x)为:
Φn(x)=1+x+x2+…+xn−1=∑k=0n−1xk

这里的xn−1表示最高次幂是n−1的项,系数1,x,x2,…,xn−1都是整数。

  1. 如果n=2p,其中p是一个奇素数,分圆多项式Φ2p(x)为:
Φ2p(x)=1−x+x2−…+(−1)p−1xp−1=∑k=0p−1(−x)k

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

For n up to 16, the cyclotomic polynomials are::

规范嵌入(Canonical embedding)

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

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

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

让我们通过一个具体的例子来进一步理解规范嵌入(Canonical embedding)的概念及其在将向量映射到多项式空间中的应用。

假设我们有一个三维向量空间R3,并想要将这个空间中的向量映射到二次多项式空间R2[x](即所有形如ax2+bx+c的多项式构成的空间)中,==一个n−1次多项式在n个不同点的取值唯一确定了该多项式==。

我们可以定义如下的规范嵌入映射:

ϕ:R3→R2[x]ϕ(a,b,c)=a′x2+b′x+c′

这里,向量(a,b,c)被直接映射到一个二次多项式a′x2+b′x+c′上。此映射是线性的,并且是一个同构映射,因为它是双射(即一一对应且满射)并且保留了向量空间的线性结构。

同构的性质:

  1. 一一对应:每个向量(a,b,c)都映射到一个唯一确定的多项式a′x2+b′x+c′,反之亦然。

  2. 运算保持:如果在向量空间中定义了向量的加法和标量乘法,那么这些运算通过映射ϕ​ 直接转换为多项式的相应运算:

    ϕ(a1,b1,c1)+ϕ(a2,b2,c2)=(a1′+a2′)x2+(b1′+b2′)x+(c1′+c2′)λϕ(a,b,c)=(λa′)x2+(λb′)x+(λc′)

这种映射方式使得原始的向量空间运算可以无缝地转换成多项式空间中的运算,非常适合在计算和理论分析中使用。

在密码学中,这种类型的嵌入尤其有用,例如在设计同态加密算法时。同态加密算法允许在加密数据上直接进行某些类型的计算,而无需先解密数据。通过规范嵌入,我们可以将实际的数据向量编码为多项式,然后在多项式形式的加密数据上执行运算,最后再解码回原始数据向量,而在整个过程中数据始终保持加密状态。

# Encoding in CKKS

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

因此,有必要将输入z∈CN/2编码成一个多项式m(X)∈Z[X]/(XN+1)。

我们将我们的多项式的度数模数记为N,它将是2的幂。我们用ΦM(X)=XN+1表示第m个分圆多项式(注意这里M=2N)。明文空间将是多项式环R=Z[X]/(XN+1)。让我们用ξM表示第M个单位根:ξM=e2iπ/M。

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

# Vanilla Encoding

在这里,我们将讨论简单情况下将z∈CN编码成多项式m(X)∈C[X]/(XN+1)。

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

这个想法很简单:要将多项式m(X)解码为向量z,我们在某些值上评估多项式,这些值将是分圆多项式ΦM(X)=XN+1的根。这些N个根是:ξ,ξ3,…,ξ2N−1。

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

==棘手的部分是将一个向量z∈CN编码成相应的多项式,这意味着计算逆变换σ−1==。因此,==问题就是找到一个多项式==m(X)=∑i=0N−1αiXi∈C[X]/(XN+1),给定一个向量z∈CN,使得σ(m)=(m(ξ),m(ξ3),…,m(ξ2N−1))=(z1,…,zN)。

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

∑j=0N−1αj(ξ2i−1)j=zi,i=1,…,N.

这可以看作矩阵相乘:

[1ξ1ξ2⋯ξN−11(ξ3)1(ξ3)2⋯(ξ3)N−11(ξ5)1(ξ5)2⋯(ξ5)N−1⋮⋮⋮⋱⋮1(ξ2N−1)1(ξ2N−1)2⋯(ξ2N−1)N−1][a0a1a2⋮aN−1]=[z1z2z3⋮zN]
Aα=z

其中A是N个根(ξ2i−1)i=1,…,N的范德蒙德矩阵,α是多项式系数的向量,z是我们想要编码的向量。

因此我们有:α=A−1z,并且σ−1(z)=∑i=0N−1αiXi∈C[X]/(XN+1)。

# Example

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

设M=8,N=M/2=4,ΦM(X)=X4+1,ω=e2iπ/8=eiπ/4。
我们的目标是编码以下向量:[1,2,3,4]和[−1,−2,−3,−4],对它们进行解码,然后对它们的多项式进行加法和乘法,并最终解码结果。

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

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

编辑 (opens new window)
上次更新: 2025/04/01, 01:48:12

← 可验证Paillier同态加密 CKKS EXPLAINED, PART 2 FULL ENCODING AND DECODING→

最近更新
01
操作系统
03-18
02
Nginx
03-17
03
后端服务端主动推送消息的常见方式
03-11
更多文章>
Theme by Vdoing | Copyright © 2023-2025 xiaoyang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式