首先需要知道,同态加密是在多项式上进行的,基于RLEW的整体流程如下:
将单个数编码到一个N阶(N项)多项式中,多项式系数的利用率极低。而在神经网络中,我们需要计算的东西往往是一个很大的矩阵/tensor,并非不是单个数。所以需要打包编码技术(packing)将很多数同时编码到同一个多项式中,来提高多项式系数的利用率。
将一个数组编码进多项式,可以分为两种形式:
系数编码可以参考Cheetah的做法,Cheetah自定义了一套编码规则,使多项式相乘后的结果多项式中的一些系数正好是需要的卷积结果。
这里主要讨论点值编码,也就是SIMD编码。SIMD编码被广泛用在全同态方案中,包括CKKS、BFV、BGV等。
SIMD指的是把一系列数通过中国剩余定理(CRT)打包(pack)到同一个多项式中,使一次多项式乘法计算可以完成多次明文乘法。计算必须是在素数域 Z p \mathbb Z_p Zp上。
x
n
+
1
x^n+1
xn+1可以表示为
n
n
n个多项式的积:
x
n
+
1
=
(
x
+
a
1
)
(
x
+
a
2
)
⋯
(
x
+
a
n
)
m
o
d
p
x^n+1 = (x+a_1)(x+a_2)\cdots (x+a_n) \mod p
xn+1=(x+a1)(x+a2)⋯(x+an)modp
例子:设
p
=
17
p=17
p=17,多项式阶数
N
=
2
N=2
N=2,于是
x
2
+
1
=
x
2
−
17
x
+
52
m
o
d
17
=
(
x
−
4
)
(
x
−
13
)
m
o
d
17
x^2+1 = x^2-17x+52 \mod 17 = (x-4)(x-13) \mod 17
x2+1=x2−17x+52mod17=(x−4)(x−13)mod17
f
(
x
)
m
o
d
(
x
n
+
1
)
f(x)\mod (x^n+1)
f(x)mod(xn+1)可以表示为
n
n
n个整数:
x
i
=
f
(
x
)
m
o
d
(
x
+
a
i
)
x_i = f(x)\mod (x+a_i)
xi=f(x)mod(x+ai)
即
f
(
x
)
m
o
d
(
x
n
+
1
)
f(x)\mod (x^n+1)
f(x)mod(xn+1)打包了
a
i
a_i
ai
例子: x m o d ( x 2 + 1 ) x \mod (x^2+1) xmod(x2+1)可以表示为 x m o d ( x − 4 ) , x m o d ( x − 13 ) x \mod (x-4), x \mod (x-13) xmod(x−4),xmod(x−13),也就是 x m o d ( x 2 + 1 ) x \mod (x^2+1) xmod(x2+1)打包了4和13。
给定
n
n
n个整数,可以通过CRT找到对应
f
(
x
)
f(x)
f(x)来编码这些整数。
例子:
2
x
−
7
2x-7
2x−7打包了1和2,因为
2
x
−
7
m
o
d
(
x
−
4
)
=
1
,
2
x
−
7
m
o
d
(
x
−
13
)
=
2
2x-7 \mod (x-4)=1, 2x-7 \mod (x-13)=2
2x−7mod(x−4)=1,2x−7mod(x−13)=2
打包在模 p p p上具有同态性:
- 加法:
x
+
(
2
x
−
7
)
x+(2x-7)
x+(2x−7)打包了5和15
- 3 x − 7 m o d ( x − 4 ) = 5 , 3 x − 7 m o d ( x − 13 ) = 15 3x-7 \mod (x-4)=5, 3x-7 \mod (x-13)=15 3x−7mod(x−4)=5,3x−7mod(x−13)=15
- 乘法:
x
⋅
(
2
x
−
7
)
x\cdot(2x-7)
x⋅(2x−7)打包了4和9
- 2 x 2 − 7 x m o d ( x 2 + 1 ) = − 7 x − 2 2x^2-7x \mod (x^2+1) = -7x - 2 2x2−7xmod(x2+1)=−7x−2
- − 7 x − 2 m o d ( x − 4 ) = 4 , − 7 x − 2 m o d ( x − 13 ) = 9 -7x - 2 \mod (x-4) = 4, -7x - 2 \mod (x-13) = 9 −7x−2mod(x−4)=4,−7x−2mod(x−13)=9