参考文献:
[DGH+23] 给出了 HHE 的形式化定义,设计了一个通用的 HHE 测试框架,并评估了目前已有的 HHE 方案的执行效率。他们发现即使是很小的用例(use case)它们也都是不实用的。然后它们提出了 Pasta 方案,专门对 Leveled FHE 支持的 F p t \mathbb F_p^t Fpt 明文空间做了优化。对于 Leveled FHE,优化准则是最小化 SE 的乘法深度;对于 Pure FHE,优化准则应该修改为最小化 SE 的乘法数量。[DGH+23] 很早就在 eprint 上可用了,后续有多种 HHE 使用了 Pasta 的构造模块,例如 Rubato
[DGH+23] 选择了如下的基准测试用例(Benchmarking a Generic Use Case),以反映真实世界中的 HHE 效率
[DGH+23] 使用 SEAL(明文空间 F p \mathbb F_p Fp)测试了:BFV 本身,对 F p \mathbb F_p Fp 优化的 Pasta,对 F 2 \mathbb F_2 F2 优化的 Agrasta,AES 加密,以及 LWE-Native 加密。基准测试的结果如下,
可以观察到:HE 需要大量的随机性,并且通信开销很大。LWE 对随机性的需要以及通信开销都大幅降低了,但依旧不算好。使用 Z 2 \mathbb Z_2 Z2 上的 SE 方案,由于 FHE 支持的明文空间是 Z p \mathbb Z_p Zp,布尔电路在这上面的深度很大,导致 Server 无法同态解密。[DGH+23] 所设计的 Pasta over F p \mathbb F_p Fp 做到了 Client 和 Server 之间的很好平衡。三种 HHE 在客户端的表现相似,但是在服务器上的差异巨大,主要就是因为 SE 是否设计在了 F p \mathbb F_p Fp 算术运算上,而非布尔电路。
考虑通信带宽的影响,Client 的时间开销为:
[DGH+23] 还展示了布尔电路上设计的 SE 应用到 HHE 时的低效。在这里,他们使用了很小的用例 r = M ⋅ x + b r=M \cdot x+b r=M⋅x+b,其中 r , x , b ∈ Z 65536 5 r,x,b \in \mathbb Z_{65536}^5 r,x,b∈Z655365 以及 M ∈ Z 65536 5 × 5 M \in \mathbb Z_{65536}^{5 \times 5} M∈Z655365×5,去执行完整的 HHE 计算流程。可以发现即使是这么小的用例,这些 SE 的效率也会非常的低。
[DGH+23] 测试了如下的 Ciphers(它们的设计细节请看原文),
在 SEAL 下的测试结果为:
他们把 SE 的解密称之为 decompressing the HHE ciphertext。在小用例的计算中,由于 SEAL 不支持 Z 2 \mathbb Z_2 Z2 上的打包,因此他们将单个 bit 加密在单个 BFV 密文的 coeff 常数项(好傻啊)
在 Pasta 之前,已经存在了一些针对
F
p
\mathbb F_p
Fp 而设计的 SE 方案,其中
2
12
<
p
<
2
60
2^{12} 212<p<260
SEAL 不支持自举,因此计算代价的度量应该首选为乘法深度,当然 ct-ct 甚至 pt-ct 乘法的数量也不可忽视。[DGH+23] 也遵循 Rasta 的设计,将它扩展到 F p \mathbb F_p Fp 上。为了降低乘法深度,采取的措施有:最小化轮数,低次数的 S-box(代价是更大的状态,但设计 packing-friendly cipher),平衡乘法深度和运算时间。
[DGH+23] 考虑了多种 S-boxes 的计算代价和限制,
χ
\chi
χ-S-box:原始的 Rasta 使用了 [Dae95] 的
χ
\chi
χ-transformation over
Z
2
t
\mathbb Z_2^t
Z2t 作为非线性层,但是它在一般的
F
p
t
\mathbb F_p^t
Fpt 中不再是一个置换。不过 Rasta 使用了随机化的线性层(已经抵御了统计攻击),因此它的非线性层只需要求逆的次数很高即可(抵御代数攻击)。定义
[
χ
(
x
)
]
i
=
x
i
+
x
i
+
2
⋅
(
1
+
x
i
+
1
)
(
m
o
d
p
)
[\chi(x)]_i = x_i+x_{i+2}\cdot(1+x_{i+1}) \pmod{p}
[χ(x)]i=xi+xi+2⋅(1+xi+1)(modp)
其中的 indices 都是
(
m
o
d
t
)
\pmod{t}
(modt) 循环的。在 BFV 的打包技术下,上述运算只需要使用 2 次旋转和 1 次乘法(如果
t
≠
N
t \neq N
t=N,还需要使用 masking vectors 模拟)。
Cube S-box:假如
gcd
(
p
−
1
,
3
)
=
1
\gcd(p-1,3)=1
gcd(p−1,3)=1,那么存在
3
−
1
∈
F
p
∗
3^{-1} \in \mathbb F_p^*
3−1∈Fp∗,从而
x
3
x^3
x3 是双射。定义:
[
S
(
x
)
]
i
=
x
i
3
[S(x)]_i = x_i^3
[S(x)]i=xi3
在打包技术下,它只需两次阿达玛乘法,不需要 Rotate 运算。
Feistel-Like S-Box(via a Quadratic Function):定义一个使用
x
2
x^2
x2 函数的 Feistel 网络,
[
S
′
(
x
)
]
i
=
{
x
i
,
i
=
0
x
i
+
x
i
−
1
2
,
otherwise
[S'(x)]_i = \left\{
使用
[
0
,
1
,
1
,
⋯
]
[0,1,1,\cdots]
[0,1,1,⋯] 作为 masking vector,容易实现它的 SIMD 运算。
Alternative Feistel-Like S-Box(via the
χ
\chi
χ-Function):定义一个使用
χ
\chi
χ 函数的 Feistel 网络,
[
S
′
′
(
x
)
]
i
=
{
x
i
,
i
∈
{
0
,
1
}
x
i
+
x
i
−
1
⋅
x
i
−
2
otherwise
[S''(x)]_i = \left\{
使用
[
0
,
0
,
1
,
1
,
⋯
]
[0,0,1,1,\cdots]
[0,0,1,1,⋯] 作为 masking vector,也容易实现它的 SIMD 运算。
上述四种 S-boxes 的计算开销为:
综合考虑乘法深度以及 KS 的开销,最终 Pasta 选取 Feistel 作为 main S-box。但同时也使用了 Cube 作为补充,去提升 Cipher 的次数(从而抵御线性分析,降低状态规模)。
[DGH+23] 使用的是随机化线性层的策略,但是
F
p
\mathbb F_p
Fp 上的矩阵可逆性的检查是昂贵的(在明文下生成随机矩阵,而非在同态下)。[DGH+23] 采用了 [GPP11] 提出的 sequential matrix 生成方式,直接随机生成一个必然可逆的矩阵。对于
d
d
d 阶矩阵,随机采样
α
1
,
⋯
,
α
d
∈
F
p
\
{
0
}
\alpha_1,\cdots, \alpha_d \in \mathbb F_p\backslash\{0\}
α1,⋯,αd∈Fp\{0},首先构造
A
=
S
e
r
i
a
l
(
α
1
,
⋯
,
α
d
)
:
=
[
0
1
0
⋯
0
0
0
1
⋯
0
⋮
⋱
⋮
0
0
0
⋯
1
α
1
α
2
α
3
⋯
α
d
]
∈
F
p
d
×
d
A = Serial(\alpha_1,\cdots,\alpha_d) :=
然后计算
M
=
A
d
M = A^d
M=Ad 作为随机的可逆矩阵。由于
A
A
A 是具有特殊结构的稀疏矩阵,计算
M
M
M 只需要
d
(
d
−
1
)
d(d-1)
d(d−1) 次乘法以及
(
d
−
1
)
2
(d-1)^2
(d−1)2 次加法(怎么快速计算的?)。
如果采用的分圆环维度
N
N
N 是二的幂次,那么
Z
2
N
∗
=
{
1
,
3
,
⋯
,
2
N
−
1
}
=
⟨
−
1
,
3
⟩
\mathbb Z_{2N}^* = \{1,3,\cdots,2N-1\} = \langle-1,3\rangle
Z2N∗={1,3,⋯,2N−1}=⟨−1,3⟩,其中
o
r
d
(
−
1
)
=
2
,
o
r
d
(
3
)
=
N
/
2
ord(-1)=2, ord(3)=N/2
ord(−1)=2,ord(3)=N/2,因此明文槽组成了形状是
F
p
2
×
N
/
2
\mathbb F_p^{2 \times N/2}
Fp2×N/2 的立方。为了使得 babystep-giantstep optimized diagonal method 中使用的旋转操作的开销更小,[DGH+23] 使用了 Rotate1D
而非 Rotate
,并行地执行两个
t
∣
(
N
/
2
)
t \mid (N/2)
t∣(N/2) 阶线性变换,然后再组合它们。
确切地,假设
x
=
[
x
L
,
x
R
]
∈
F
p
2
t
x = [x_L,x_R] \in \mathbb F_p^{2t}
x=[xL,xR]∈Fp2t,那么仿射层的运算如下:
[
2
I
I
I
2
I
]
⋅
(
[
M
L
O
O
M
R
]
⋅
[
x
L
x
R
]
+
[
c
L
c
R
]
)
这里的
M
L
,
M
R
M_L, M_R
ML,MR 都是
t
t
t 阶矩阵,
O
O
O 和
I
I
I 分别是零矩阵和单位阵。首先使用自同构
τ
3
i
\tau_{3^i}
τ3i 执行两个并行的 BSGS 矩阵乘法,然后再使用自同构
τ
−
1
\tau_{-1}
τ−1 实现这两个仿射变换的结果混合。
现在我们描述 Pasta 方案。选择 t = t 1 ⋅ t 2 t=t_1 \cdot t_2 t=t1⋅t2 是两个大小接近的整数的乘积,选择满足 gcd ( p − 1 , 3 ) = 1 \gcd(p-1,3)=1 gcd(p−1,3)=1 的一个 NTT 友好的大素数。它同时使用了 Feistel 和 Cube 两种 S-boxes,
对于第 i i i 个消息分组,使用 XOF 来产生随机化的仿射层(在明文下),对主密钥 K K K(在密文下)执行 AES-like 轮函数迭代(状态大小为 2 t 2t 2t),最后截断长度为 t t t 的密钥流,加到消息分组上。
经过不同攻击的分析,[DGH+23] 给出了推荐的参数集。用例为 Z 65536 5 × 5 \mathbb Z_{65536}^{5 \times 5} Z655365×5 上仿射变换,Pasta 的计算效率: