参考文献:
- [GHPS12] Gentry C, Halevi S, Peikert C, et al. Ring switching in BGV-style homomorphic encryption[C]//International Conference on Security and Cryptography for Networks. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 19-37.
- [GHPS13] Gentry C, Halevi S, Peikert C, et al. Field switching in BGV-style homomorphic encryption[J]. Journal of Computer Security, 2013, 21(5): 663-684.
- [BCK+23] Bae Y, Cheon J H, Kim J, et al. HERMES: Efficient Ring Packing Using MLWE Ciphertexts and Application to Transciphering[C]//Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2023: 37-69.
文章目录
- Ring Packing
- Moduli optimization
- Ring switching
- Hermes
- MLWE Module-switch
- MLWE Key-switch
- ModPack
- BaseHERMES
- Implementation
- HHE
[BCK+23] 发现:对于大模数,环打包的开销会高于自举的开销。因此,他们先在小模数、小维度上打包,然后再合并为大维度,并利用自举提升模数。此外,他们提出在打包算法中插入 MLWE 中点,从而大幅减少 KSK 的规模,计算复杂度略微提升。
Ring Packing
环打包的任务是在 LWE-format 以及 RLWE-format 之间转换。应用的场景为:异构的数据类型、异构的运算宽度/数据量、细粒度存储数据、减小通信带宽。
环打包的实质就是同态计算 C ⋅ s ( m o d q ) C \cdot s \pmod{q} C⋅s(modq),其中 C ∈ Z q N × ( K + 1 ) C \in \mathbb Z_q^{N \times(K+1)} C∈ZqN×(K+1) 是由 N N N 个维度 K K K 的 LWE 密文堆叠出的矩阵, s ∈ Z K + 1 s \in \mathbb Z^{K+1} s∈ZK+1 是 LWE 私钥(表示为 s = ( 1 , s ′ ) , s ′ ∈ Z K s=(1,s'), s' \in \mathbb Z^{K} s=(1,s′),s′∈ZK)。[HS14] 提出了矩阵-向量乘积的三种算法:假设 RLWE 是强线性同态的([BV11] 或者 [GHS12])
- column method,
- 令 c j ∈ Z q N c_j \in \mathbb Z_q^N cj∈ZqN 是矩阵 C C C 的列矢,那么 C ⋅ s = ∑ j c j ⋅ s j C \cdot s = \sum_j c_j \cdot s_j C⋅s=∑jcj⋅sj
- 将 c j c_j cj 系数编码为多项式,将 s j s_j sj 分别作为常数多项式被加密,那么计算 K K K 次同态数乘以及加法,就得到了 coefficients-encoding 的打包密文
- Pub-KS of TFHE、[MS18]、Chimera 都是这个方法
- row method,
- 令 c i ∈ Z q K + 1 c_i \in \mathbb Z_q^{K+1} ci∈ZqK+1 是矩阵 C C C 的行矢,那么 C ⋅ s = [ ⟨ c i , s ⟩ ] i C \cdot s = [\langle c_i,s\rangle]_i C⋅s=[⟨ci,s⟩]i
- 将 c i c_i ci 系数编码为多项式,将 s s s 也系数编码为多项式并加密,那么计算单次同态数乘,它的常数项就是 ⟨ c i , s ⟩ \langle c_i,s\rangle ⟨ci,s⟩,使用 Galois 自同构计算 Trace 消除其他的系数,就得到了 coefficients-encoding 的打包密文
- LWE-to-RLWE 就是这个方法
- diagonal method,
- 令 d i ∈ Z q K + 1 d_i \in \mathbb Z_q^{K+1} di∈ZqK+1 是矩阵 C C C 的对角线,那么 C ⋅ s = ∑ i d i ⊙ ( s ⋘ i ) C \cdot s = \sum_i d_i \odot(s \lll i) C⋅s=∑idi⊙(s⋘i)
- 将 d i d_i di 槽打包为多项式,将 s s s 也槽打包为多项式并加密,使用 Galois 自同构实现 Rotate 以 BSGS 方式运算,就得到了 slots-encoding 的打包密文
- Pegasus 就是这个方法
[BCK+23] 的目标是:将大量的 LWE 密文高效地打包成为 slots-encoded RLWE-format pure-FHE。自举要求巨大的模数,从而维度也会很大,之前的那些打包算法存在诸多限制:系数打包、速度慢、仅支持少量 LWE 密文。
Moduli optimization
[BCK+23] 观察到:由 LWE 密文堆叠出的矩阵 C C C 没有特殊结构,因此计算 C ⋅ s C \cdot s C⋅s 需要大量的同态运算,每个同态操作都是在大模数上运行,都需要很多的 NTT 运算。
[BCK+23] 将打包操作放在尽可能小的模数上,然后用自举提升模数。他们观察到,对于大规模电路,模数编排所带来的收益,远大于自举的开销。类似于 RtF Framework,使用 HalfBTS 将系数打包的小模数 CKKS 密文转化为槽打包的大模数 CKKS 密文。
一些记号:
- L W E q K LWE_q^K LWEqK 是维度 K K K 模数 q q q 的 LWE 密文,私钥 s ∈ Z K s \in \mathbb Z^{K} s∈ZK
- R L W E q , N RLWE_{q,N} RLWEq,N 是维度 N N N 模数 q q q 的 RLWE 密文,私钥 s ∈ R N s \in R_{N} s∈RN
- Q E n c Q_{Enc} QEnc 是 Level 0 模数(保证解密正确), Q K S Q_{KS} QKS 是 Level 1 模数(做 KS 后解密仍正确), Q t o p Q_{top} Qtop 是 ModRaise 输出模数, Q r e f r e s h Q_{refresh} Qrefresh 是自举之前的模数, Q c o m p Q_{comp} Qcomp 是自举之后的模数,
- N E n c , N K S , N B T S N_{Enc}, N_{KS}, N_{BTS} NEnc,NKS,NBTS 是保证安全强度的必要维度
- 对于 HalfBTS,步骤是 ModRasie、CtS、EvalMod,第一步 StC 被省略,因此可以 Q r e f r e s h = Q E n c Q_{refresh} = Q_{Enc} Qrefresh=QEnc
Moduli-optimized ring packing:
- 将 LWE 密文使用 base ring packing 获得 coefficients-encoding RLWE 密文,模数是 Q E n c Q_{Enc} QEnc,维度是 N B T S N_{BTS} NBTS
- 调用 HalfBTS 将模数提升到 Q c o m p Q_{comp} Qcomp,并且成为 slots-encoding RLWE 密文
这里的 base ring packing 可以是上述的三种打包方法,但是 column method 不需要 Galois 自同构,因此不消耗 Levels,获得的收益会更大。
Ring switching
由于 base ring packing 只工作在很小的模数上,因此只要较低的维度就足够保证安全性。[BCK+23] 使用 Ring-Switch 技术,将 LWE 密文分成几组,每一组打包到低维度 RLWE 密文,然后再把它们合成出高维度 RLWE 密文。
目标的分圆环是
R
q
,
N
R_{q,N}
Rq,N,维度
N
N
N 是二的幂次。假设
k
∣
N
k \mid N
k∣N,那么根据:
∑
i
=
0
N
−
1
a
i
X
i
=
∑
i
=
0
k
−
1
X
i
⋅
∑
j
=
0
N
/
k
−
1
a
i
+
j
N
/
k
X
j
N
/
k
=
∑
i
=
0
k
−
1
X
i
⋅
a
(
i
)
(
X
N
/
k
)
\sum_{i=0}^{N-1} a_iX^i = \sum_{i=0}^{k-1} X^i\cdot\sum_{j=0}^{N/k-1}a_{i+jN/k}X^{jN/k} = \sum_{i=0}^{k-1} X^i\cdot a_{(i)}(X^{N/k})
i=0∑N−1aiXi=i=0∑k−1Xi⋅j=0∑N/k−1ai+jN/kXjN/k=i=0∑k−1Xi⋅a(i)(XN/k)
我们可以将
R
q
,
N
R_{q,N}
Rq,N 视为 rank-
k
k
k
R
q
,
N
/
k
R_{q,N/k}
Rq,N/k-module,确切地说:
R
q
,
N
=
Z
q
[
X
]
/
(
X
N
+
1
)
≅
(
Z
q
[
Y
]
/
(
Y
N
/
k
+
1
)
)
[
X
]
/
(
X
k
−
Y
)
=
R
q
,
N
/
k
[
X
]
/
(
X
k
−
Y
)
R_{q,N} = \mathbb Z_q[X]/(X^N+1) \cong (\mathbb Z_q[Y]/(Y^{N/k}+1))[X]/(X^k-Y) = R_{q,N/k}[X]/(X^k-Y)
Rq,N=Zq[X]/(XN+1)≅(Zq[Y]/(YN/k+1))[X]/(Xk−Y)=Rq,N/k[X]/(Xk−Y)
方便起见,我们用
X
N
X_N
XN 表示
R
q
,
N
R_{q,N}
Rq,N 的本原单位根,简记
β
i
=
X
N
i
,
0
≤
i
≤
k
−
1
\beta_i = X_N^i, 0 \le i\le k-1
βi=XNi,0≤i≤k−1,那么
{
β
i
}
\{\beta_i\}
{βi} 是一组
R
q
,
N
/
k
R_{q,N/k}
Rq,N/k-basis,
R
q
,
N
=
∑
i
=
0
k
−
1
R
q
,
N
/
k
⋅
β
i
R_{q,N} = \sum_{i=0}^{k-1} R_{q,N/k} \cdot \beta_i
Rq,N=i=0∑k−1Rq,N/k⋅βi
定义
π
q
,
N
k
:
R
q
,
N
→
(
R
q
,
N
/
k
)
k
\pi_{q,N}^k: R_{q,N} \to (R_{q,N/k})^k
πq,Nk:Rq,N→(Rq,N/k)k 是模分解(module decomposition map),具体是
π
q
,
N
k
(
a
)
=
(
a
(
0
)
,
⋯
,
a
(
k
−
1
)
)
\pi_{q,N}^k(a) = (a_{(0)}, \cdots, a_{(k-1)})
πq,Nk(a)=(a(0),⋯,a(k−1)),满足
a
=
∑
j
a
(
j
)
⋅
β
j
a = \sum_j a_{(j)}\cdot\beta_j
a=∑ja(j)⋅βj,这是一个
R
q
,
N
/
k
R_{q,N/k}
Rq,N/k-线性映射。定义
ι
q
,
N
k
:
R
q
,
N
/
k
→
R
q
,
N
\iota_{q,N}^k: R_{q,N/k} \to R_{q,N}
ιq,Nk:Rq,N/k→Rq,N 是环嵌入(ring embedding),具体是
ι
q
,
N
k
(
X
N
/
k
)
=
X
N
k
\iota_{q,N}^k(X_{N/k}) = X_N^k
ιq,Nk(XN/k)=XNk,这是一个
R
q
,
N
/
k
R_{q,N/k}
Rq,N/k-单同态。
假如 RLWE 密文 ( a , b ) ∈ R q , N 2 (a,b) \in R_{q,N}^2 (a,b)∈Rq,N2 的私钥是 s = s ( 0 ) ∈ R q , N / k s=s_{(0)} \in R_{q,N/k} s=s(0)∈Rq,N/k,相位是 b + a s = m b+as=m b+as=m,那么就有 b ( j ) + a ( j ) s ( 0 ) = m ( j ) b_{(j)} + a_{(j)}s_{(0)} = m_{(j)} b(j)+a(j)s(0)=m(j),从而可以把 ( a ( j ) , b ( j ) ) ∈ R q , N / k 2 (a_{(j)}, b_{(j)}) \in R_{q,N/k}^2 (a(j),b(j))∈Rq,N/k2 视为 m ( j ) ∈ R q , N / k m_{(j)} \in R_{q,N/k} m(j)∈Rq,N/k 的密文。定义如下的两个函数,
- Split:输入 ( a , b ) ∈ R q , N 2 (a,b) \in R_{q,N}^2 (a,b)∈Rq,N2,计算 ϕ q , N k ( a ) = ( a ( 0 ) , ⋯ , a ( k − 1 ) ) \phi_{q,N}^k(a) = (a_{(0)},\cdots,a_{(k-1)}) ϕq,Nk(a)=(a(0),⋯,a(k−1)) 以及 π q , N k ( a ) = ( a ( 0 ) , ⋯ , a ( k − 1 ) ) \pi_{q,N}^k(a) = (a_{(0)},\cdots,a_{(k-1)}) πq,Nk(a)=(a(0),⋯,a(k−1)),输出 ( a ( j ) , b ( j ) ) ∈ R q , N / k 2 (a_{(j)}, b_{(j)}) \in R_{q,N/k}^2 (a(j),b(j))∈Rq,N/k2
- Combine:输入 ( a ( j ) , b ( j ) ) ∈ R q , N / k 2 (a_{(j)}, b_{(j)}) \in R_{q,N/k}^2 (a(j),b(j))∈Rq,N/k2,计算 a = ∑ j ι q , N k ( a ( j ) ) ⋅ β j a=\sum_j\iota_{q,N}^k(a_{(j)})\cdot\beta_j a=∑jιq,Nk(a(j))⋅βj 以及 b = ∑ j ι q , N k ( b ( j ) ) ⋅ β j b=\sum_j\iota_{q,N}^k(b_{(j)})\cdot\beta_j b=∑jιq,Nk(b(j))⋅βj,输出 ( a , b ) ∈ R q , N 2 (a,b) \in R_{q,N}^2 (a,b)∈Rq,N2
它们就是系数的置换,计算开销可忽略。
[BCK+23] 将 N N N 个维度 K K K 的 LWE 密文分成 N / n N/n N/n 组,每一组打包成维度 n n n 的 RLWE 密文,然后将 N / n N/n N/n 个 RLWE 密文合成为维度 N N N 的 RLWE 密文,最后用 HalfBTS 提升模数。如图所示:
额外的优势是,低维度的环打包,所需的 KSK 规模也会更小一些。
Hermes
在三种打包算法中,列方法是最快的,并且更加适合上述的模数优化策略。然而,列方法需要分别加密 s j ∈ Z q , 0 ≤ j ≤ K − 1 s_j \in \mathbb Z_q, 0 \le j \le K-1 sj∈Zq,0≤j≤K−1,导致 KSK 规模的较大。为了进一步减小密钥规模,[BCK+23] 将上述的 Ring packing 推广到 Module packing,在 LWE 密文和 RLWE 密文之间插入 MLWE 密文,多层迭代。
一些记号:
- M L W E q , n k MLWE_{q,n}^k MLWEq,nk 是一个 MLWE 密文,模数 q q q,度数 n n n,秩 k k k,维度 N = n ⋅ k N=n \cdot k N=n⋅k
- 密文是 c = ( c [ 0 ] , c [ 1 ] , ⋯ , c [ k ] ) ∈ R q , n k + 1 c=(c[0],c[1],\cdots,c[k]) \in R_{q,n}^{k+1} c=(c[0],c[1],⋯,c[k])∈Rq,nk+1,简记 b = c [ 0 ] b=c[0] b=c[0] 以及 a = ( c [ 1 ] , ⋯ , c [ k ] ) ∈ R q , n k a=(c[1],\cdots,c[k]) \in R_{q,n}^k a=(c[1],⋯,c[k])∈Rq,nk,对应的私钥是 s ∈ R q , n k s \in R_{q,n}^k s∈Rq,nk
- 易知, M L W E q , 1 K = L W E q K MLWE_{q,1}^K = LWE_q^K MLWEq,1K=LWEqK, M L W E q , N 1 = R L W E q , N MLWE_{q,N}^1=RLWE_{q,N} MLWEq,N1=RLWEq,N
MLWE Module-switch
假设 l , k , n l,k,n l,k,n 都是二的幂次,密文 M L W E q , n l k MLWE_{q,nl}^k MLWEq,nlk 私钥是 s ∈ R n k ≤ R n l k s \in R_{n}^k \le R_{nl}^k s∈Rnk≤Rnlk,那么类似于 Ring Switch,可以定义如下的模切换(注意区分,模数切换,Modulus-Switching):
-
S
p
l
i
t
n
,
l
k
:
M
L
W
E
q
,
n
l
k
→
l
×
M
L
W
E
q
,
n
k
Split_{n,l}^k: MLWE_{q,nl}^k \to l \times MLWE_{q,n}^k
Splitn,lk:MLWEq,nlk→l×MLWEq,nk,
- 输入 c = M L W E q , n l k ( m ) c=MLWE_{q,nl}^{k}(m) c=MLWEq,nlk(m)
- 计算 π q , n l l ( c [ j ] ) = ( c 0 [ j ] , ⋯ , c l − 1 [ j ] ) , 0 ≤ j ≤ k \pi_{q,nl}^l(c[j]) = (c_0[j],\cdots,c_{l-1}[j]), 0\le j\le k πq,nll(c[j])=(c0[j],⋯,cl−1[j]),0≤j≤k
- 输出 c t = ( c t [ 0 ] , ⋯ , c t [ k ] ) ∈ R q , n k + 1 , 0 ≤ t ≤ l − 1 c_t=(c_t[0],\cdots, c_t[k]) \in R_{q,n}^{k+1}, 0\le t \le l-1 ct=(ct[0],⋯,ct[k])∈Rq,nk+1,0≤t≤l−1,它们分别加密了 m ( t ) m_{(t)} m(t)
-
C
o
m
b
i
n
e
n
,
l
k
:
l
×
M
L
W
E
q
,
n
k
→
M
L
W
E
q
,
n
l
k
Combine_{n,l}^k: l \times MLWE_{q,n}^k \to MLWE_{q,nl}^k
Combinen,lk:l×MLWEq,nk→MLWEq,nlk,
- 输入 c t = M L W E q , n k ( m t ) , 0 ≤ t ≤ l − 1 c_t = MLWE_{q,n}^k(m_t), 0\le t \le l-1 ct=MLWEq,nk(mt),0≤t≤l−1
- 计算 c [ j ] = ( π q , n l l ) − 1 ( c 0 [ j ] , ⋯ , c l − 1 [ j ] ) , 0 ≤ j ≤ k c[j]=(\pi_{q,nl}^l)^{-1}(c_0[j],\cdots,c_{l-1}[j]), 0\le j\le k c[j]=(πq,nll)−1(c0[j],⋯,cl−1[j]),0≤j≤k
- 输出 c = ( c [ 0 ] , ⋯ , c [ k ] ) ∈ R q , n l k + 1 c=(c[0],\cdots,c[k]) \in R_{q,nl}^{k+1} c=(c[0],⋯,c[k])∈Rq,nlk+1,它加密了 m = ∑ t m t ⋅ β t m=\sum_t m_{t}\cdot \beta_t m=∑tmt⋅βt
MLWE Key-switch
类似于 [CDKS21] 中的 LWE-to-LWE 算法,我们可以将 MLWE 上的 KS 过程也嵌入到 RLWE 上实现。
给定
a
,
s
∈
R
q
,
N
≅
R
q
,
n
[
X
N
]
/
(
X
N
k
−
X
n
)
a,s \in R_{q,N} \cong R_{q,n}[X_N]/(X_N^k-X_{n})
a,s∈Rq,N≅Rq,n[XN]/(XNk−Xn),其中
n
=
N
/
k
n=N/k
n=N/k,分别写作
a
=
∑
i
a
(
i
)
⋅
X
N
i
a=\sum_i a_{(i)}\cdot X_N^i
a=∑ia(i)⋅XNi 以及
s
=
∑
j
s
(
j
)
⋅
X
N
j
s=\sum_j s_{(j)}\cdot X_N^j
s=∑js(j)⋅XNj,那么
a
⋅
s
=
(
∑
i
=
0
k
−
1
a
(
i
)
⋅
X
N
i
)
⋅
(
∑
j
=
0
k
−
1
s
(
j
)
⋅
X
N
j
)
=
∑
t
=
0
k
−
1
X
N
t
⋅
(
∑
i
+
j
=
t
a
(
i
)
s
(
j
)
+
X
n
⋅
∑
i
+
j
=
k
+
t
a
(
i
)
s
(
j
)
)
\begin{aligned} a \cdot s &= \left(\sum_{i=0}^{k-1} a_{(i)}\cdot X_N^i\right) \cdot \left(\sum_{j=0}^{k-1} s_{(j)}\cdot X_N^j\right)\\ &= \sum_{t=0}^{k-1} X_N^t \cdot \left(\sum_{i+j=t} a_{(i)}s_{(j)} + X_{n} \cdot\sum_{i+j=k+t} a_{(i)}s_{(j)}\right) \end{aligned}
a⋅s=(i=0∑k−1a(i)⋅XNi)⋅(j=0∑k−1s(j)⋅XNj)=t=0∑k−1XNt⋅
i+j=t∑a(i)s(j)+Xn⋅i+j=k+t∑a(i)s(j)
它的常数项是
a
(
0
)
s
(
0
)
+
X
n
⋅
∑
i
=
1
k
−
1
a
(
k
−
i
)
s
(
i
)
a_{(0)}s_{(0)} + X_{n} \cdot \sum_{i=1}^{k-1} a_{(k-i)}s_{(i)}
a(0)s(0)+Xn⋅∑i=1k−1a(k−i)s(i),我们定义
a
∈
R
q
,
N
a \in R_{q,N}
a∈Rq,N 的扭曲(twist):
a
t
w
,
k
=
(
π
q
,
N
k
)
−
1
(
a
(
0
)
,
X
N
/
k
⋅
a
k
−
1
,
⋯
,
X
N
/
k
⋅
a
1
)
∈
R
q
,
N
a^{tw,k} = (\pi_{q,N}^k)^{-1}(a_{(0)}, X_{N/k} \cdot a_{k-1}, \cdots, X_{N/k} \cdot a_{1}) \in R_{q,N}
atw,k=(πq,Nk)−1(a(0),XN/k⋅ak−1,⋯,XN/k⋅a1)∈Rq,N
定义映射
ϵ
q
,
N
k
:
R
q
,
N
→
R
q
,
N
/
k
\epsilon_{q,N}^k: R_{q,N} \to R_{q,N/k}
ϵq,Nk:Rq,N→Rq,N/k,它计算
ϵ
q
,
N
k
(
a
)
=
π
q
,
N
k
(
a
)
[
0
]
=
a
(
0
)
\epsilon_{q,N}^k(a) = \pi_{q,N}^k(a)[0] = a_{(0)}
ϵq,Nk(a)=πq,Nk(a)[0]=a(0),那么就有:
ϵ
q
,
N
k
(
a
t
w
,
k
⋅
s
)
=
⟨
π
q
,
N
k
(
a
)
,
π
q
,
N
k
(
s
)
⟩
\epsilon_{q,N}^k(a^{tw,k} \cdot s) = \langle \pi_{q,N}^k(a), \pi_{q,N}^k(s) \rangle
ϵq,Nk(atw,k⋅s)=⟨πq,Nk(a),πq,Nk(s)⟩
也就是说,想要计算
⟨
π
q
,
N
k
(
a
)
,
π
q
,
N
k
(
s
)
⟩
\langle \pi_{q,N}^k(a), \pi_{q,N}^k(s) \rangle
⟨πq,Nk(a),πq,Nk(s)⟩ 内积,可以计算
a
t
w
,
k
⋅
s
a^{tw,k} \cdot s
atw,k⋅s 多项式乘积,然后再提取出
R
q
,
N
/
k
R_{q,N/k}
Rq,N/k-常数项。我们可以把
M
L
W
E
q
,
n
k
MLWE_{q,n}^k
MLWEq,nk 的线性解密视为
R
q
,
n
R_{q,n}
Rq,n 上的内积,嵌入到
R
L
W
E
q
,
N
RLWE_{q,N}
RLWEq,N 上计算多项式乘积,最后提取出
M
L
W
E
q
,
n
k
MLWE_{q,n}^k
MLWEq,nk 作为 KS 结果。对应的嵌入映射是:
E
m
b
e
d
q
,
N
k
:
M
L
W
E
q
,
n
k
→
R
L
W
E
q
,
N
(
b
,
a
)
∈
R
q
,
n
k
+
1
↦
(
ι
q
,
N
k
(
b
)
,
(
π
q
,
N
k
(
a
)
)
t
w
,
k
)
∈
R
q
,
N
2
\begin{aligned} Embed_{q,N}^k: MLWE_{q,n}^k &\to RLWE_{q,N}\\ (b,a) \in R_{q,n}^{k+1} &\mapsto \left(\iota_{q,N}^k(b), (\pi_{q,N}^k(a))^{tw,k}\right) \in R_{q,N}^2 \end{aligned}
Embedq,Nk:MLWEq,nk(b,a)∈Rq,nk+1→RLWEq,N↦(ιq,Nk(b),(πq,Nk(a))tw,k)∈Rq,N2
前者的相位是
m
∈
R
q
,
n
m \in R_{q,n}
m∈Rq,n,后者的相位是
M
∈
R
q
,
N
M \in R_{q,N}
M∈Rq,N,满足
ϵ
q
,
N
k
(
M
)
=
M
(
0
)
=
m
\epsilon_{q,N}^k(M)=M_{(0)}=m
ϵq,Nk(M)=M(0)=m,其余的
M
(
j
)
,
1
≤
j
≤
k
−
1
M_{(j)},1\le j\le k-1
M(j),1≤j≤k−1 是随机数。做完 RLWE KS 之后,需要提取出
m
m
m 对应的 MLWE 密文。对应的提取映射是:
E
x
t
r
a
c
t
q
,
N
k
:
R
L
W
E
q
,
N
→
M
L
W
E
q
,
n
k
(
b
,
a
)
∈
R
q
,
N
2
↦
(
ϵ
q
,
N
k
(
b
)
,
(
π
q
,
N
k
(
a
)
)
(
t
w
,
k
)
−
1
)
∈
R
q
,
n
k
+
1
\begin{aligned} Extract_{q,N}^k: RLWE_{q,N} &\to MLWE_{q,n}^k\\ (b,a) \in R_{q,N}^2 &\mapsto \left( \epsilon_{q,N}^k(b), (\pi_{q,N}^k(a))^{(tw,k)^{-1}} \right) \in R_{q,n}^{k+1} \end{aligned}
Extractq,Nk:RLWEq,N(b,a)∈Rq,N2→MLWEq,nk↦(ϵq,Nk(b),(πq,Nk(a))(tw,k)−1)∈Rq,nk+1
那么 MLWE-to-MLWE 过程就是:
ModPack
利用上述的 C o m b i n e n , l k Combine_{n,l}^k Combinen,lk 以及 E m b e d q , N k Embed_{q,N}^k Embedq,Nk 和 E x t r a c t q , N k Extract_{q,N}^k Extractq,Nk,可以实现 Module-packing 算法,记为 M o d P a c k q , N K , k , k ′ ModPack_{q,N}^{K,k,k'} ModPackq,NK,k,k′。它将若干个 M L W E q , N / k K MLWE_{q,N/k}^K MLWEq,N/kK 打包到单个 M L W E q , N / k ′ k ′ MLWE_{q,N/k'}^{k'} MLWEq,N/k′k′,其中 1 ≤ k ′ < k ≤ N 1 \le k' < k \le N 1≤k′<k≤N 都是二的幂次,并且 k ′ ∣ K k' \mid K k′∣K 是某整数。
由于
M
L
W
E
q
,
N
/
k
K
MLWE_{q,N/k}^K
MLWEq,N/kK 加密了
N
/
k
N/k
N/k 个数据,
M
L
W
E
q
,
N
/
k
′
k
′
MLWE_{q,N/k'}^{k'}
MLWEq,N/k′k′ 加密了
N
/
k
′
N/k'
N/k′ 个数据,因此我们可以先将
k
/
k
′
k/k'
k/k′ 个
M
L
W
E
q
,
N
/
k
K
(
m
j
)
MLWE_{q,N/k}^K(m_j)
MLWEq,N/kK(mj) 密文,利用 Module-switch 合并为单个
C
=
M
L
W
E
q
,
N
/
k
′
K
(
(
π
q
,
N
/
k
′
k
/
k
′
)
−
1
(
m
0
,
⋯
,
m
k
/
k
′
−
1
)
)
C = MLWE_{q,N/k'}^K \left((\pi_{q,N/k'}^{k/k'})^{-1}(m_0, \cdots, m_{k/k'-1})\right)
C=MLWEq,N/k′K((πq,N/k′k/k′)−1(m0,⋯,mk/k′−1)) 密文,它的线性解密是:
C
[
0
]
+
∑
i
=
1
K
C
[
i
]
⋅
s
[
i
]
=
(
C
[
0
]
+
∑
i
=
1
k
′
C
[
i
]
⋅
s
[
i
]
)
+
∑
j
=
1
K
/
k
′
−
1
(
0
+
∑
i
=
1
k
′
C
[
k
′
j
+
i
]
⋅
s
[
k
′
j
+
i
]
)
\begin{aligned} C[0]+\sum_{i=1}^{K} C[i]\cdot s[i] = \left(C[0]+\sum_{i=1}^{k'} C[i]\cdot s[i]\right) + \sum_{j=1}^{K/k'-1}\left(0+\sum_{i=1}^{k'} C[k'j+i]\cdot s[k'j+i]\right) \end{aligned}
C[0]+i=1∑KC[i]⋅s[i]=
C[0]+i=1∑k′C[i]⋅s[i]
+j=1∑K/k′−1
0+i=1∑k′C[k′j+i]⋅s[k′j+i]
我们将
C
C
C 视为
K
/
k
′
K/k'
K/k′ 个
M
L
W
E
q
,
N
/
k
′
k
′
MLWE_{q,N/k'}^{k'}
MLWEq,N/k′k′ 密文的加和,然后利用 MLWE-to-MLWE 将它们分别切换到
M
L
W
E
q
,
N
/
k
′
k
′
MLWE_{q,N/k'}^{k'}
MLWEq,N/k′k′ 密文。这里可以使用 hoisting 技术优化。
使用 [GHS12] 版本的 RLWE KS 算法,那么 ModPack 算法为:
算法 M o d P a c k q , N K , k , k ′ ModPack_{q,N}^{K,k,k'} ModPackq,NK,k,k′ 的 step 6 中,首先执行 K / k ′ K/k' K/k′ 次 ModUp(从 q q q 扩展到 q p qp qp),然后执行 2 K / k ′ 2K/k' 2K/k′ 次阿达玛乘法(线性解密),接着先计算它们的加和,最后执行 1 1 1 次 ModDown(从 q p qp qp 切换到 q q q)。其中的 ModUp 和 ModDown 需要执行 RNSConv 以及 NTT,占据主要开销。KSK 包含 K / k ′ K/k' K/k′ 个 swk,每个都是 R q p , N 2 R_{qp,N}^2 Rqp,N2 中元素,总大小是 2 N log ( q p ) 2N\log(qp) 2Nlog(qp)(如果使用 Hybrid KS 呢?)
BaseHERMES
给定 N N N 个维度 K ≥ N E n c K \ge N_{Enc} K≥NEnc 模数 Q E n c Q_{Enc} QEnc 的 LWE 密文,将它打包成单个维度 N ≥ N K S N \ge N_{KS} N≥NKS 模数 Q E n c Q_{Enc} QEnc 的 RLWE 密文。[BCK+23] 插入 t t t 层 MLWE 中间密文,对应的参数 κ = { N = k 0 > k 1 > ⋯ > k t > 1 = k t + 1 } \kappa=\{N=k_0 >k_1 > \cdots > k_t > 1=k_{t+1}\} κ={N=k0>k1>⋯>kt>1=kt+1},算法 B a s e H E R M E S N K , κ BaseHERMES_{N}^{K,\kappa} BaseHERMESNK,κ 的计算流程是:
其中的 step i i i 都是将 k i − 1 k_{i-1} ki−1 个 M L W E Q , N / k i − 1 k i − 1 MLWE_{Q,N/k_{i-1}}^{k_{i-1}} MLWEQ,N/ki−1ki−1 密文分成 k i k_i ki 组,并行执行它们的 ModPack 得到 k i k_i ki 个 M L W E Q , N / k i k i MLWE_{Q,N/k_{i}}^{k_{i}} MLWEQ,N/kiki 密文。算法是:
计算复杂度和密钥规模是:
对于 t = 1 t=1 t=1 的情况,为了尽可能减小 KSK 规模,最优的选取是 κ = { N } \kappa=\{\sqrt N\} κ={N},此时只需要 2 N 2\sqrt N 2N 的存储开销,计算复杂度略微增长。对于一般的 t ≥ 2 t \ge 2 t≥2,设置等比数列 k i = K 1 − i / ( t + 1 ) k_i = K^{1-i/(t+1)} ki=K1−i/(t+1),那么存储开销是 ( t + 1 ) ⋅ K 1 / ( t + 1 ) (t+1) \cdot K^{1/(t+1)} (t+1)⋅K1/(t+1),计算开销 ≤ 3 K + 1 \le 3K+1 ≤3K+1 也不会变得很大。
为了实现 N ≥ N B T S N\ge N_{BTS} N≥NBTS 的环打包,可以将 LWE 密文分成 N B T S / N K S N_{BTS}/N_{KS} NBTS/NKS 组,每一组都并行执行 BaseHERMES 获得维度 N K S N_{KS} NKS 的 RLWE 密文,最后再 Ring-switch 合成单个维度 N B T S N_{BTS} NBTS 的 RLWE 密文。最后,执行 HalfBTS 提升模数,完成打包运算。
Implementation
[BCK+23] 在 HEaaN 实现了 HERMES 环打包算法。使用 t = 1 t=1 t=1 时效率依旧很高,并且此时的 KSK 就足够小了,BTS 密钥占据了主要的存储开销(667 MB)
它和 Pegasus 的对比:
吞吐率提高了 27-41 倍,计算延迟减小了 1.7-5.1 倍。
HHE
利用 HERMES 可以直接使用 LWE 去加密浮点数,不需要像 RtF Framework 那样使用 BGV/BFV 作为 SE 解密的桥梁。利用 [CDK+21] 的 (M)LWE-based SE,使用 XOF 和 seed 生成 a i ∈ Z q K a_i \in \mathbb Z_q^{K} ai∈ZqK,细粒度地加密 b i = ⟨ a i , s ⟩ + m i ∈ Z q b_i=\langle a_i,s\rangle+m_i \in \mathbb Z_q bi=⟨ai,s⟩+mi∈Zq,并使用 ModDown 尽可能降低 q q q 的大小。服务器将它们按照功能需要打包成 RLWE 密文。
它和 HERA 以及 Rubato 对比,服务端的解密速度快,解密精度更高,但是密文扩展因子略大。但是客户端的加密效率呢?MLWE-based SE 需要大量的 XOF 运算,这应该是很慢的。