文章目录
Efficient Privacy Preserving Logistic Regression Inference and Training
引论
动机
分布式机器学习过程中,几个参与方之间互相传输的梯度或者模型数据可能会存在暴露原始数据的风险,所以一般采用一些隐私保护的手段。目前来说,主要采用的技术分为三种:安全多方计算、同态加密、带差分隐私的联邦学习。其中,差分隐私只能提供统计意义上的隐私保护,且算法与消息的分布息息相关;安全多方计算需要的通信量非常庞大,甚至超过了原始数据传输的大小;而同态加密在使用中经常会需要用到一些耗时的操作,比如自引导(bootstrapping)和旋转(rotation),而且需要的密钥大小也非常大。
贡献
这篇文章用了安全多方计算(MPC)和同态加密(HE)混合的方式来进行了隐私保护的逻辑回归训练和预测。利用了同态加密的批处理(batch)思路,这篇文章可以使用一次同态乘法来代替向量和矩阵的乘法。另外,这篇文章还提出了一种基于两方的加法秘密共享来控制同态加密噪声的方法。
系统模型
如图1所示,本文的系统模型包括多个被动参与方(Passive Party),一个活动的参与方(Active Party),一个服务器(Server)。从左往右看,首先被动参与方将自己的数据加密上传给服务器,主动的参与方与服务器之间运行一个两方的MPC协议,使得主动参与方无法得知其他人的输入数据,但可以得到逻辑回归的模型。主动参与方拥有这个模型后,其他的客户(Client)就可以加密自己想要预测的数据给主动参与方,主动参与方返回一个加密的预测结果,并由客户解密。
其中,主动参与方与服务器之间运行的隐私保护逻辑回归训练协议
逻辑回归模型训练主要包括了矩阵-向量乘法(Matrix-Vector Multiplication)和sigmoid函数。其中因为同态加密支持SIMD,所以矩阵向量乘法采用同态加密的方式运算,而SIGMOID函数使用安全多方计算来运算。
针对上述训练方式,本文提出了几种优化方法:
- 使用一种针对矩阵-向量乘法的特殊编码方式(encode)。将向量值放进多项式系数中,因此多项式环所带有的性质,一次同态乘法就可以表示一个向量的内积了。这样做不需要同态的旋转操作,因此公私钥的大小都比较小。
- 使用了提取算法(extraction)来减少通信开销。提取算法是在密文中提取出解密需要的数据的一种方法。
- 使用懒加密(lazy encryption)来提高同态加密的效率。在广域网中(WAN)训练逻辑回归的每个时期(Epoch)需要121秒。
预备知识
逻辑回归
机器学习我一直没咋搞懂,慢慢学吧。我完全没看懂,但还是简要的说明一下,总之计算梯度下降的时候要用到内积和sigmoid激活函数。
逻辑回归其实是用于分类的算法,比如胜负,通过还是失败,一张图片里面是否包含一只猫这样的事情。假设训练数据由 n n n个样本 ( x i , y i ) ∈ R m − 1 × { ± 1 } , i ∈ [ n ] (\mathbf{x}_i,y_i) \in \mathbb{R}^{m-1}\times\{ \pm 1\},i\in[n] (xi,yi)∈Rm−1×{
±1},i∈[n]构成,其中 x i \mathbf{x}_i xi表示第 i i i个样本的 m − 1 m-1 m−1个特征, y i y_i yi表示这个样本的标签(比如预测胜负时, y i = − 1 y_i=-1 yi=−1表示负, y i = 1 y_i=1 yi=1表示正)。我们的目的是为了得到一个模型系数 w \mathbf{w} w,那么计算得到 y ^ i = ( 1 , x i ) ⋅ w \hat{y}_i=(1,\mathbf{x}_i)\cdot \mathbf{w} y^i=(1,xi)⋅w的值与原本 y i y_i yi的差距最小。在逻辑回归中,使用cross entropy来表达这个目标,最终得到的目标函数为:
L ( w ) = 1 n ∑ i = 1 n log ( 1 + e ( − y i ( 1 , x i ) T ⋅ w ) ) L(\mathbf{w})=\frac{1}{n} \sum_{i=1}^{n} \log \left(1+ e^{\left(-y_{i}\left(1, \mathbf{x}_{i}\right)^{T} \cdot \mathbf{w}\right)} \right) L(w)=n1i=1∑nlog(1+e(−yi(1,xi)T⋅w))
对目标函数求偏导之后就可以得到一个梯度下降算法:
w ( t + 1 ) ← w ( t ) + α t n ∑ i ∈ I σ ( − z i T ⋅ w ( t ) ) z i \mathbf{w}^{(t+1)} \leftarrow \mathbf{w}^{(t)}+\frac{\alpha_{t}}{n} \sum_{i \in I} \sigma\left(-\mathbf{z}_{i}^{T} \cdot \mathbf{w}^{(t)}\right) \mathbf{z}_{i} w(t+1)←w(t)+nαti∈I∑σ(−ziT⋅w(t))zi
其中 z i = − y i ( 1 , x i ) \mathbf{z}_i=-y_i(1,\mathbf{x}_i) zi=−yi(1,xi), α t \alpha_t αt时第 t t t步时的学习率。 σ ( x ) = 1 / ( 1 + e − x ) \sigma(x)=1/(1+e^{-x}) σ(x)=1/(1+e−x)是sigmoid激活函数。本文使用了Nesterov的加速梯度下降算法,产生一个初始的值 w ( 0 ) = v ( 0 ) \mathbf{w}^{(0)}=\mathbf{v}^{(0)} w(0)=v(0),然后计算:
w ( t + 1 ) ← v ( t ) + α t n ∑ i = 1 n σ ( − z i T ⋅ w ( t ) ) z i v ( t + 1 ) ← ( 1 − γ t ) ⋅ w ( t + 1 ) + γ t ⋅ w ( t ) \begin{array}{l} \mathbf{w}^{(t+1)} \leftarrow \mathbf{v}^{(t)}+\frac{\alpha_{t}}{n} \sum_{i=1}^{n} \sigma\left(-\mathbf{z}_{i}^{T} \cdot \mathbf{w}^{(t)}\right) \mathbf{z}_{i} \\ \mathbf{v}^{(t+1)} \leftarrow\left(1-\gamma_{t}\right) \cdot \mathbf{w}^{(t+1)}+\gamma_{t} \cdot \mathbf{w}^{(t)} \end{array} w(t+1)←v(t)+nαt∑i=1nσ(−ziT⋅w(t))ziv(t+1)←(1−γt)⋅w(t+1)+γt⋅w(t)
其中 γ t \gamma_t γt是一个平滑系数。进一步的,可以用一个矩阵来代替向量 z i \mathbf{z}_i zi。令 Z \mathbf{Z} Z为一个 n × m n\times m n×m的矩阵,它的第 i i i行为 z i \mathbf{z}_i zi。令 Z I \mathbf{Z}_I ZI为 Z \mathbf{Z} Z的子矩阵, Z I \mathbf{Z}_I ZI的行由 { z i } i ∈ I \{\mathbf{z}_i\}_{i \in I} {
zi}i∈I构成。那可以把上面的式子进一步写为:
w ( t + 1 ) ← v ( t ) + α t n ⋅ Z I T ⋅ σ ( − Z I ⋅ w ( t ) ) \mathbf{w}^{(t+1)} \leftarrow \mathbf{v}^{(t)}+\frac{\alpha_{t}}{n} \cdot \mathbf{Z}_{I}^{T} \cdot \sigma\left(-\mathbf{Z}_{I} \cdot \mathbf{w}^{(t)}\right) w(t+1)←v(t)+nαt⋅ZIT⋅σ(−ZI⋅w(t))
同态加密
这篇文章用到的同态加密是CKKS,值得注意的点是,这篇文章只需要用到一次同态乘法,且不需要使用CKKS的encode技术。明文直接用另外一种技术打包为了一个多项式(而不是CKKS的IFFT打包),所以这里假设明文空间已经为 R [ X ] / ( X N + 1 ) \mathbb{R}[X]/(X^N+1) R[X]/(XN+1),而不是 C N / 2 \mathbb{C}^{N/2} CN/2。
不带encode的CKKS其实蛮简单的,就如下几个算法,细节省略:
-
S e t u p ( 1 λ , 1 L ) : \mathrm{Setup}(1^{\lambda}, 1^{L}): Setup(1λ,1L): 给定安全参数 λ \lambda λ以及计算深度 L L L,生成一个公开参数 p p \mathrm{pp} pp.
-
K e y G e n ( p p ) : \mathrm{KeyGen}(\mathrm{pp}): KeyGen(pp): 给定安全参数 p p \mathrm{pp} pp, 生成私钥 s k \mathrm{sk} sk, 公钥 p k \mathrm{pk} pk, 以及计算密钥 e v k \mathrm{evk} evk. 返回 ( s k , p k , e v k ) (\mathrm{sk, pk, evk}) (sk,pk,evk).
-
E n c ( p k , m ( x ) ∈ R [ X ] / ( X N + 1 ) , Δ ) : \mathrm{Enc}\left(\mathrm{pk}, m(x) \in \mathbb{R}[X] /\left(X^{N}+1\right), \varDelta\right): Enc(pk,m(x)∈R[X]/(XN+1),Δ): 给定公钥,明文和扩张系数 Δ \varDelta Δ, 返回一个密文 c t x t ∈ R q 2 \mathrm{ctxt} \in \mathcal{R}_{q}^{2} ctxt∈Rq2.
-
D e c ( s k , c t x t , Δ ) : \mathrm{Dec}(\mathrm{sk}, \mathrm{ctxt}, \varDelta): Dec(sk,ctxt,Δ): 给定私钥,密文,扩张系数 Δ \varDelta Δ,返回明文 m ( x ) ∈ R [ X ] / ( X N + 1 ) m(x) \in \mathbb{R}[X] /\left(X^{N}+1\right) m(x)∈R[X]/(XN+1).
CKKS中的扩张系数 Δ \varDelta Δ与最后要达到的明文的精度有关。但这篇文章中的 Δ \varDelta Δ与CKKS略有区别。具体来说的话,CKKS是在encode的时候加入 Δ \varDelta Δ也就是 m ( x ) m(x) m(x)本身就是扩张过后的多项式值,而本文是指在加密的时候输入 Δ \varDelta Δ,那么最后能得到一个密文 c t x t = ( b ( x ) , a ( x ) ) ∈ R q 2 \mathrm{ctxt}=(b(x),a(x))\in \mathcal{R}_q^2 ctxt=(b(x),a(x))∈Rq2满足 b ( x ) + a ( x ) ⋅ s ( x ) = ⌊ [ m ( x ) ⋅ Δ ] q ⌉ m o d q b(x)+a(x)\cdot s(x)= \lfloor[m(x)\cdot \varDelta]_q \rceil \bmod q b(x)+a(x)⋅s(x)=⌊[m(x)⋅Δ]q⌉modq。解密的时候就直接得到了 d ( x ) = ⌊ [ m ( x ) ⋅ Δ ] q ⌉ d(x)=\lfloor [m(x)\cdot \varDelta]_q \rceil d(x)=⌊[m(x)⋅Δ]q⌉,然后输出明文为 d ( x ) / Δ d(x)/\varDelta d(x)/Δ,作为一个近似的解密结果。
CKKS算法还支持明文密文之间的加法乘法操作,具体来说,有两个密文 c t x t 1 , c t x t 2 \mathrm{ctxt_1,ctxt_2} ctxt1,ctxt2,他们所对应的明文分别为: D e c ( s k , c t x t 1 , Δ ) = m 1 ( x ) , D e c ( s k , c t x t 1 , Δ ) = m 2 ( x ) \mathrm{Dec(sk,ctxt_1},\varDelta)=m_1(x),\mathrm{Dec(sk,ctxt_1},\varDelta)=m_2(x) Dec(sk,ctxt1,Δ)=m1(x),Dec(sk,ctxt1,Δ)=m2(x)。
-
AddP ( ctxt 1 , m 2 ( x ) ) : \operatorname{AddP}\left(\operatorname{ctxt}_{1}, m_{2}(x)\right): AddP(ctxt1,m2(x)): 给定密文 c t x t 1 \mathrm{ctxt}_{1} ctxt1和明文 m 2 ( x ) m_{2}(x) m2(x), 返回 c t x t 3 ∈ R q 2 \mathrm{ctxt} _{3} \in \mathcal{R}_{q}^{2} ctxt3∈Rq2,满足 Dec ( s k , c t x t 3 , Δ ) ≃ m 1 ( x ) + m 2 ( x ) \operatorname{Dec}\left(\mathrm{sk}, \mathrm{ctxt}_{3}, \varDelta\right) \simeq m_{1}(x)+m_{2}(x) Dec(sk,ctxt3,Δ)≃m1(x)+m2(x)
-
Add ( c t x t 1 , c t x t 2 ) : \operatorname{Add}\left(\mathrm{ctxt}_{1}, \mathrm{ctxt}_{2}\right): Add(ctxt1,ctxt2): 给定密文 ctxt 1 , c t x t 2 \operatorname{ctxt}_{1}, \mathrm{ctxt}_{2} ctxt1,ctxt2, 返回 c t x t 3 ∈ R q 2 \mathrm{ctxt} _{3} \in \mathcal{R}_{q}^{2} ctxt3∈Rq2 ,满足 Dec ( s k , c t x t 3 , Δ ) ≃ m 1 ( x ) + m 2 ( x ) \operatorname{Dec}\left(\mathrm{sk}, \mathrm{ctxt}_{3}, \varDelta\right) \simeq m_{1}(x)+m_{2}(x) Dec(sk,ctxt3,Δ)≃m1(x)+m2(x)
-
MultP ( ctxt 1 , m 2 ( x ) ) : \operatorname{MultP}\left(\operatorname{ctxt}_{1}, m_{2}(x)\right): MultP(ctxt1,m2(x)): 给定密文 c t x t 1 \mathrm{ctxt}_{1} ctxt1和明文 m 2 ( x ) m_{2}(x) m2(x), 返回 c t x t 3 ∈ R q 2 \mathrm{ctxt} _{3} \in \mathcal{R}_{q}^{2} ctxt3∈Rq2,满足 Dec ( s k , c t x t 3 , Δ ) ≃ m 1 ( x ) ⋅ m 2 ( x ) \operatorname{Dec}\left(\mathrm{sk}, \mathrm{ctxt}_{3}, \varDelta\right) \simeq m_{1}(x) \cdot m_{2}(x) Dec(sk,ctxt3,Δ)≃m1(x)⋅m2(x)
-
Mult ( e v k , c t x t 1 , c t x t 2 ) : \operatorname{Mult}\left(\mathrm{evk}, \mathrm{ctxt}_{1}, \mathrm{ctxt}_{2}\right): Mult(evk,ctxt1,ctxt2): 给定密文 ctxt 1 , c t x t 2 \operatorname{ctxt}_{1}, \mathrm{ctxt}_{2} ctxt1,ctxt2, 返回 c t x t 3 ∈ R q 2 \mathrm{ctxt} _{3} \in \mathcal{R}_{q}^{2} ctxt3∈Rq2 ,满足 Dec ( s k , c t x t 3 , Δ ) ≃ m 1 ( x ) ⋅ m 2 ( x ) \operatorname{Dec}\left(\mathrm{sk}, \mathrm{ctxt}_{3}, \varDelta\right) \simeq m_{1}(x) \cdot m_{2}(x) Dec(sk,ctxt3,Δ)≃m1(x)⋅m2(x)
在每次CKKS密文做完乘法之后,都要将模数从 q q q变为 q / Δ q/\varDelta q/Δ,因为一次乘法之后的密文对应的明文为 Δ 2 ⋅ m 1 ( x ) ⋅ m 2 ( x ) \varDelta^2\cdot m_1(x)\cdot m_2(x) Δ2⋅m1(x)⋅m2(x),通过modulus switching技术,可以变为 Δ ⋅ m 1 ( x ) ⋅ m 2 ( x ) \varDelta \cdot m_1(x) \cdot m_2(x) Δ⋅m1(x)⋅m2(x)。而因为这篇文章当中只需要使用一次密文乘法,所以只需要取两个模数 q , q / Δ q,q/\varDelta q,q/Δ就行了。
安全多方计算:两方加法秘密共享
假如有两个参与方 P 0 P_0 P0和 P 1 P_1 P1,他们分别持有两个 Z t \mathbb{Z}_t Zt内的输入 x , y x,y x,y,想要共同计算 [ x + y ] t , [ x ⋅ y ] t [x+y]_t,[x \cdot y]_t [x+y]t,[x⋅y]t。但不暴露 x , y x,y x,y的值给对方。我们用 [ x ] = ( x 0 , x 1 ) [x]=(x_0,x_1) [x]=(x0,x1)表示对 x x x的一个秘密共享,其中 x = x 0 + x 1 m o d t x=x_0+x_1 \bmod t x=x0+x1modt。每个参与方 P i P_i Pi只能知道 x i x_i xi,但不能知道 x 1 − i x_{1-i} x1−i的值。那么就可以通过如下方式来进行安全多方计算:
-
加法: [ x ] + [ y ] = [ x + y ] = ( z 0 , z 1 ) , z 0 = x 0 + y 0 , z 1 = x 1 + y 1 [x]+[y] = [x+y] = (z_0,z_1),z_0=x_0+y_0,z_1=x_1+y_1 [x]+[y]=[x+y]=(z0,z1),z0=x0+y0,z1=x1+y1
-
常数乘法: c [ x ] = [ c x ] = ( z 0 , z 1 ) , z 0 = c x 0 , z 1 = c x 1 c[x] = [cx] = (z_0,z_1), z_0=cx_0,z_1=cx_1 c[x]=[cx]=(z0,z1),z0=cx0,z1=cx1。
-
乘法:乘法需要基于乘法三元组,即双方拥有( [ a ] , [ b ] , [ c ] , c = a ⋅ b m o d t [a],[b],[c],c= a \cdot b \bmod t [a],[b],[c],c=a⋅bmodt),那就可以以如下方式计算 [ x y ] [xy] [xy]:
计算 [ x + a ] , [ y + b ] [x+a],[y+b] [x+a],[y+b],并恢复秘密值 x ′ = x + a , y ′ = y + b x'=x+a,y'=y+b x′=x+a,y′=y+b。然后就可以计算 x ′ y ′ x'y' x′y′并重新共享 [ x ′ y ′ ] [x'y'] [x′y′].
计算 [ x y ] = [ x ′ y ′ ] − y ′ [ a ] − x ′ [ b ] − [ c ] [xy]=[x'y']-y'[a]-x'[b]-[c] [xy]=[x′y′]−y′[a]−x′[b]−[c].
乘法三元组的生成有好多种方式,这里采用了基于HE的生成方法。
这里的多方安全计算为模t的整数域内,他们通过对消息扩张 Δ \varDelta Δ倍的方式来用整数表达实数。
主要技术
内积(针对向量内积的HE打包)
考虑一下多项式的乘法:令 a ( X ) = ∑ i = 0 n a i X i a(X)=\sum_{i=0}^{n}a_i X^i a(X)=∑i=0naiXi, b ( X ) = ∑ i = 0 m b i X i b(X)=\sum_{i=0}^{m}b_i X^i b(X)=∑i=0mbiXi,那么 a ( X ) ⋅ b ( X ) = ∑ i = 0 n + m − 1 c i ⋅ X i ∈ R [ X ] / ( X N + 1 ) ) a(X)\cdot b(X)=\sum_{i=0}^{n+m-1} c_i \cdot X^i \in \mathbb{R}[X]/(X^N+1)) a(X)⋅b(X)=∑i=0n+m−1ci⋅Xi∈R[X]/(XN+1)),其中 c i c_i ci为
c i = a 0 ⋅ b i + a 1 ⋅ b i − 1 + ⋯ + a i − 1 ⋅ b 1 + a i ⋅ b 0 c_i = a_0 \cdot b_i + a_1 \cdot b_{i-1} + \cdots + a_{i-1} \cdot b_1 + a_i \cdot b_0 ci=a0⋅bi+a1⋅bi−1+⋯+ai−1⋅b1+ai⋅b0
因为多项式的乘法具有这种性质,那我们考虑当 a ( X ) = ∑ i = 0 N − 1 a i X i a(X)=\sum_{i=0}^{N-1}a_i X^i a(X)=∑i=0N−1aiXi, b ( x ) = ∑ i = 1 N − 1 b i X i b(x)=\sum_{i=1}^{N-1} b_i X^i b(x)=∑i=1N−1biXi的情况,因为在环 R [ X ] / ( X N + 1 ) \mathbb{R}[X]/(X^N+1) R[X]/(XN+1)中, X N = − 1 X^N=-1 XN=−1,所以乘积 c ( X ) = ( a ⋅ b ) ( X ) c(X)=(a\cdot b)(X) c(X)=(a⋅b)(X)的常数项为 a 0 b 0 − a 1 b N − 1 − ⋯ − a N − 1 b 1 a_0 b_0 -a_1 b_{N-1} - \cdots - a_{N-1} b_1 a0b0−a1bN−1−⋯−aN−1b1。也可以用内积形式来表示:
⟨ ( a 0 , a 1 , . . . , a N − 1 ) , ( b 0 , − b N − 1 , − b N − 2 , . . . , − b 1 ) ⟩ \langle (a_0, a_1,...,a_{N-1}),(b_0, -b_{N-1}, -b_{N-2},..., -b_1) \rangle ⟨(a0,a1,...,aN−1),(b0,−bN−1,−bN−2,...,−b1)⟩
那么可以考虑如下两种encode方式:
- p m 1 ( v ) : \mathrm{pm1}(\mathbf{v}): pm1(v):对一个 m m m维向量 v \mathbf{v} v,返回一个多项式 ∑ i = 0 m − 1 v i ⋅ X i ∈ R [ X ] / ( X N + 1 ) \sum_{i=0}^{m-1}v_i\cdot X^i \in \mathbb{R}[X]/(X^N+1) ∑i=0m−1vi⋅Xi∈R[X]/(XN+1)。
- p m 2 ( v ) : \mathrm{pm2}(\mathbf{v}): pm2(v):对一个 m m m维向量 v \mathbf{v} v,返回一个多项式 v 0 − ∑ i = 1 m − 1 v i ⋅ X N − i ∈ R [ X ] / ( X N + 1 ) v_0-\sum_{i=1}^{m-1}v_i \cdot X^{N-i} \in \mathbb{R}[X]/(X^N+1) v0−∑i=1m−1vi⋅XN−i∈R[X]/(XN+1)。
那此时, ⟨ a , b ⟩ = ( a ( X ) ⋅ b ( X ) ) 0 \langle \mathbf{a,b} \rangle = (a(X) \cdot b(X))_0 ⟨a,b⟩=(a(X)⋅b(X))0,其中 a ( X ) ← p m 1 ( a ) , b ( X ) ← p m 2 ( b ) a(X) \gets \mathrm{pm1}(\mathbf{a}),b(X) \gets \mathrm{pm2}(\mathbf{b}) a(X)←pm1(a),b(X)←pm2(b)。
矩阵-向量乘法1
上面的打包方式考虑到了两个向量的内积,也就是 ⟨ a , b ⟩ = a T ⋅ b \langle \mathbf{a,b} \rangle = \mathbf{a}^T\cdot \mathbf{b} ⟨a,b⟩=aT⋅b。那最简单的实现矩阵-向量乘法 M ⋅ v \mathbf{M \cdot v} M⋅v或者 M T ⋅ v \mathbf{M}^T \cdot \mathbf{v} MT⋅v的方法是将 M \mathbf{M} M按行,按列进行上述的向量打包。但这样的话,对于一个 n × m n\times m n×m的矩阵,至少需要 n + m n+m n+m个多项式才能表示一个矩阵,这样不够高效。
考虑到多项式 a ( X ) = ( a 0 , a 1 , . . . , a N − 1 ) a(X) = (a_0,a_1,...,a_{N-1}) a(X)=(a0,a1,...,aN−1), X i ⋅ a ( X ) = ( − a N − i , . . . , − a N − 1 , a 0 , a 1 , . . . , a N − i − 1 ) X^i \cdot a(X)=(-a_{N-i},...,-a_{N-1},a_0,a_1,...,a_{N-i-1}) Xi⋅a(X)=(−aN−i,...,−aN−1,a0,a1,...,aN−i−1)。根据这个性质,可以定义如下编码方式:
-
E c d V e c 1 ( v ) : \mathrm{EcdVec1}(\mathbf{v}): EcdVec1(v):对一个 m m m维向量 v \mathbf{v} v,返回一个多项式 v 0 − ∑ i = 1 m − 1 v i ⋅ X N − i ∈ R [ X ] / ( X N + 1 ) v_0 - \sum_{i=1}^{m-1} v_i \cdot X^{N-i} \in \mathbb{R}[X]/(X^N+1) v0−∑i=1m−1vi⋅XN−i∈R[X]/(XN+1)。
-
E c d V e c 2 ( v , n ) : \mathrm{EcdVec2}(\mathbf{v},n): EcdVec2(v,n):对一个 m m m维向量 v \mathbf{v} v,返回一个多项式 v 0 − ∑ i = 1 m − 1 v i ⋅ X N − n ⋅ i ∈ R [ X ] / ( X N + 1 ) v_0 - \sum_{i=1}^{m-1} v_i \cdot X^{N-n\cdot i} \in \mathbb{R}[X]/(X^N+1) v0−∑i=1m−1vi⋅XN−n⋅i∈R[X]/(XN+1)。
其实 E c d V e c 1 ( v ) = E c d V e c 2 ( v , 1 ) \mathrm{EcdVec1}(\mathbf{v})=\mathrm{EcdVec2}(\mathbf{v},1) EcdVec1(v)=EcdVec2(v,1)。
-
E c d M a t ( M , Δ ) : \mathrm{EcdMat}(\mathbf{M},\varDelta): EcdMat(M,Δ):对一个 n × m n\times m n×m维的矩阵 M \mathbf{M} M,返回一个多项式 ∑ i = 0 n − 1 ∑ j = 0 m − 1 M i , j ⋅ X m ⋅ i + j ∈ R [ X ] / ( X N + 1 ) \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} M_{i,j}\cdot X^{m\ \cdot i +j} \in \mathbb{R}[X]/(X^N+1) ∑i=0n−1∑j=0m−1Mi,j⋅Xm ⋅i+j∈R[X]/(XN+1)。这里要假设 m ⋅ n < N m\cdot n <N m⋅n<N。
定理 1:给定长度为 m m m的向量 v \mathbf{v} v和 n × m n\times m n×m维矩阵 M \mathbf{M} M,令 a ( x ) = E c d V e c 1 ( v ) , b ( x ) = E c d M a t ( M ) a(x)=\mathrm{EcdVec1}(\mathbf{v}),b(x)=\mathrm{EcdMat}(\mathbf{M}) a(x)=EcdVec1(v),b(x)=EcdMat(M),那么
a ( X ) ⋅ b ( X ) = ∑ i = 0 N − 1 c i ⋅ X i c m ⋅ i = ⟨ v , R o w i ( M ) ⟩ \begin{aligned} & a(X) \cdot b(X) = \sum_{i=0}^{N-1}c_i \cdot X^i\\ &c_{m\cdot i}=\langle \mathbf{v},Row_i(\mathbf{M}) \rangle \end{aligned} a(X)⋅b(X)=i=0∑N−1ci⋅Xicm⋅i=⟨v,Rowi(M)⟩
也就是 c ( X ) c(X) c(X)这个多项式的第 m ⋅ i m\cdot i m⋅i个系数表示 M ⋅ v \mathbf{M\cdot v} M⋅v的第 i i i行的值。
证明:
a ( X ) = v 0 − ∑ i = 1 m − 1 v i ⋅ X N − i b ( X ) = ∑ j = 0 n − 1 ∑ k = 0 m − 1 M j , k X m ⋅ j + k c ( X ) = v 0 ⋅ b ( X ) − ∑ i = 1 m − 1 ∑ j = 0 n − 1 ∑ k = 0 m − 1 v i ⋅ M j , k ⋅ X N − i + m ⋅ j + k = v 0 ⋅ b ( X ) + ∑ i = 1 m − 1 ∑ j = 0 n − 1 ∑ k = 0 m − 1 v i ⋅ M j , k ⋅ X m ⋅ j + ( k − i ) = v 0 ⋅ ∑ j = 0 n − 1 ∑ k = 0 m − 1 M j , k X m ⋅ j + k + ∑ i = 1 m − 1 ∑ j = 0 n − 1 ∑ k = 0 m − 1 v i ⋅ M j , k ⋅ X m ⋅ j + ( k − i ) \begin{aligned} a(X)&=v_0 - \sum_{i=1}^{m-1}v_i \cdot X^{N- i}\\ b(X)&=\sum_{j=0}^{n-1}\sum_{k=0}^{m-1}M_{j,k} X^{m\cdot j + k}\\ c(X)&=v_0 \cdot b(X) - \sum_{i=1}^{m-1} \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} v_i \cdot M_{j,k} \cdot X^{N-i+ m \cdot j + k}\\ &=v_0 \cdot b(X) + \sum_{i=1}^{m-1} \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} v_i \cdot M_{j,k} \cdot X^{m\cdot j + (k-i)}\\ &= v_0 \cdot \sum_{j=0}^{n-1}\sum_{k=0}^{m-1}M_{j,k} X^{m\cdot j + k} + \sum_{i=1}^{m-1} \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} v_i \cdot M_{j,k} \cdot X^{m\cdot j + (k-i)}\\ \end{aligned} a(X)b(X)c(X)=v0−i=1∑m−1vi⋅XN−i=j=0∑n−1k=0∑m−1Mj,kXm⋅j+k=v0⋅b(X)−i=1∑m−1j=0∑n−1k=0∑m−1vi⋅Mj,k⋅XN−i+m⋅j+k=v0⋅b(X)+i=1∑m−1j=0∑n−1k=0∑m−1vi⋅Mj,k⋅Xm⋅j+(k−i)=v0⋅j=0∑n−1k=0∑m−1Mj,kXm⋅j+k+i=1∑m−1j=0∑n−1k=0∑m−1vi⋅Mj,k⋅Xm⋅j+(k−i)
考虑 M ⋅ v \mathbf{M\cdot v} M⋅v的第 β \beta β行: ⟨ v , R o w β ( M ) ⟩ = ∑ i = 0 m − 1 v i ⋅ M β , i \langle \mathbf{v},Row_{\beta}(\mathbf{M})\rangle = \sum_{i=0}^{m-1}v_i\cdot M_{\beta,i} ⟨v,Rowβ(M)⟩=∑i=0m−1vi⋅Mβ,i,再考虑 c ( X ) c(X) c(X)中次数为 X m ⋅ β X^{m\cdot \beta} Xm⋅β的项:
c m ⋅ β X m ⋅ β = v 0 M β , 0 X m ⋅ β + ∑ i = 1 m − 1 v i ⋅ M β , i ⋅ X m ⋅ β = ∑ i = 0 m − 1 v i ⋅ M β , i ⋅ X m ⋅ β c_{m \cdot \beta}X^{m \cdot \beta}=v_0 M_{\beta,0} X^{m \cdot \beta} + \sum_{i=1}^{m-1}v_i \cdot M_{\beta,i} \cdot X^{m \cdot \beta} = \sum_{i=0}^{m-1}v_i\cdot M_{\beta,i} \cdot X^{m \cdot \beta} cm⋅βXm⋅β=v0Mβ,0Xm⋅β+i=1∑m−1vi⋅Mβ,i⋅Xm⋅β=i=0∑m−1vi⋅Mβ,i⋅Xm⋅β
所以 c m ⋅ i = ⟨ v , R o w i ( M ) ⟩ , i ∈ [ 0 , n ) c_{m \cdot i} = \langle \mathbf{v}, Row_i(\mathbf{M}) \rangle,i \in [0,n) cm⋅i=⟨v,Rowi(M)⟩,i∈[0,n)。
定理2:给定长度为 n n n的向量 v \mathbf{v} v和 n × m n \times m n×m维的矩阵 M \mathbf{M} M,令 a ( x ) = E c d V e c 2 ( v , m ) , b ( x ) = E c d M a t ( M ) a(x)=\mathrm{EcdVec2}(\mathbf{v},m),b(x)=\mathrm{EcdMat}(\mathbf{M}) a(x)=EcdVec2(v,m),b(x)=EcdMat(M),那么
a ( X ) ⋅ b ( X ) = ∑ i = 0 N − 1 c i ⋅ X i c i = ⟨ v , C o l i ( M ) ⟩ \begin{aligned} & a(X) \cdot b(X) = \sum_{i=0}^{N-1}c_i \cdot X^i\\ &c_{i}=\langle \mathbf{v},Col_i(\mathbf{M}) \rangle \end{aligned} a(X)⋅b(X)=i=0∑N−1ci⋅Xici=⟨v,Coli(M)⟩
也就是 c ( X ) c(X) c(X)这个多项式的第 i i i个系数表示 M T ⋅ v \mathbf{M}^T \cdot \mathbf{v} MT⋅v的第 i i i行的值。
证明:
a ( X ) = v 0 − ∑ i = 1 m − 1 v i ⋅ X N − m ⋅ i b ( X ) = ∑ j = 0 n − 1 ∑ k = 0 m − 1 M j , k X m ⋅ j + k c ( X ) = v 0 ⋅ b ( X ) − ∑ i = 1 m − 1 ∑ j = 0 n − 1 ∑ k = 0 m − 1 v i ⋅ M j , k ⋅ X N + m ⋅ ( j − i ) + k = v 0 ⋅ b ( X ) + ∑ i = 1 m − 1 ∑ j = 0 n − 1 ∑ k = 0 m − 1 v i ⋅ M j , k ⋅ X m ⋅ ( i − j ) + k = v 0 ⋅ ∑ j = 0 n − 1 ∑ k = 0 m − 1 M j , k X m ⋅ j + k + ∑ i = 1 m − 1 ∑ j = 0 n − 1 ∑ k = 0 m − 1 v i ⋅ M j , k ⋅ X m ⋅ ( i − j ) + k \begin{aligned} a(X) &= v_0 - \sum_{i=1}^{m-1}v_i \cdot X^{N- m \cdot i}\\ b(X) &= \sum_{j=0}^{n-1}\sum_{k=0}^{m-1}M_{j,k} X^{m\cdot j + k}\\ c(X) &= v_0 \cdot b(X) - \sum_{i=1}^{m-1} \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} v_i \cdot M_{j,k} \cdot X^{N + m \cdot (j-i) + k}\\ &=v_0 \cdot b(X) + \sum_{i=1}^{m-1} \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} v_i \cdot M_{j,k} \cdot X^{m \cdot (i-j) +k}\\ &= v_0 \cdot \sum_{j=0}^{n-1}\sum_{k=0}^{m-1}M_{j,k} X^{m\cdot j + k} + \sum_{i=1}^{m-1} \sum_{j=0}^{n-1} \sum_{k=0}^{m-1} v_i \cdot M_{j,k} \cdot X^{m \cdot (i-j) + k}\\ \end{aligned} a(X)b(X)c(X)=v0−i=1∑m−1vi⋅XN−m⋅i=j=0∑n−1k=0∑m−1Mj,kXm⋅j+k=v0⋅b(X)−i=1∑m−1j=0∑n−1k=0∑m−1vi⋅Mj,k⋅XN+m⋅(j−i)+k=v0⋅b(X)+i=1∑m−1j=0∑n−1k=0∑m−1vi⋅Mj,k⋅Xm⋅(i−j)+k=v0⋅j=0∑n−1k=0∑m−1Mj,kXm⋅j+k+i=1∑m−1j=0∑n−1k=0∑m−1vi⋅Mj,k⋅Xm⋅(i−j)+k
考虑 M T ⋅ v \mathbf{M}^T\cdot \mathbf{v} MT⋅v的第 β \beta β行: ⟨ v , C o l β ( M ) ⟩ = ∑ i = 0 n − 1 v i ⋅ M i , β \langle \mathbf{v},Col_{\beta}(\mathbf{M})\rangle = \sum_{i=0}^{n-1}v_i\cdot M_{i,\beta} ⟨v,Colβ(M)⟩=∑i=0n−1vi⋅Mi,β,再考虑 c ( X ) c(X) c(X)中次数为 X β X^{\beta} Xβ的项:
c β X β = v 0 M 0 , β X β + ∑ i = 1 n − 1 v i ⋅ M i , β ⋅ X β = ∑ i = 0 n − 1 v i ⋅ M i , β ⋅ X β c_{\beta}X^{\beta}=v_0 M_{0,\beta} X^{\beta} + \sum_{i=1}^{n-1}v_i \cdot M_{i,\beta} \cdot X^{\beta} = \sum_{i=0}^{n-1}v_i\cdot M_{i,\beta} \cdot X^{\beta} cβXβ=v0M0,βXβ+i=1∑n−1vi⋅Mi,β⋅Xβ=i=0∑n−1vi⋅Mi,β⋅Xβ
所以 c i = ⟨ v , C o l i ( M ) ⟩ , i ∈ [ 0 , m ) c_{i} = \langle \mathbf{v}, Col_i(\mathbf{M}) \rangle,i \in [0,m) ci=⟨v,Coli(M)⟩,i∈[0,m)。
根据上述两个定理,对于 n × m n \times m n×m维的矩阵, m m m维向量 v \mathbf{v} v, n n n维向量 w \mathbf{w} w,令 M ( X ) = E c d M a t ( M ) M(X)= \mathrm{EcdMat}(\mathbf{M}) M(X)=EcdMat(M), v ( X ) = E c d V e c 1 ( v ) v(X)= \mathrm{EcdVec1}(\mathbf{v}) v(X)=EcdVec1(v), w ( X ) = E c d V e c 2 ( w , m ) w(X)=\mathrm{EcdVec2}(\mathbf{w},m) w(X)=EcdVec2(w,m)。那 M ⋅ v ( X ) M\cdot v(X) M⋅v(X)的第 m ⋅ i m\cdot i m⋅i项系数可以表示 M ⋅ v \mathbf{M \cdot v} M⋅v的第 i i i行, i ∈ [ 0 , m ) i\in[0,m) i∈[0,m); M ⋅ w ( X ) M\cdot w(X) M⋅w(X)的第 i i i项系数可以表示 M T ⋅ w \mathbf{M}^T \cdot \mathbf{w} MT⋅w的第 i i i行, i ∈ [ 0 , n ) i \in [0,n) i∈[0,n)。
系数提取
在上述矩阵-向量乘法的两个定理中,乘积多项式中只有一部分的系数表示有效的矩阵-向量积,因此,可以将这些项提取出来来减少通信的开销。考虑到解密算法为 d ( x ) = b ( x ) = a ( x ) ⋅ s ( x ) ∈ R q d(x) = b(x) = a(x) \cdot s(x) \in \mathcal{R}_q d(x)=b(x)=a(x)⋅s(x)∈Rq,那么明文多项式的第 i i i项系数只与 d ( x ) d(x) d(x)的第 i i i项系数有关。那么,为了提取第 i i i项系数,定义如下偏置旋转私钥:
S k e w R o t i ( s ) : = ( s i , ⋯ , s 0 , − s N − 1 , ⋯ , − s i + 1 ) ∈ Z q N , i ∈ [ 0 , N ) \mathrm{SkewRot}_i(\mathbf{s}):= (s_i,\cdots,s_0,-s_{N-1},\cdots,-s_{i+1}) \in \mathbb{Z}_q^N, i\in [0,N) SkewRoti(s):=(si,⋯,s0,−sN−1,⋯,−si+1)∈ZqN,i∈[0,N)
使用这个表示法,那么 a ( x ) ⋅ s ( x ) a(x)\cdot s(x) a(x)⋅s(x)的第 i i i项就可以表示为 ⟨ a , S k e w R o t i ( s ) ⟩ \langle \mathbf{a} , \mathrm{SkewRot}_i (\mathbf{s}) \rangle ⟨a,SkewRoti(s)⟩。
通过这个方法就可以构造如下两个提取和解密算法:
− Extract ( c t x t , K ) : - \operatorname{Extract} ( \mathrm{ctxt},K): −Extract(ctxt,K): 给定密文 c t x t = ( b ( x ) , a ( x ) ) \mathrm{ctxt} =(b(x), a(x)) ctxt=(b(x),a(x))以及一个集合 K = { k 1 , ⋯ , k ℓ } K=\left\{k_{1}, \cdots, k_{\ell}\right\} K={
k1,⋯,kℓ}, 返回
ctxtExt = ( ( b k 1 , ⋯ , b k ℓ ) , a ( x ) ) ∈ Z q ℓ × R q \operatorname{ctxtExt}=\left(\left(b_{k_{1}}, \cdots, b_{k_{\ell}}\right), a(x)\right) \in \mathbb{Z}_{q}^{\ell} \times \mathcal{R}_{q} ctxtExt=((bk1,⋯,bkℓ),a(x))∈Zqℓ×Rq
− Dec ∗ ( s k , c t x t E x t , K ) : -\operatorname{Dec}^{*}(\mathrm{sk}, \mathrm{ctxtExt},K): −Dec∗(sk,ctxtExt,K): 给定提取后的密文 c t x t E x t = ( b , a ( x ) ) \mathrm{ctxtExt}=(\mathbf{b}, a(x)) ctxtExt=(b,a(x)),集合 K = { k 1 , ⋯ , k ℓ } K=\left\{k_{1}, \cdots, k_{\ell}\right\} K={
k1,⋯,kℓ},以及私钥 s k = s \mathrm{sk}=\mathbf{s} sk=s,计算
m i = b i + ⟨ a , SkewRot k i ( s ) ⟩ m o d q m_{i}=b_{i}+\left\langle\mathbf{a}, \operatorname{SkewRot}_{k_{i}}(\mathbf{s})\right\rangle \bmod q mi=bi+⟨a,SkewRotki(s)⟩modq
返回一个向量 ( m 1 , ⋯ , m ℓ ) ∈ Z q ℓ \left(m_{1}, \cdots, m_{\ell}\right) \in \mathbb{Z}_{q}^{\ell} (m1,⋯,mℓ)∈Zqℓ
这种优化看起来蛮没用的,但其实减少了通信开销:原本要传输的是 a ( x ) , b ( x ) a(x),b(x) a(x),b(x),通信开销是 2 N ⋅ log 2 q 2N \cdot \log_2 q 2N⋅log2q,而优化过后传输的是 b ( x ) , a k i , k i ∈ K b(x),a_{k_i},k_i\in K b(x),aki,ki∈K,通信开销是 ( N + l ) ⋅ log 2 q (N+l)\cdot \log_2 q (N+l)⋅log2q,在实际使用中 l ≪ N l \ll N l≪N,所以通信开销是几乎减半的。
而考虑到计算开销,这里做的是内积 ⟨ a , SkewRot k i ( s ) ⟩ \left\langle\mathbf{a}, \operatorname{SkewRot}_{k_{i}}(\mathbf{s})\right\rangle ⟨a,SkewRotki(s)⟩,需要 l ⋅ N l\cdot N l⋅N次乘法,而直接计算 a ( x ) ⋅ b ( x ) a(x)\cdot b(x) a(x)⋅b(x)也能得到第 i i i项的值,而果采用的是 N T T NTT NTT+ a ( x ) , b ( x ) a(x),b(x) a(x),b(x)多项式乘法的话,复杂度是 2 ⋅ log N ⋅ N + N 2 \cdot \log N \cdot N + N 2⋅logN⋅N+N,也就是考虑 l l l与 2 log N 2 \log N 2logN之间的大小关系来选择到底用哪种解密方法(NTT or 内积)。
MPC和HE的混合模型
考虑到要使用MPC和HE的结合,在MPC中需要有一方对密文进行解密,我们不希望它直接得到解密结果,因此定义一个给密文加噪声的函数:
− A d d M a s k ( c t x t E x t , r ) : -\mathrm{AddMask(ctxtExt},\mathbf{r}): −AddMask(ctxtExt,r):给定密文 c t x t E x t = ( b , a ( x ) ) \mathrm{ctxtExt}=(\mathbf{b},a(x)) ctxtExt=(b,a(x)),返回 ( b + r , a ( x ) ) (\mathbf{b+r},a(x)) (b+r,a(x))。
进一步的,为了更加清楚的解释,定义了一个从 Z q Z_q Zq映射到实数的方法:
− Z q T o R e a l ( m , q , Δ ) : -\mathrm{ZqToReal}(m,q,\varDelta): −ZqToReal(m,q,Δ):如果 m > ( q / 2 ) m>(q/2) m>(q/2),返回 ( m − q ) / Δ (m-q)/\varDelta (m−q)/Δ,否则返回 m / Δ m/\varDelta m/Δ。
MPC中模数和缩放倍数替换
t t t表示MPC中使用的模数, q q q表示HE中使用的模数。出于效率考虑,在HE和MPC中使用的模数和缩放系数不同,因此需要在做模数和缩放倍数转换。
− M S q 1 → q 2 ( m ) : -\mathrm{MS}_{q_1 \to q_2}(m): −MSq1→q2(m):返回 ⌊ m ⋅ ( q 2 / q 1 ) ⌉ \lfloor m \cdot (q_2/q_1) \rceil ⌊m⋅(q2/q1)⌉。
− S F S Δ 1 → Δ 2 ( m , α ) : -\mathrm{SFS}_{\varDelta_1 \to \varDelta_2}(m,\alpha): −SFSΔ1→Δ2(m,α):对于 Δ = Δ 2 Δ 1 \varDelta = \frac{\varDelta_2}{\varDelta_1} Δ=Δ1Δ2,计算
m ′ = { ⌊ m ⋅ δ ⌉ m o d t if α = 1 t − ⌊ ( t − m ) ⋅ δ ⌉ m o d t if α = 2 m' = \left\{ \begin{aligned} &\lfloor m \cdot \delta \rceil \bmod t & \text{if }\alpha = 1\\ &t- \lfloor (t-m)\ \cdot \delta \rceil \bmod t & \text{if }\alpha =2 \end{aligned} \right. m′={
⌊m⋅δ⌉modtt−⌊(t−m) ⋅δ⌉modtif α=1if α=2
这里做实验下来感觉有点错误,文中是说 S F S Δ 1 → Δ 2 ( m 1 , 2 ) , S F S Δ 1 → Δ 2 ( m 2 , 2 ) \mathrm{SFS}_{\varDelta_1 \to \varDelta_2}(m_1,2),\mathrm{SFS}_{\varDelta_1\to \varDelta_2}(m_2,2) SFSΔ1→Δ2(m1,2),SFSΔ1→Δ2(m2,2),则结果变为 ⌊ m ⋅ ( Δ 2 / Δ 1 ) ⌉ + ϵ \lfloor m\cdot (\varDelta_2/\varDelta_1)\rceil + \epsilon ⌊m⋅(Δ2/Δ1)⌉+ϵ。但实际测试下来只有 Δ \varDelta Δ为整数时才成立,所以我觉得这里应该改为 t − ⌊ t − m ⋅ Δ ⌉ m o d t if α = 2 t-\lfloor t- m\cdot \varDelta \rceil \bmod t \quad \text{ if }\alpha =2 t−⌊t−m⋅Δ⌉modt if α=2。
HE和MPC转换
定理一个HE方案,模数为 q q q,缩放系数为 Δ \varDelta Δ,一个MPC方案,模数为 t t t,缩放系数为 Δ ′ \varDelta' Δ′。
定义两个算法:
− H E 2 M P C : -\mathrm{HE2MPC}: −HE2MPC:输入为一个密文 c t x t \mathrm{ctxt} ctxt,是加密了 Δ ⋅ m ( x ) \varDelta \cdot m(x) Δ⋅m(x)的一个密文,其中 m ( x ) m(x) m(x)的系数包含了几个有效的位 m ∈ R ℓ \mathbf{m}\in \mathbb{R} ^ \ell m∈Rℓ,输出为两个加法的秘密共享 m 1 , m 2 \mathbf{m}_1,\mathbf{m}_2 m1,m2,满足 m 1 + m 2 = ⌊ m ⋅ Δ ′ ⌉ m o d t \mathbf{m}_1 + \mathbf{m_2} = \lfloor \mathbf{m} \cdot \varDelta^{\prime} \rceil \bmod t m1+m2=⌊m⋅Δ′⌉modt。
− M P C 2 H E : -\mathrm{MPC2HE}: −MPC2HE:输入为两个向量 y 1 , y 2 \mathbf{y}_1,\mathbf{y}_2 y1,y2,满足 y 1 + y 2 = ⌊ y ⋅ Δ ′ ⌉ m o d t \mathbf{y}_1 + \mathbf{y}_2 = \lfloor \mathbf{y} \cdot \varDelta^{\prime} \rceil \bmod t y1+y2=⌊y⋅Δ′⌉modt,以及一个控制位 α \alpha α,如果 α = 1 \alpha =1 α=1,输出 E c d V e c 1 ( Δ ⋅ y ) \mathrm{EcdVec1}(\varDelta \cdot \mathbf{y}) EcdVec1(Δ⋅y),如果 α = 2 \alpha = 2 α=2,输出 E c d V e c 2 ( Δ ⋅ y ) \mathrm{EcdVec2}(\varDelta \cdot \mathbf{y}) EcdVec2(Δ⋅y)。
这里的文字描述和本来的算法对不上了,应该是写作错误,这里的 A d d M a s k \mathrm{AddMask} AddMask应该是减去了 r \mathbf{r} r,那么最后 v = Δ ′ Δ ⋅ r \mathbf{v}=\frac{\varDelta'}{\varDelta} \cdot \mathbf{r} v=ΔΔ′⋅r, w = Δ ′ ⋅ m − Δ ′ Δ ⋅ r \mathbf{w} = \varDelta' \cdot \mathbf{m}- \frac{\varDelta'}{\varDelta} \cdot \mathbf{r} w=Δ′⋅m−ΔΔ′⋅r。
梳理一下流程:首先在加密时, c t x t \mathrm{ctxt} ctxt包含的消息为 Δ ⋅ m \varDelta \cdot \mathbf{m} Δ⋅m,做完 A d d M a s k \mathrm{AddMask} AddMask之后变为 Δ ⋅ m − r \varDelta \cdot \mathbf{m -r} Δ⋅m−r。Party 2解密得到这部分内容,Party 1拥有 r \mathbf{r} r的值,双方一起做一下模数转换和缩放系数转换,最后得到 v = Δ ′ Δ ⋅ r \mathbf{v}=\frac{\varDelta'}{\varDelta} \cdot \mathbf{r} v=ΔΔ′⋅r, w = Δ ′ ⋅ m − Δ ′ Δ ⋅ r , w + v = Δ ′ ⋅ m \mathbf{w} = \varDelta' \cdot \mathbf{m}- \frac{\varDelta'}{\varDelta} \cdot \mathbf{r}, \mathbf{w} + \mathbf{v} = \varDelta' \cdot m w=Δ′⋅m−ΔΔ′⋅r,w+v=Δ′⋅m。
至于为什么Party 1要用 S F S ( ⋅ , 1 ) \mathrm{SFS}(\cdot,1) SFS(⋅,1),Party 2用 S F S ( ⋅ , 2 ) \mathrm{SFS}(\cdot, 2) SFS(⋅,2)。我觉得是因为本身 ⌊ ⋅ ⌉ \lfloor \cdot \rceil ⌊⋅⌉操作会带来error,而一边使用 ⌊ m ⋅ Δ ⌉ \lfloor m \cdot \varDelta \rceil ⌊m⋅Δ⌉,一边使用 ⌊ t − m ⋅ Δ ⌉ \lfloor t -m \cdot \varDelta \rceil ⌊t−m⋅Δ⌉可以减少加起来后的部分的error。
MPC2HE就相对简单很多了,因为是公钥加密,所以双方可以运行完模数转换之后直接进行加密,然后将加密结果加起来。
MPC PBoot(Protocol based bootstrapping)协议
使用MPC协议来代替bootstrapping其实很简单,双方都运行HE2MPC再运行MPC2HE就行了。但当中涉及一个小修改,就是不需要进行两次模数和缩放倍数替换了。具体协议如下:
看bootstrapping的时候发现了这篇文章又有一个错误,它文中说到缩放系数 Δ \varDelta Δ是在加密时候添加的,因此plaintext m 2 ( x ) m_2(x) m2(x)是不包含缩放系数的。但他在做 M u l t P ( c t x t 1 , m 2 ( x ) ) MultP(ctxt_1,m_2(x)) MultP(ctxt1,m2(x))的时候,输出的结果居然是 c t x t 2 ∈ R q / Δ 2 ctxt_2 \in \mathcal{R}_{q/\varDelta}^2 ctxt2∈Rq/Δ2中,说明做过了rescale,但是multP不需要做Rescale,因为这篇文章中 m 2 ( x ) m_2(x) m2(x)不包含 Δ \varDelta Δ,乘积为 Δ m 1 ( x ) ⋅ m 2 ( x ) \varDelta m_1(x)\cdot m_2(x) Δm1(x)⋅m2(x)而非 Δ 2 m 1 ( x ) ⋅ m 2 ( x ) \varDelta ^2 m_1(x)\cdot m_2(x) Δ2m1(x)⋅m2(x)。
值得注意的点是这里密文的输入是 R q / Δ 2 \mathcal{R}_{q/\varDelta}^2 Rq/Δ2中的,因为在实际使用过程中,都是在Mult之后进行PBoot。与直接HE2MPC和MPC2HE串行不太相同的地方是,这里只用了一次MS和SFS。MS将 q / Δ q/\varDelta q/Δ下的密文变为了 q q q下的,因为MS对扩张系数也造成了翻倍,所以要再把扩张系数缩小 Δ 2 → Δ \varDelta ^2 \to \varDelta Δ2→Δ。
使用Hybrid Model做逻辑回归的训练和预测
预测
这里的逻辑回归训练/预测模型涉及一个服务器和一个客户。在预测中,服务器拥有明文状态的模型,客户会传输加密后的数据给服务器,服务器返回一个加密后的预测结果。
对于输入 x \mathbf{x} x来说,逻辑回归的预测方法为 σ ( w T ⋅ x ) \sigma(\mathbf{w}^T\cdot \mathbf{x}) σ(wT⋅x),分为两步的话就是先计算 d = ⟨ w , x ⟩ d = \langle \mathbf{w} , \mathbf{x} \rangle d=⟨w,x⟩,再计算 σ ( d ) \sigma(d) σ(d)。前一步可以使用同态加密计算,计算后的结果 d d d返回给用户之后,用户自己计算 σ \sigma σ激活函数。
算法如下:
这里因为他定义的时候写了 M u l t P MultP MultP的返回结果是在 R q / Δ 2 \mathcal{R}_{q/\varDelta} ^2 Rq/Δ2下的,因此要将结果 d d d映射到 ( − q 2 Δ , q 2 Δ ) (-\frac{q}{2\varDelta},\frac{q}{2\varDelta}) (−2Δq,2Δq)中。
训练
训练过程是最复杂的,首先看一下明文状态下一个epoch内的训练过程:
w ( t + 1 ) ← v ( t ) + α t n ⋅ Z I T ⋅ σ ( − Z I ⋅ w ( t ) ) v ( t + 1 ) ← ( 1 − γ t ) ⋅ w ( t + 1 ) + γ t ⋅ w ( t ) \begin{array}{l} \mathbf{w}^{(t+1)} \leftarrow \mathbf{v}^{(t)}+\frac{\alpha_{t}}{n} \cdot \mathbf{Z}_{I}^{T} \cdot \sigma\left(-\mathbf{Z}_{I} \cdot \mathbf{w}^{(t)}\right) \\ \mathbf{v}^{(t+1)} \leftarrow\left(1-\gamma_{t}\right) \cdot \mathbf{w}^{(t+1)}+\gamma_{t} \cdot \mathbf{w}^{(t)} \end{array} w(t+1)←v(t)+nαt⋅ZIT⋅σ(−ZI⋅w(t))v(t+1)←(1−γt)⋅w(t+1)+γt⋅w(t)
其中 α t \alpha_t αt是学习率, γ t \gamma_t γt是Nesterov加速梯度下降算法中用到的平滑系数。 Z I \mathbf{Z}_{I} ZI是一个 N I × M I N_I \times M_I NI×MI维的矩阵,代表了一个epoch内有 N I N_I NI个数据,每个数据有 M I − 1 M_I-1 MI−1个特征。
回顾一下在 E c d M a t EcdMat EcdMat算法中,对于一个 n × m n\times m n×m维的矩阵,该算法要求 n ⋅ m < N n\cdot m<N n⋅m<N, N N N是多项式的阶。而 Z I Z_I ZI可能会过大,所以考虑一种拆分算法,如图所示:
将 Z I Z_I ZI拆分为了好多个 n × m n \times m n×m维的子矩阵,其中 ( m ⋅ n ) < N (m\cdot n)<N (m⋅n)<N,记拆分个数为 n ′ = ⌈ N I / n ⌉ , m ′ = ⌈ N I / m ⌉ n' = \lceil N_I / n \rceil, m' = \lceil N_I /m \rceil n′=⌈NI/n⌉,m′=⌈NI/m⌉。也就是将 Z I Z_I ZI分为了 Z i , j , i ∈ [ 0 , n ′ ) , j ∈ [ 0 , m ′ ) Z_{i,j},i\in[0,n'),j\in[0,m') Zi,j,i∈[0,n′),j∈[0,m′)。向量 v , w \mathbf{v,w} v,w也做了相应的拆分,令 v i \mathbf{v}_i vi为 v \mathbf{v} v中的第 i i i个 m m m维的自向量。
再回看到训练算法:
w ( t + 1 ) ← v ( t ) + α t n ⋅ Z I T ⋅ σ ( − Z I ⋅ w ( t ) ) v ( t + 1 ) ← ( 1 − γ t ) ⋅ w ( t + 1 ) + γ t ⋅ w ( t ) \begin{array}{l} \mathbf{w}^{(t+1)} \leftarrow \mathbf{v}^{(t)}+\frac{\alpha_{t}}{n} \cdot \mathbf{Z}_{I}^{T} \cdot \sigma\left(-\mathbf{Z}_{I} \cdot \mathbf{w}^{(t)}\right) \\ \mathbf{v}^{(t+1)} \leftarrow\left(1-\gamma_{t}\right) \cdot \mathbf{w}^{(t+1)}+\gamma_{t} \cdot \mathbf{w}^{(t)} \end{array} w(t+1)←v(t)+nαt⋅ZIT⋅σ(−ZI⋅w(t))v(t+1)←(1−γt)⋅w(t+1)+γt⋅w(t)
可以抽取为几个步骤:
- 计算 x = Z I ⋅ w ( t ) \mathbf{x} = \mathbf{Z}_I \cdot \mathbf{w}^{(t)} x=ZI⋅w(t):HE
- 计算 y = − α t n ⋅ σ ( x ) \mathbf{y} = - \frac{\alpha_t}{n} \cdot \sigma (\mathbf{x}) y=−nαt⋅σ(x):HE
- 计算 g = Z I T ⋅ y \mathbf{g} = \mathbf{Z}_I^T \cdot \mathbf{y} g=ZIT⋅y:MPC
- 计算 w ( t + 1 ) = v ( t ) + g \mathbf{w}^{(t+1)}=\mathbf{v}^{(t)} + \mathbf{g} w(t+1)=v(t)+g,计算 v ( t + 1 ) = ( 1 − γ t ) ⋅ w ( t + 1 ) + γ t ⋅ w ( t ) \mathbf{v}^{(t+1)}=(1- \gamma_t) \cdot \mathbf{w}^{(t+1)} + \gamma_t \cdot \mathbf{w}^{(t)} v(t+1)=(1−γt)⋅w(t+1)+γt⋅w(t):HE&PBoot。
首先来看一下输入参数:
密文分别是是 c t x t Z i , j = E c d M a t ( Z i , j ) , c t x t v j ( t ) = E c d V e c 1 ( v j ( t ) ) , c t x t w j ( t ) = E c d V e c 1 ( w j ( t ) ) \mathrm{ctxt}_{\mathbf{Z}_{i,j}} = \mathrm{EcdMat}(Z_{i,j}),\mathrm{ctxt}_{\mathbf{v}_j^{(t)}}=\mathrm{EcdVec1}(\mathbf{v}_j^{(t)}),\mathrm{ctxt}_{\mathbf{w}_j^{(t)}}=\mathrm{EcdVec1}(\mathbf{w}_j^{(t)}) ctxtZi,j=EcdMat(Zi,j),ctxtvj(t)=EcdVec1(vj(t)),ctxtwj(t)=EcdVec1(wj(t))
由于计算 Z I ⋅ w ( t ) \mathbf{Z}_I \cdot \mathbf{w}^{(t)} ZI⋅w(t),所以采用 E c d V e c 1 \mathrm{EcdVec1} EcdVec1方法加密。
第一步:
这里应该是 w ( t ) \mathbf{w}^{(t)} w(t),应该是文章书写的错误,计算 x i = ∑ j = 0 m ′ − 1 Z i , j ⋅ w j \mathbf{x}_i=\sum_{j=0}^{m'-1} \mathbf{Z}_{i,j}\cdot \mathbf{w}_j xi=∑j=0m′−1Zi,j⋅wj
最后我们想得到的 x = ( x 0 ∥ x 1 ∥ . . . ∥ x n ′ − 1 ) \mathbf{x}=(\mathbf{x}_0\|\mathbf{x}_1\|...\|\mathbf{x}_{n'-1}) x=(x0∥x1∥...∥xn′−1)
第二步:
这里在MPC2HE中采用了 α = 2 \alpha=2 α=2,也就是EcdVec2形式来加密 y \mathbf{y} y,因为之后要做 Z T ⋅ y \mathbf{Z}^T\cdot\mathbf{y} ZT⋅y。
这里的SIGMOID函数用了一个在 [ − 8 , 8 ] [-8,8] [−8,8]之间的多项式逼近,具体数值为:
σ a p p ( x ) = 0.5 + 1.556384 ⋅ x 8 − 2.91484 ⋅ ( x 8 ) 3 + 2.96762 ⋅ ( x 8 ) 5 − 1.109504 ⋅ ( x 8 ) 7 \begin{aligned} \sigma_{app}(x)=0.5+1.556384\cdot\frac{x}{8}-2.91484\cdot\left(\frac{x}{8} \right)^3&\\ +2.96762 \cdot \left( \frac{x}{8} \right) ^5 - 1.109504 \cdot \left( \frac{x}{8} \right) ^ 7& \end{aligned} σapp(x)=0.5+1.556384⋅8x−2.91484⋅(8x)3+2.96762⋅(8x)5−1.109504⋅(8x)7
这个拟合函数的图像为:
第三步:
第三部没什么好说的,就是计算 g j = ∑ 0 ≤ i < n ′ Z i , j T ⋅ y j \mathbf{g}_j=\sum_{0\le i<n'} \mathbf{Z}_{i,j}^T\cdot \mathbf{y}_j gj=∑0≤i<n′Zi,jT⋅yj
第四步:
这里在每次乘法之后都进行了一次PBoot。且输入参数为PBoot(1),代表最后的密文为 E n c ( E c d V e c 1 ( v ( t + 1 ) ) ) \mathrm{Enc(EcdVec1}(\mathbf{v}^{(t+1)})) Enc(EcdVec1(v(t+1)))。
实验结果
Batch Size = n ⋅ m n\cdot m n⋅m, N = 8192 , q ≈ 2 60 , Δ ≈ 2 25 , t ≈ 2 55 N=8192,q\approx 2^{60},\varDelta \approx 2^{25},t \approx 2^{55} N=8192,q≈260,Δ≈225,t≈255。
WAN1: 1.97 Gbits/sec , WAN2: 116 Mbits/sec.
DataSet:KDD CUP 1999, 494020 samples,26 features。
Inference time:
Traiing time:
可以从这个结果上看出来,因为Phase1和 Phase3是只包括HE的,而比较耗时的Phase2,4是有MPC协议在的,由此可见还是通信开销对这个方案的影响比较大。
感觉这和之前看的"Jiang, X., Lauter, K., Kim, M., & Song, Y. (2018). Secure outsourced matrix computation and application to neural networks. Proceedings of the ACM Conference on Computer and Communications Security, 1209–1222. https://doi.org/10.1145/3243734.3243837"这篇文章有点类似啊,都是将矩阵打包成一个密文,然后用SIMD做运算,最后用在了隐私保护机器学习上面,到时候总结一下规律。 ↩︎