参考文献:
- [CGGI16] Chillotti I, Gama N, Georgieva M, et al. Faster fully homomorphic encryption: Bootstrapping in less than 0.1 seconds[C]//Advances in Cryptology–ASIACRYPT 2016: 22nd International Conference on the Theory and Application of Cryptology and Information Security, Hanoi, Vietnam, December 4-8, 2016, Proceedings, Part I 22. Springer Berlin Heidelberg, 2016: 3-33.
- [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrap** for TFHE[C]//International Conference on the Theory and Application of Cryptology and Information Security. Cham: Springer International Publishing, 2017: 377-408.
- [CGGI20] Chillotti I, Gama N, Georgieva M, et al. TFHE: fast fully homomorphic encryption over the torus[J]. Journal of Cryptology, 2020, 33(1): 34-91.
- [GBA21] Guimarães A, Borin E, Aranha D F. Revisiting the functional bootstrap in TFHE[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2021: 229-253.
- 加权自动机:在 Semirings 上建模-CSDN博客
- GSIS/GLWE & LUT/Automata & Blind Rotate-CSDN博客
- Multi-value & Large-LUT PBS-CSDN博客
文章目录
- Random Functions via LUT
- Horizontal Packing
- Vertical Packing
- Arithmetic Operations via WFA
- MAX
- Multiplication
- TBSR counter for Multi-addition
- BSR
- TBSR encryption
- Combining leveled with bootstrapping
Random Functions via LUT
正如 [GINX16] 的设计,任意的函数 f : B d → T s f:\mathbb B^d \to \mathbb T^s f:Bd→Ts 可以表示为 s s s 个长度 2 d 2^d 2d 的列表,也就是 [ f j ( x ) ] j ∈ [ s ] , x ∈ [ 2 d ] [f_j(x)]_{j \in [s],\, x \in [2^d]} [fj(x)]j∈[s],x∈[2d]。我们可以利用 Mux-based OBDD,根据 x = ∑ i x i 2 i x=\sum_i x_i2^i x=∑ixi2i 做二叉树查询获得 f j ( x ) f_j(x) fj(x) 的值。
[CGGI17] 提出了两种打包方式,
- 水平打包(Horizontal packing):它仅利用 CMux Gate,可以并行执行 N N N 个相同 x x x 的 LUT 的查询
- 垂直打包(vertical packing):它同时使用 CMux Gate 以及 Blind Rotation,加速了单个 LUT 的查询
假设 σ j , h \sigma_{j,h} σj,h 是子函数 f j , j ∈ [ s ] f_j,j \in [s] fj,j∈[s] 在位置 h ∈ [ 2 d ] h \in [2^d] h∈[2d] 的数值,如图所示
Horizontal Packing
因为子函数都是在相同的 x x x 上求值的,所以可以使用同一个控制位。
我们固定 h ∈ [ 2 d ] h \in [2^d] h∈[2d],并行加密各个 f j , j ∈ [ s ] f_j, j\in [s] fj,j∈[s] 的 LUT,
d h ∈ R L W E K ( ∑ j σ j , h X j ) d_h \in RLWE_K\left(\sum_j \sigma_{j,h} X^j\right) dh∈RLWEK(j∑σj,hXj)
接着使用 x i ∈ B x_i \in \mathbb B xi∈B 作为控制位,其密文是:
C i ∈ R G S W K ( x i ) C_i \in RGSW_K(x_i) Ci∈RGSWK(xi)
利用 CMux Gate 运算, c t ′ = ( 1 − C ) ⊠ c t 0 + C ⊠ c t 1 ct' = (1-C) \boxtimes ct_0 + C \boxtimes ct_1 ct′=(1−C)⊠ct0+C⊠ct1,去执行 OBDD 挑选出 d h d_h dh 的值,它就包含了 f j ( x ) , j ∈ [ s ] f_j(x),j\in [s] fj(x),j∈[s] 的结果,最后分别提取出来。
一般来说 s ≤ N s \le N s≤N,因此只需要单个 RLWE 密文就可以打包 ∑ j σ j , h X j \sum_j \sigma_{j,h} X^j ∑jσj,hXj,但是并行度也只有 s s s。如果 s = k N s=kN s=kN,那么就需要 k k k 个 RLWE 密文,并行度是最大的 N N N。
Vertical Packing
这个技术可用于较长的 LUT 的查询。假设 δ = log N \delta=\log N δ=logN,我们将长度 2 d 2^d 2d 的 LUT 顺序划分为 2 d − δ = 2 d / N 2^{d-\delta}=2^d/N 2d−δ=2d/N 个长度为 N = 2 δ N=2^\delta N=2δ 的 Box。易知这些 Box 的索引是高位 ( x d − 1 , ⋯ , d δ ) (x_{d-1},\cdots,d_{\delta}) (xd−1,⋯,dδ),而 Box 内部的索引是低位 ( x δ − 1 , ⋯ , x 0 ) (x_{\delta-1},\cdots,x_0) (xδ−1,⋯,x0)。
我们固定 j ∈ [ s ] j \in [s] j∈[s],利用 2 d / N 2^d/N 2d/N 个 RLWE 密文加密各个 Box,
d j , k ∈ R L W E K ( ∑ i σ j , i + N k X i ) d_{j,k} \in RLWE_K(\sum_i \sigma_{j,\,i+Nk} X^i) dj,k∈RLWEK(i∑σj,i+NkXi)
使用高位 ( x d − 1 , ⋯ , d δ ) (x_{d-1},\cdots,d_{\delta}) (xd−1,⋯,dδ) 作为选择 Box 的控制位,使用低位 ( x δ − 1 , ⋯ , x 0 ) (x_{\delta-1},\cdots,x_0) (xδ−1,⋯,x0) 作为旋转 Box 的控制位。无论是 OBDD 还是 Rotation,其控制位的密文都是:
C i ∈ R G S W K ( x i ) C_i \in RGSW_K(x_i) Ci∈RGSWK(xi)
先 OBDD 查询出 f j ( x ) f_j(x) fj(x) 所在的 Box,再 Rotate 将它旋转到常数项,提取出来。
它和 [GBA21] 的区别是:
- Vertical Packing 将高精度 LUT 顺序拆分为多个 LUT,按照二进制,从高位到低位,使用 Leveled GSW 计算 CMux-based OBDD,选择出某一个 LUT,最后执行一次 PBS 得到计算结果
- Combine PBS 也将高精度 LUT 顺序拆分为多个 LUT,按照 t t t 进制,从低位到高位,使用 PBS 计算出各个 LUT 的值,再用 Pri-KS 组合成若干个新的 LUT,继续迭代 PBS 直到得到最终结果
Arithmetic Operations via WFA
对于布尔运算,基于 Mux Gate 的有限自动机(FA)就足够了。但是对于多比特的算术运算,则需要加权的有限自动机(WFA)。
在 [CGGI17] 中,固定 Σ = B \Sigma=\mathbb B Σ=B,让每一个 word 都仅对应单个路径(也就是 det-WFA),所有的 words 都是可接受的(一条从始到终的路径)。半环加法是无用的,而半环乘法是 ( S , ⊗ ) = ( T N [ X ] , + ) (S,\otimes) = (\mathbb T_N[X], +) (S,⊗)=(TN[X],+)
对于某种算术运算,构建对应的 det-WFA,使得路径重量分别为 w ( σ ) = f ( x = σ ) w(\sigma) = f(x=\sigma) w(σ)=f(x=σ),
-
对于每个状态 q ∈ Q q \in Q q∈Q,在时刻 j j j 的值解密到 RLWE 密文 c j , q c_{j,q} cj,q
-
给定一个单词 σ = σ 0 ⋯ σ d − 1 ∈ B d \sigma=\sigma_0\cdots\sigma_{d-1} \in \mathbb B^d σ=σ0⋯σd−1∈Bd,每个字母加密到 RGSW 密文 C i C_i Ci
-
从时刻 d d d 向前回溯,初始设置 c d , q = R L W E ( 0 ) c_{d,q}=RLWE(0) cd,q=RLWE(0)
-
读取了字母 σ j \sigma_j σj,假设 det-WFA 中存在一对 transitions,形如 ( q , 0 , v 0 , q 0 ) (q,0,v_0,q_0) (q,0,v0,q0) 和 ( q , 1 , v 1 , q 1 ) (q,1,v_1,q_1) (q,1,v1,q1),那么计算
c j , q = C M u x ( C j , c j + 1 , q 0 + R L W E ( v 0 ) , c j + 1 , q 1 + R L W E ( v 1 ) ) c_{j,q} = CMux(C_j,\, c_{j+1,q_0}+RLWE(v_0),\, c_{j+1,q_1}+RLWE(v_1)) cj,q=CMux(Cj,cj+1,q0+RLWE(v0),cj+1,q1+RLWE(v1)) -
一直回溯到 c 0 , I c_{0,I} c0,I,我们就得到了 w ( σ ) w(\sigma) w(σ) 的值
MAX
对于 x = ∑ i x i 2 i x=\sum_i x_i2^i x=∑ixi2i 和 y = ∑ i y i 2 i y=\sum_i y_i2^i y=∑iyi2i,从高到低依次比较各个比特,
Multiplication
构建 Schoolbook 算法,使用 states 来追踪 partial sum,使用 transitions 来修改这些 sums,
TBSR counter for Multi-addition
为了更高效的计算 multi-addition,[CGGI17] 提出了 BSR(Bit Sequence Representation)计数器,它可以计算:比特提取、自增、整除。
BSR
二的幂次分圆环的维度是 N N N,设置 p = log N p=\log N p=logN,我们让 B j , k ( l ) , j ∈ [ 0 , p ] , k , l ∈ Z B_{j,k}^{(l)}, j \in [0,p],k,l \in \mathbb Z Bj,k(l),j∈[0,p],k,l∈Z 表示整数 k + l k+l k+l 的第 j j j 比特(little-endian signed binary representation)。那么,
- B 0 ( 0 ) = ( 0 , 1 , 0 , 1 , ⋯ ) B_0^{(0)}=(0,1,0,1,\cdots) B0(0)=(0,1,0,1,⋯) 是 2-periodic 序列(周期为 2)
- B 1 ( 0 ) = ( 0 , 0 , 1 , 1 , ⋯ ) B_1^{(0)}=(0,0,1,1,\cdots) B1(0)=(0,0,1,1,⋯) 是 4-periodic 序列,其他的类似
- B j ( l ) B_j^{(l)} Bj(l) 就是 B j ( 0 ) B_j^{(0)} Bj(0) 平移了 l l l 位置,不改变周期
- 因此, B j ( l ) B_j^{(l)} Bj(l) 都是 2 j 2^j 2j-antiperiodic 序列(周期为 2 j + 1 2^{j+1} 2j+1,前一半和后一半反对称)
易知,
( B 0 , k ( l ) , B 1 , k ( l ) , ⋯ , B p , k ( l ) ) 2 = [ l + k ] 2 N ∈ [ − N , N − 1 ] (B_{0,k}^{(l)}, B_{1,k}^{(l)}, \cdots, B_{p,k}^{(l)})_2 = [l+k]_{2N} \in [-N,N-1] (B0,k(l),B1,k(l),⋯,Bp,k(l))2=[l+k]2N∈[−N,N−1]
我们将 p p p 个(截断长度 N N N 的)周期的比特流记为 B S R ( l ) : = [ B 0 ( l ) , ⋯ , B p ( l ) ] ∈ { 0 , 1 } p × N BSR(l):=[B_0^{(l)}, \cdots, B_p^{(l)}] \in \{0,1\}^{p\times N} BSR(l):=[B0(l),⋯,Bp(l)]∈{0,1}p×N,
提取:
- 第一列的 p p p 个比特就表示了整数 [ l ] 2 N [l]_{2N} [l]2N
自增:
- 给定 B S R ( l ) = [ u 0 , ⋯ , u p ] BSR(l) = [u_0,\cdots,u_p] BSR(l)=[u0,⋯,up],其中 l ∈ [ 0 , N − 1 ] l \in [0,N-1] l∈[0,N−1]
- 设置 v j , k = u j , k + i v_{j,k} = u_{j,k+i} vj,k=uj,k+i,也就是序列 u j u_j uj 左移 i i i 位
- 输出 B S R ( l + i ) = [ v 0 , ⋯ , v p ] BSR(l+i) = [v_0,\cdots,v_p] BSR(l+i)=[v0,⋯,vp]
整除:
- 给定 B S R ( l ) = [ u 0 , ⋯ , u p ] BSR(l) = [u_0,\cdots,u_p] BSR(l)=[u0,⋯,up],其中 l ∈ [ 0 , N − 1 ] l \in [0,N-1] l∈[0,N−1]
- 设置 v j , k = u j + 1 , 2 k , j ∈ [ 0 , p − 1 ] v_{j,k} = u_{j+1,2k}, j \in [0,p-1] vj,k=uj+1,2k,j∈[0,p−1],也就是删除最低比特,其他比特简单右移
- 设置 v p , k = 0 , k ∈ [ 0 , N / 2 ] v_{p,k}=0, k \in [0,N/2] vp,k=0,k∈[0,N/2],因为 ⌊ l / 2 ⌋ < N / 2 \lfloor l/2 \rfloor < N/2 ⌊l/2⌋<N/2,于是 ⌊ l / 2 ⌋ + k \lfloor l/2 \rfloor+k ⌊l/2⌋+k 的符号位一定是零
- 设置 v p , k = u p , 2 ( k − N / 2 ) , k ∈ [ N / 2 , N − 1 ] v_{p,k}=u_{p,2(k-N/2)},k \in [N/2,N-1] vp,k=up,2(k−N/2),k∈[N/2,N−1],因为 u p u_p up 先是 N − l N-l N−l 个 0 0 0 再是 l l l 个 1 1 1,而目标 v p v_p vp 应该是 N − ⌊ l / 2 ⌋ N-\lfloor l/2 \rfloor N−⌊l/2⌋ 个 0 0 0 再是 ⌊ l / 2 ⌋ \lfloor l/2 \rfloor ⌊l/2⌋ 个 1 1 1,恰好是对应的
- 输出 B S R ( ⌊ l / 2 ⌋ ) = [ v 0 , ⋯ , v p ] BSR(\lfloor l/2 \rfloor) = [v_0,\cdots,v_p] BSR(⌊l/2⌋)=[v0,⋯,vp]
如图所示:
在同态运算下,[CGGI17] 将 BSR 的低 p p p 位的序列加密为 μ i = ∑ k 1 / 2 ⋅ u j , k X k \mu_i = \sum_k 1/2\cdot u_{j,k}X^k μi=∑k1/2⋅uj,kXk,符号位的序列加密为 μ p = ∑ k ( 1 / 2 ⋅ u p , k − 1 / 4 ) X k \mu_p = \sum_k (1/2\cdot u_{p,k}-1/4)X^k μp=∑k(1/2⋅up,k−1/4)Xk,
整除运算为:
TBSR encryption
将 BSR 序列加密到 RLWE 密文中,同态地计算 BSR 上定义的运算。[CGGI17] 要求 l ∈ [ 0 , N − 1 ] l \in [0,N-1] l∈[0,N−1],但是原本 BSR 的运算是 ( m o d 2 N ) \pmod{2N} (mod2N) 的,这是因为 ( X N + 1 ) (X^N+1) (XN+1) 导致反循环,他们只用一半的空间来避免。
利用它,我们可以搭建出 multi-addition 或者 multiplication 的教科书算法,
Combining leveled with bootstrapping
因为 RGSW 和 RLWE 的外积结果是 RLWE,而 RLWE 再提取为 LWE,因此我们需要将 LWE 提升到 RGSW 的手段。这需要 circuit bootstrapping,也就是对组成 RGSW 密文的那些 RLWE 所依赖的 LWE 分别自举,然后使用 Priv-KS 和 Pub-KS 转化为 RLWE 并组装成 RGSW 密文。