CKKS EXPLAINED, PART 2: FULL ENCODING AND DECODING

本文详细解释了在CKKS加密方案中,如何构建编码器和解码器,以将复数向量转换为多项式并在加密状态下进行计算。涉及规范嵌入、整数系数处理和coordinate-wiserandomrounding技术的应用。
摘要由CSDN通过智能技术生成

CKKS EXPLAINED, PART 2: FULL ENCODING AND DECODING

Introduction

在之前的文章《解析CKKS:第一部分,基本编码和解码》中,我们了解到为了在加密的复数向量上进行计算,我们必须首先构建一个编码器和一个解码器,将我们的复数向量转化为多项式。

编码器和解码器的步骤是必要的,因为加密、解密和其他机制都是基于多项式环进行的。因此,我们需要一种将实值向量转化为多项式的方法。

我们还了解到,通过使用规范嵌入 σ \sigma σ,简单地通过在 X N + 1 X^N+1 XN+1的根上对多项式进行求值,我们能够在 C N \mathbb{C}^N CN C [ X ] / ( X N + 1 ) \mathbb{C}[X]/(X^N+1) C[X]/(XN+1)之间建立一个同构。然而,由于我们希望我们的编码器输出 Z [ X ] / ( X N + 1 ) \mathbb{Z}[X]/(X^N+1) Z[X]/(XN+1)环中的多项式,以便利用多项式整数环的结构,我们需要修改第一个基本编码器,使其能够输出正确环中的多项式。

因此,在本文中,我们将探讨如何实现原始论文《用于近似数算术的同态加密》中使用的编码器和解码器,这将是我们从头开始实现CKKS的第一步。

让我们以一个具体的例子来说明通过规范嵌入建立同构映射的概念。

假设我们有一个复数向量空间 C 3 \mathbb{C}^3 C3,表示为 ( a , b , c ) (a, b, c) (a,b,c),其中 a , b , c a, b, c a,b,c都是复数。我们希望将这个复数向量映射到多项式环 C [ X ] / ( X 3 + 1 ) \mathbb{C}[X]/(X^3+1) C[X]/(X3+1)中的一个多项式。

首先,我们需要选择一个规范嵌入 σ \sigma σ,它将多项式环中的元素映射到复数向量空间中。对于CKKS方案,常用的规范嵌入是通过在 X 3 + 1 X^3+1 X3+1的根上进行求值。 X 3 + 1 X^3+1 X3+1的根可以表示为 ω 1 , ω 2 , ω 3 \omega_1, \omega_2, \omega_3 ω1,ω2,ω3,它们是复数。

现在,我们可以使用规范嵌入 σ \sigma σ将复数向量 ( a , b , c ) (a, b, c) (a,b,c)映射到多项式环 C [ X ] / ( X 3 + 1 ) \mathbb{C}[X]/(X^3+1) C[X]/(X3+1)中的一个多项式。具体操作如下:

  1. 将复数向量的每个元素分别与根 ω 1 , ω 2 , ω 3 \omega_1, \omega_2, \omega_3 ω1,ω2,ω3进行求值。假设求值结果分别为 σ ( a ) , σ ( b ) , σ ( c ) \sigma(a), \sigma(b), \sigma(c) σ(a),σ(b),σ(c)

  2. 使用这些求值结果构建一个多项式,例如 p ( X ) = σ ( a ) X 2 + σ ( b ) X + σ ( c ) p(X) = \sigma(a)X^2 + \sigma(b)X + \sigma(c) p(X)=σ(a)X2+σ(b)X+σ(c)

  3. 将多项式 p ( X ) p(X) p(X)模掉多项式 X 3 + 1 X^3+1 X3+1,得到在多项式环 C [ X ] / ( X 3 + 1 ) \mathbb{C}[X]/(X^3+1) C[X]/(X3+1)中的一个同余类。

通过这个过程,我们将复数向量 ( a , b , c ) (a, b, c) (a,b,c)成功地映射到了多项式环 C [ X ] / ( X 3 + 1 ) \mathbb{C}[X]/(X^3+1) C[X]/(X3+1)中的一个多项式。这样,我们就建立了复数向量空间 C 3 \mathbb{C}^3 C3和多项式环 C [ X ] / ( X 3 + 1 ) \mathbb{C}[X]/(X^3+1) C[X]/(X3+1)之间的同构映射。

在CKKS方案中,这样的同构映射使得我们可以在复数向量空间中进行方便的计算,然后将结果转换回多项式环中的同余类,从而实现在加密状态下对复数向量进行计算。

CKKS encoding

与上一篇文章的不同之处在于,编码多项式的明文空间现在是 R = Z [ X ] / ( X N + 1 ) \mathcal{R}=\mathbb{Z}[X]/(X^N+1) R=Z[X]/(XN+1)而不是 C [ X ] / ( X N + 1 ) \mathbb{C}[X]/(X^N+1) C[X]/(XN+1),因此编码值多项式的系数必须具有整数系数。然而,当我们在 C N \mathbb{C}^N CN 中对向量进行编码时,我们了解到其编码不一定具有整数系数。

为了解决这个问题,让我们来看一下规范嵌入 σ \sigma σ R R R上的图像。

因为 R \mathcal{R} R中的多项式具有整数系数,即实系数,并且我们在复数根上进行评估,其中一半是另一半的共轭(参见前面的图),我们有:
σ ( R ) ⊆ H = z ∈ C N : z j = z − j ‾ . \sigma(\mathcal{R})\subseteq\mathbb{H}=z\in\mathbb{C}^N:z_j=\overline{z_{-j}}. σ(R)H=zCN:zj=zj.

回想一下之前的图像,当 M = 8 M=8 M=8时:

在这里插入图片描述

在这张图片上,我们可以看到 ω 1 = ω 7 ‾ \omega_1=\overline{\omega_7} ω1=ω7 ω 3 = ω 5 ‾ \omega_3=\overline{\omega_5} ω3=ω5。一般来说,因为我们在 X N + 1 X^N+1 XN+1 的根上评估一个实多项式,我们也有对于任意的多项式 m ( X ) ∈ R m(X)\in\mathcal{R} m(X)R, m ( ξ j ) = m ( ξ − j ) ‾ = m ( ξ − j ‾ ) . m(\xi^j)=\overline{m(\xi^{-j})}=m(\overline{\xi^{-j}}). m(ξj)=m(ξj)=m(ξj).

因此, σ ( R ) \sigma(\mathcal{R}) σ(R) 中的任意元素实际上位于一个维度为 N / 2 N/2 N/2 而不是 N N N 的空间中。因此,如果我们在 CKKS 中将一个向量编码为大小为 N / 2 N/2 N/2 的复向量,我们需要通过复制共轭根的另一半来扩展它们。

这个操作,将 H \mathbb{H} H 中的元素投影到 C N / 2 \mathbb{C}^{N/2} CN/2 中,被称为 CKKS 论文中的 π \pi π。需要注意的是,这也定义了一个同构。

现在,我们可以从 z ∈ C N / 2 z\in\mathbb{C}^{N/2} zCN/2 开始,使用 π − 1 \pi^{-1} π1 进行扩展(注意 π \pi π 进行投影, π − 1 \pi^{-1} π1 进行扩展),然后我们得到 π − 1 ( z ) ∈ H \pi^{-1}(z)\in \mathbb{H} π1(z)H

我们面临的一个问题是,我们不能直接使用 σ : R = Z [ X ] / ( X N + 1 ) → σ ( R ) ⊆ H \sigma:\mathcal{R}=\mathbb{Z}[X]/(X^N+1)\to\sigma(\mathcal{R})\subseteq\mathbb{H} σ:R=Z[X]/(XN+1)σ(R)H,因为 H \mathbb{H} H 中的元素不一定在 σ ( R ) \sigma(\mathcal{R}) σ(R) 中。 σ \sigma σ 确实定义了一个同构,但只从 R \mathcal{R} R σ ( R ) \sigma(\mathcal{R}) σ(R)。如果你自己验证 σ ( R ) \sigma(\mathcal{R}) σ(R) 不等于 H \mathbb{H} H,你会注意到 R \mathcal{R} R 是可数的,因此 σ ( R ) \sigma(\mathcal{R}) σ(R) 也是,但 H \mathbb{H} H 不是,因为它与 C N / 2 \mathbb{C}^{N/2} CN/2 同构。

这个细节很重要,因为它意味着我们必须找到一种将 π − 1 ( z ) \pi^{-1}(z) π1(z) 投影到 σ ( R ) \sigma(\mathcal{R}) σ(R) 的方法。为了做到这一点,我们将使用一种称为“coordinate-wise random rounding”的技术,它在《A Toolkit for Ring-LWE Cryptography》中进行了定义。这种舍入技术允许将实数 x x x 舍入为 ⌊ x ⌋ \lfloor x \rfloor x ⌊ x ⌋ + 1 \lfloor x \rfloor + 1 x+1,其概率与 x x x 距离 ⌊ x ⌋ \lfloor x \rfloor x ⌊ x ⌋ + 1 \lfloor x \rfloor + 1 x+1 越接近时越高。我们不会详细介绍这个算法,但我们将实现它。

这个想法很简单: R \mathcal{R} R具有一个正交的 Z -basis  \mathbb{Z}\text{-basis } Z-basis  1 , X , … , X N − 1 1,X,\ldots,X^{N-1} 1,X,,XN1,而且由于 σ \sigma σ是一个同构, σ ( R ) \sigma(\mathcal{R}) σ(R)具有一个正交的 Z -basis  \mathbb{Z}\text{-basis } Z-basis  β = ( b 1 , b 2 , … , b N ) = ( σ ( 1 ) , σ ( X ) , … , σ ( X N − 1 ) ) \beta=(b_1,b_2,\ldots,b_N)=(\sigma(1),\sigma(X),\ldots,\sigma(X^{N-1})) β=(b1,b2,,bN)=(σ(1),σ(X),,σ(XN1))。因此,对于任意的 z ∈ H z\in \mathbb{H} zH,我们只需要将其投影到 β \beta β上:
z = ∑ i = 1 N z i b i ,with z i = < z , b i > ∣ ∣ b i ∣ ∣ 2 ∈ R . z=\sum_{i=1}^Nz_ib_i\text{,with}z_i=\frac{<z,b_i>}{||bi||^2}\in\mathbb{R}. z=i=1Nzibi,withzi=∣∣bi2<z,bi>R.
因为基是正交的(但不一定是标准正交的),我们有 z i = ⟨ z , b i ⟩ ∥ b i ∥ 2 z_i = \frac{\langle z, b_i\rangle}{\|b_i\|_2} zi=bi2z,bi. 在这里,我们使用的是共轭内积: < x , y > = ∑ i = 1 N x i y i ‾ <x,y>=\sum_{i=1}^Nx_i\overline{y_i} <x,y>=i=1Nxiyi. 共轭内积的结果是实数,因为我们将其应用在 H \mathbb{H} H 的元素上。你可以自行计算验证,或者注意到 H \mathbb{H} H R N \mathbb{R}^N RN 之间存在一个等距同构,因此在 H \mathbb{H} H 中的内积将产生实数输出。

最后,一旦我们得到了坐标 z i z_i zi,我们只需要对它们进行随机舍入,舍入到最近的整数(向上或向下),使用"coordinate-wise random rounding"的方法。这样,我们将得到一个多项式,其在基( σ ( 1 ) , σ ( X ) , … , σ ( X N − 1 ) \sigma(1),\sigma(X),\ldots,\sigma(X^{N-1}) σ(1),σ(X),,σ(XN1))下具有整数坐标,因此该多项式将属于 σ ( R ) \sigma(\mathcal{R}) σ(R),这样我们就完成了这一步。

一旦我们投影到 σ ( R ) \sigma(\mathcal{R}) σ(R),我们可以应用 σ − 1 \sigma^{-1} σ1,它将输出一个属于 R \mathcal{R} R 的元素,这也正是我们想要的!

为了保持精度,在舍入过程中我们引入一个缩放因子 Δ > 0 \Delta > 0 Δ>0。在编码时,我们将输入值乘以 Δ \Delta Δ,而在解码时,我们将结果除以 Δ \Delta Δ,以保持精度为 1 / Δ 1/\Delta 1/Δ。为了说明这个过程,假设我们想要将 x = 1.4 x = 1.4 x=1.4 舍入到最接近的 0.25 0.25 0.25 的倍数,而不是舍入到最接近的整数。那么我们可以设置缩放因子 Δ = 4 \Delta = 4 Δ=4,这样精度就为 1 / Δ = 0.25 1/\Delta = 0.25 1/Δ=0.25。因此,当我们计算 ⌊ Δ x ⌋ = ⌊ 4 × 1.4 ⌋ = ⌊ 5.6 ⌋ = 6 \lfloor \Delta x \rfloor = \lfloor 4 \times 1.4 \rfloor = \lfloor 5.6 \rfloor = 6 Δx=4×1.4=5.6=6。一旦我们将结果除以相同的缩放因子 Δ \Delta Δ,我们得到 6 / 4 = 1.5 6 / 4 = 1.5 6/4=1.5,这确实是最接近 x = 1.4 x = 1.4 x=1.4 0.25 0.25 0.25 的倍数。

因此,最终的编码过程如下:

  1. 取一个元素 z ∈ C N / 2 z \in \mathbb{C}^{N/2} zCN/2

  2. 将其扩展为 π − 1 ( z ) ∈ H \pi^{-1}(z) \in \mathbb{H} π1(z)H

  3. 将其乘以 Δ \Delta Δ 以保持精度。

  4. 将其投影到 σ ( R ) \sigma(\mathcal{R}) σ(R) ⌊ Δ . π − 1 ( z ) ⌉ σ ( R ) ∈ σ ( R ) \lfloor\Delta.\pi^{-1}(z)\rceil_{\sigma(\mathcal{R})}\in\sigma(\mathcal{R}) Δ.π1(z)σ(R)σ(R)

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

解码过程则简单得多,对于多项式 m ( X ) m(X) m(X),我们只需进行以下操作: z = π ∘ σ ( Δ − 1 ⋅ m ) z = \pi \circ \sigma(\Delta^{-1} \cdot m) z=πσ(Δ1m).

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值