参考文献:
- [NLV11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.
- [MJS+16] Méaux P, Journault A, Standaert F X, et al. Towards stream ciphers for efficient FHE with low-noise ciphertexts[C]//Advances in Cryptology–EUROCRYPT 2016: 35th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Vienna, Austria, May 8-12, 2016, Proceedings, Part I 35. Springer Berlin Heidelberg, 2016: 311-343.
- [CDK+21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion between (ring) LWE ciphertexts[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2021: 460-479.
- [CHK+21] Cho J, Ha J, Kim S, et al. Transciphering framework for approximate homomorphic encryption[C]//International Conference on the Theory and Application of Cryptology and Information Security. Cham: Springer International Publishing, 2021: 640-669.
- [DGG+21] Dobraunig C, Grassi L, Guinet A, et al. Ciminion: symmetric encryption based on toffoli-gates over large finite fields[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Cham: Springer International Publishing, 2021: 3-34.
- [HKL+22] Ha J, Kim S, Lee B H, et al. Rubato: Noisy ciphers for approximate homomorphic encryption[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Cham: Springer International Publishing, 2022: 581-610.
- [DGH+23] Dobraunig C, Grassi L, Helminger L, et al. Pasta: A Case for Hybrid Homomorphic Encryption[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2023, 2023(3): 30-73.
文章目录
HHE
[NLV11] 实现了 BV 算法,研究同态加密的实用性。为了解决 HE 密文规模太大的问题,他们提出了 Hybrid Homomorphic Encryption / Transciphering Framework,组合使用对称加密(SE)和同态加密(HE)。
对于 Client-Server Model,如图所示:
HHE 关注的场景:
- 2PC 场景(client + server),client 的计算/通信能力受限(云计算),或者 server 具有私有函数(机器学习)
- client 生成 SE 密钥,以及 HE 公私钥,发布公钥
- client 使用 SE 加密数据,并使用 HE 加密 SE 的密钥,发送两者给 server
- server 先同态解密 SE 密文,然后同态计算,最后发送 HE 密文给 client
- client 解密 HE 密文,获得计算结果
- MPC 场景(data providers + key holders + evaluators),可用于数据的秘密收集(物联网)
- key holders(分布式)生成 HE 公私钥,发布公钥
- data providers 生成各自的 SE 密钥,使用 SE 加密数据,并使用 HE 加密 SE 的密钥,发送两者给 evaluators
- evaluators 先同态解密 SE 密文,然后同态计算,最后发送 HE 密文给 key holders
- key holders(分布式)解密 HE 密文,获得计算结果
LWE-Native Encryption
[CDK+21] 使用 Galois 自同构实现了 RLWE 密文的相位某些系数的消除,于是可以把 LWE 密文嵌入到 RLWE 密文,然后使用 FFT-style 算法实现了多个 LWE 密文的打包(LWEs-to-RLWE)
基于此,[CDK+21] 建议在云计算场景中,使用对称版本的 Regev 加密方案。由于 LWE-based 都是 FHE 友好的,可以较为自然地在 RLWE 密文下同态解密(只需计算线性部分,不必纠错)。
- client 使用 PRF 生成各个 LWE 密文的随机带, a j = P R F ( s e e d , j ) ∈ Z q N a_j = PRF(seed, j) \in \mathbb Z_q^N aj=PRF(seed,j)∈ZqN
- client 将消息 m j ∈ Z t m_j \in \mathbb Z_t mj∈Zt 随机编码为 μ j ∈ Z q \mu_j \in \mathbb Z_q μj∈Zq(携带高斯噪声),计算 b j = ⟨ a j , s ⟩ + μ j b_j = \langle a_j, s\rangle + \mu_j bj=⟨aj,s⟩+μj
- client 发送的 SE 密文形如 ( s e e d , b 0 , b 1 , ⋯ ) (seed, b_0, b_1, \cdots) (seed,b0,b1,⋯),具有较低的 ciphertext expansion factor(但是 b j b_j bj 带噪,密文扩张总是不可避免),具体为 log q log t + ∣ s e e d ∣ \frac{\log q}{\log t} + |seed| logtlogq+∣seed∣
- server 同态线性解密,获得 μ j \mu_j μj 带噪的消息编码,然后直接同态运算(需要 Regev 本身就具有足够的 Levels,也就是 log q ≫ log t \log q \gg \log t logq≫logt)
- server 将得到的 RLWE 密文降低到最低的 Level,返回给 client
Filter Permutator & FLIP
[MJS+16] 考虑了两种对称加密,
- 分组密码(Block ciphers):各个消息分组上,解密电路的深度是固定的,但是由于使用了大轮数迭代,乘法深度很高。
- 流密码(Stream Ciphers):初始的消息分组,解密电路的深度很小,但随着密钥流的生成,乘法深度会越来越高。
综合考虑两者的优缺点,[MJS+16] 组合它们设计了新的流密码,即满足分组密码的常数深度,又满足流密码的较浅深度。
Filter Permutator
首先,他们提出了一个新的流密码结构,被称为 Filter Permutator Construction,它包含三部分:密钥寄存器、随机置换生成器(randomized linear layers)、滤波器(简单的非线性运算)。如图所示,
密钥流的每一个比特都是根据 F ∘ P i ( K ) F \circ P_i(K) F∘Pi(K) 计算出来的,电路深度是常数的,并且没有大轮数迭代。
FLIP
接着 [MJS+16] 构造了一族 Filter Permutators,称之为 FLIP。这个流密码是工作在布尔值 Z 2 \mathbb Z_2 Z2 上的(如果 FHE 的自然明文空间是 Z t , t ≥ 3 \mathbb Z_t, t\ge 3 Zt,t≥3,那么布尔电路的乘法深度会很高)。
首先,他们定义了布尔函数的直和,并证明了它可以将两个函数的 Non Linearity, Resiliency, Algebraic Immunity, Fast Algebraic Immunity 等安全属性组合并增强(细节请看原文)。
然后定义了三种简单的布尔函数,并给出了它们的安全属性(略):
[MJS+16] 使用 Filter Permutator Construction 去构造流密码,使用的滤波器
F
:
Z
2
n
1
+
n
2
+
n
3
→
Z
2
F: \mathbb Z_2^{n_1+n_2+n_3} \to \mathbb Z_2
F:Z2n1+n2+n3→Z2 是上述三种布尔函数的直和,令
n
1
,
n
2
,
n
,
k
,
n
3
=
n
k
(
k
+
1
)
2
n_1,n_2,n,k,n_3 = \frac{nk(k+1)}{2}
n1,n2,n,k,n3=2nk(k+1) 是合适的整数,
F
(
x
0
,
⋯
,
x
n
1
+
n
2
+
n
3
−
1
)
=
L
n
1
⊕
Q
n
2
/
2
⊕
⨁
i
=
1
n
T
k
F(x_0,\cdots,x_{n_1+n_2+n_3-1}) = L_{n_1} \oplus Q_{n_2/2} \oplus \bigoplus_{i=1}^{n} T_k
F(x0,⋯,xn1+n2+n3−1)=Ln1⊕Qn2/2⊕i=1⨁nTk
注意到函数直和的各个子函数的变量都是相互独立的,且函数求值结果是通过 XOR 组合的,因此这个滤波器
F
F
F 的乘法深度很低。
对于随机置换的生成,可以使用 Knuth / Fisher–Yates shuffle Algorithm。如果它接入一个 true random generator,那么它生成的随机置换是等概率的。
from random import randint
def randomize (arr, n):
for i in range(n-1,0,-1): # From n downto 1
j = randint(0,i+1) # Pick a random index from 0 to i
arr[i],arr[j] = arr[j],arr[i] # Swap arr[i] with the element at random index
return arr
RtF Framework & HERA
[CHK+21] 注意到真实世界的数据主要是浮点数,但是 CKKS 和 SE 并不兼容
- CKKS 支持定点复数的带噪算术,SE 解密则需要精确的模运算。
- 如果把 SE 强行迁移到复数域上,由于 SE 本质上就是将消息 m i m_i mi 经过某个带密钥的多项式求值为密文 c i c_i ci,但是对于正确的密钥 k k k 总会有 ∥ E k ( m i ) − c i ∥ 2 = 0 \|E_k(m_i)-c_i\|_2 = 0 ∥Ek(mi)−ci∥2=0,这是以 k k k 为根的复数域多项式。利用牛顿迭代法或者梯度下降法,容易求出近似的根。
他们提出了 RtF (Real-to-Finite-field) framework,组合使用 BFV 以及 CKKS,并设计了一个 BGV/BFV 友好的 SE 方案,称为 HERA。
RtF Framework
假设 BFV 的明文模数是 t t t,[CHK+21] 的思路是:将实数 m ∈ R m \in \mathbb R m∈R 缩放为 Z t \mathbb Z_t Zt 中元素,然后使用某个 Z t \mathbb Z_t Zt 上的 SE 加密它。于是可以使用 BFV 高效地解密 SE 密文,然后使用 CKKS 自举算法实现密文的切换。[CHK+21] 在 BFV 的 slot 上计算密钥流,在 BFV 的 coeff 上解密出消息,最后转换到 CKKS 的 slot 上计算函数。
框架为:
这里要求 BFV 和 CKKS 共享:分圆环维度
N
N
N、模数链
{
q
i
}
i
\{q_i\}_i
{qi}i、公私钥
(
p
k
,
s
k
)
(pk,sk)
(pk,sk)。假设 SE 密钥是
k
∈
Z
t
n
k \in \mathbb Z_t^n
k∈Ztn,我们要求
n
∣
l
n \mid l
n∣l,这里的
l
∣
N
l \mid N
l∣N 是 BFV 的明文槽个数,对应的 CKKS 也是子环
Y
=
X
N
/
l
Y=X^{N/l}
Y=XN/l 上的稀疏自举(明文槽个数为
l
/
2
l/2
l/2)。[CHK+21] 定义了密钥
k
k
k(列矢)的重复编码,
C
o
n
c
a
t
(
k
)
=
(
k
∥
k
∥
⋯
∥
k
)
∈
Z
t
n
×
B
Concat(k) = (k\|k\|\cdots\|k) \in \mathbb Z_t^{n \times B}
Concat(k)=(k∥k∥⋯∥k)∈Ztn×B
并提出了两种 BFV 打包方式:
- column-wise packing,设置 B = l / n B=l/n B=l/n,把这个矩阵按列展开为 Z t l \mathbb Z_t^l Ztl 列矢,加密到单个 BFV 密文中。如果要计算 A ⋅ k A \cdot k A⋅k,其中 A ∈ Z t n × n A \in \mathbb Z_t^{n \times n} A∈Ztn×n,首先令 A ′ = I l / n ⊗ A A'=I_{l/n} \otimes A A′=Il/n⊗A,然后使用 BSBG 对角线方法(或者 Pegasus 的瓷砖算法),同时计算 l / n l/n l/n 个副本 A ⋅ k A \cdot k A⋅k,这需要 Rotate 操作。
- row-wise packing,设置 B = l B = l B=l,把这个矩阵的每个 Z t l \mathbb Z_t^l Ztl 行矢分别加密到 n n n 个 BFV 密文中。如果要计算 A ⋅ k A \cdot k A⋅k,其中 A ∈ Z t n × n A \in \mathbb Z_t^{n \times n} A∈Ztn×n,那么就简单计算 n n n 个密文的乘加(并行 l l l 个副本),不需要 Rotate 操作。
它们被用于 SE 在 HE 中的同态解密。[CHK+21] 采用任意的 Z t \mathbb Z_t Zt 上流密码,算法为:
Client 将消息分组为 m i ∈ R n m_i \in \mathbb R^n mi∈Rn,编码到 Z t n \mathbb Z_t^n Ztn 上使用 SE 分别加密。对应的 Keystream 是根据 k ∈ Z t n k \in \mathbb Z_t^n k∈Ztn 以及 n c i ∈ { 0 , 1 } λ nc_i \in \{0,1\}^\lambda nci∈{0,1}λ 生成的。Client 除了发送 k k k 的 HE 密文以及 m i m_i mi 的 SE 密文外,还需要发送分别使用的 Nonce 给 Server 去同态重构密钥流。
HERA
[CHK+21] 设计了一种 FHE-friendly 流密码,叫做 HERA,它的自然运算是 Z t \mathbb Z_t Zt 上的算术运算,且它的设计目标是乘法深度尽可能低(但是乘法复杂度会较高)。SE 的基本设计框架是:线性运算(扩散)、非线性运算(S-box,抵御求逆)、轮密钥加(带密钥的变换),如此重复若干轮。
[MJS+16] 使用了 randomized linear layers 以及很简单的非线性布尔函数,如果简单地将 FILP 迁移到 Z t \mathbb Z_t Zt 上,由于 BFV 中的(常数)矩阵乘法的计算开销需要大量的 KS 操作,导致线性层的复杂度甚至比简单非线性层更高。为了减小线性层的开销,[CHK+21] 则是使用了 randomized key schedule(随机化的轮密钥编排)以及固定且稀疏的线性层,非线性运算使用了简单的立方函数,最终构造了 AES-like 的流密码(似乎就是 CTR 模式的分组密码?只是不需要求逆)
HERA 的构造如下,
对于密钥编排,HERA 使用 nonce 和 XOF 来生成随机串
r
c
=
(
r
c
0
,
r
c
1
,
⋯
,
r
c
r
)
∈
(
Z
t
16
)
r
+
1
rc=(rc_0,rc_1,\cdots,rc_r) \in (\mathbb Z_t^{16})^{r+1}
rc=(rc0,rc1,⋯,rcr)∈(Zt16)r+1,定义如下的轮密钥加,其中的
+
,
⋅
+, \cdot
+,⋅ 都是 component-wise 运算,
A
R
K
[
k
,
n
c
,
i
]
(
x
)
=
x
+
k
⋅
r
c
i
ARK[k,nc,i](x) = x + k \cdot rc_i
ARK[k,nc,i](x)=x+k⋅rci
对于线性层,HERA 使用 MDS matrix(Maximum Distance Separable)分别执行列混淆以及行混淆。MDS matrix 具有最大的分支数
n
+
1
n+1
n+1(branch number),因此具有很好的扩散性。
[CHK+21] 设置 HERA 的状态是 Z t 4 × 4 \mathbb Z_t^{4 \times 4} Zt4×4(排列 16 个数),于是直接使用了 AES 中的 MDS 矩阵(从 G F ( 2 8 ) GF(2^8) GF(28) 迁移到 Z t \mathbb Z_t Zt),
对于非线性层,HERA 使用简单的立方函数
x
3
x^3
x3 作为 S-box,定义
C
u
b
e
(
x
)
=
(
x
0
3
,
x
1
3
,
⋯
,
x
15
3
)
Cube(x) = (x_0^3, x_1^3,\cdots,x_{15}^3)
Cube(x)=(x03,x13,⋯,x153)
需要满足
gcd
(
3
,
t
−
1
)
=
1
\gcd(3,t-1)=1
gcd(3,t−1)=1,使得
x
3
x^3
x3 在
Z
t
∗
\mathbb Z_t^*
Zt∗ 上可逆,从而 S-box 是个双射。
对于加密模式,HERA 采用了 inner-counter mode,对于任意的
k
>
0
k>0
k>0,定义计数器
c
t
r
=
0
,
1
,
⋯
,
k
−
1
ctr = 0,1,\cdots,k-1
ctr=0,1,⋯,k−1,计算的密钥流是:
z
[
c
t
r
]
=
H
E
R
A
[
k
,
n
c
∥
c
t
r
]
(
i
c
)
z[ctr] = HERA[k, nc\|ctr](ic)
z[ctr]=HERA[k,nc∥ctr](ic)
固定的常数向量
i
c
=
(
1
,
2
,
⋯
,
16
)
∈
Z
t
16
ic=(1,2,\cdots,16) \in \mathbb Z_t^{16}
ic=(1,2,⋯,16)∈Zt16,并要求
t
≥
17
t \ge 17
t≥17 是素数。
经过多种的现有攻击的分析,[CHK+21] 给出了一些实例化的参数集。为了实现 80 80 80 比特安全强度,迭代轮数为 r = 4 r=4 r=4;为了实现 128 128 128 比特安全强度,迭代轮数为 r = 5 r=5 r=5。
Noisy Symmetric Ciphers & Rubato
[HKL+22] 观察到 SE 和 HE 基于不同的安全原理,
- conventional SE 需要时间的检验,使用了关于 key 高次的多项式求逆
- LWE-based SE 基于困难问题和安全归约,使用 noise 抵御代数攻击
他们提出了两者的权衡,构造了新的 Rubato,它使用一个 low-degree keyed function E k : Z q n → Z q l E_k: \mathbb Z_q^n \to \mathbb Z_q^l Ek:Zqn→Zql,并假设形如 ( a , E k ( a ) + e ) ∈ Z q n × Z q l (a, E_k(a)+e) \in \mathbb Z_q^n \times \mathbb Z_q^l (a,Ek(a)+e)∈Zqn×Zql 的样本是计算均匀的,其中 a a a 由 XOF 生成, e e e 是高斯噪声。为了分析它的安全性,需要同时使用 symmetric cryptanalysis 以及 LWE cryptanalysis(感觉 SE 的设计好随便啊)。这里的 q q q 是 RtF 框架中 BFV 的明文模数,而非密文模数。
Rubato 延续了 HERA 的设计结构(随机化密钥编排 + 固定的 MSD 矩阵),但不再使用 Cube 非线性层,而是使用了 [DGH+23] 所建议的另一种 Feistel-Like S-Box。由于这个 Feistel 求逆是简单的(次数很低,无法抵御 MITM 代数攻击),因此他们还采取了 [DGG+21] 的截断技术(直接丢弃部分信息,则求逆必须枚举)。
它直接采用了 HERA 的随机化密钥编排 A R K [ k , n c , i ] ( x ) = x + k ⋅ r c i ARK[k,nc,i](x)=x+k\cdot rc_i ARK[k,nc,i](x)=x+k⋅rci,并推广了状态 x ∈ Z q n x \in \mathbb Z_q^n x∈Zqn 的大小为 n = v 2 n=v^2 n=v2(这里 q q q 是 HE 密文模数,而在 HERA 中使用的是 Z t 16 \mathbb Z_t^{16} Zt16 明文模数),使用 v v v 阶 MSD 矩阵去执行状态的混淆。为了计算效率,一般会寻找短的稀疏的 MSD 矩阵。Rubato 给出了 v = 4 , 6 , 8 v=4,6,8 v=4,6,8 的选取建议,
对于非线性层,Rubato 使用了 Feistel Network via a Quadratic Function,定义为:
F
e
i
s
t
e
l
(
x
)
=
(
x
1
,
x
2
+
x
1
2
,
⋯
,
x
n
+
x
n
−
1
2
)
Feistel(x) = (x_1,x_2+x_1^2,\cdots, x_n+x_{n-1}^2)
Feistel(x)=(x1,x2+x12,⋯,xn+xn−12)
它是双射,且次数仅为
2
2
2,这比 Cube 的次数更低,并且混合了相邻的状态分量。这个 Feistel 的求逆很容易,为了抵御 MITM 代数攻击,执行完 AES-like 轮函数之后,还要执行截断函数
T
r
n
,
l
(
x
)
=
(
x
1
,
⋯
,
x
l
)
Tr_{n,l}(x) = (x_1,\cdots,x_l)
Trn,l(x)=(x1,⋯,xl) 以抵御求逆(并且密码设计中永远不执行求逆运算)。
在输出密钥流之前,采样离散高斯噪声
e
1
,
⋯
,
e
l
←
D
α
q
e_1,\cdots,e_l \gets \mathcal D_{\alpha q}
e1,⋯,el←Dαq,定义运算:
A
G
N
(
x
)
=
(
x
1
+
e
1
,
⋯
,
x
l
+
e
l
)
∈
Z
q
l
AGN(x) = (x_1+e_1,\cdots, x_l+e_l) \in \mathbb Z_q^l
AGN(x)=(x1+e1,⋯,xl+el)∈Zql
也就是说,Rubato 产生的密钥流是带噪的,它只能用于 RtF Framework 中(虽然是在 BFV 上解密,但最终是在 CKKS 上的近似运算),而不能用到精确的 FHE 上面。
Rubato 也采取了 inner-counter mode,密钥流是
z
[
c
t
r
]
=
R
u
b
a
t
o
[
k
.
n
c
∥
c
t
r
]
(
i
c
)
z[ctr] = Rubato[k. nc\|ctr](ic)
z[ctr]=Rubato[k.nc∥ctr](ic),其中
i
c
=
(
1
,
2
,
⋯
,
n
)
∈
Z
q
n
ic = (1,2,\cdots,n) \in \mathbb Z_q^n
ic=(1,2,⋯,n)∈Zqn,一般地
q
≫
n
q \gg n
q≫n。给定消息
m
i
∈
R
l
m_i \in \mathbb R^l
mi∈Rl,密文是
c
i
=
⌊
Δ
⋅
m
i
⌉
+
z
[
i
]
(
m
o
d
q
)
c_i = \lfloor \Delta \cdot m_i\rceil + z[i] \pmod{q}
ci=⌊Δ⋅mi⌉+z[i](modq)
缩放因子
Δ
∈
R
\Delta \in \mathbb R
Δ∈R,假如
∥
m
∥
1
≤
s
\|m\|_1 \le s
∥m∥1≤s,则选取
Δ
=
q
16
s
\Delta = \dfrac{q}{16s}
Δ=16sq(没说为什么这么选)。由于
z
[
i
]
z[i]
z[i] 带噪,因此 BFV(明文模数
q
q
q,密文模数
Q
Q
Q)只能解密出缩放的近似值
⌊
Δ
⋅
m
i
⌉
+
e
i
∈
Z
q
\lfloor \Delta \cdot m_i\rceil + e_i \in \mathbb Z_q
⌊Δ⋅mi⌉+ei∈Zq,不过接着就切换到 CKKS 密文上成为
Q
0
q
(
⌊
Δ
⋅
m
i
⌉
+
e
i
)
+
e
B
F
V
+
e
b
o
o
t
∈
Z
Q
′
\dfrac{Q_0}{q}\big(\lfloor \Delta \cdot m_i\rceil + e_i\big) + e_{BFV} + e_{boot} \in \mathbb Z_{Q'}
qQ0(⌊Δ⋅mi⌉+ei)+eBFV+eboot∈ZQ′(首先 BFV 模切换到最低的
Q
0
Q_0
Q0,接着自举提升 CKKS 的密文模数到
Q
′
Q'
Q′)。由于我们是用 CKKS 做近似计算的,Rubato 引入的噪声
e
i
e_i
ei 仅略微降低了明文精度,但不影响使用。
经过安全性分析后,[HKL+22] 给出了同一个安全级别下的不同参数集, 80 80 80 比特安全性的迭代轮数最低为 r = 2 r=2 r=2,而 128 128 128 比特安全性的迭代轮数是 r ∈ { 2 , 3 , 5 } r \in \{2,3,5\} r∈{2,3,5},乘法深度比 HERA 更低。