0


(BGV12)同态加密方案初学

BGV主要优化了BV11中的维度-模约减技术,提出了模交换技术,同时也优化了重线性化技术,提出了密钥交换技术,使得无需Bootstrapping也能做到较多层数的同态乘法。

前置

另一种形势的LWE公钥加密

这里在介绍方案的时候采用的另一种形式的LWE公钥加密,不是原文中的内容,但是有必要提一下,不然对于小白会懵逼很久(比如我)。
实例依然是

  1. A
  2. s
  3. +
  4. e
  5. As+e
  6. As+e
    1. K e n G e n ( ) KenGen() KenGen():公钥 p k = [ A s A + 2 e ] pk = \begin{bmatrix}-A \\ sA+2e\end{bmatrix} pk=[−AsA+2e​],私钥 s k = [ s , 1 ] sk = [s,1] sk=[s,1],使得 s k p k = 2 e sk \cdot pk =2 e skpk=2e(矩阵乘法即可验证)
    1. E n c ( ) Enc() Enc(): E n c p k ( m ) = p k r + [ 0 m ] ( m o d    q ) Enc_{pk}(m) = pk \cdot r + \begin{bmatrix} \vdots \\ 0 \\ m\end{bmatrix} (\mod q) Encpk​(m)=pkr+⎣⎢⎡​⋮0m​⎦⎥⎤​(modq),其中 r r r均匀取自 { 0 , 1 } L \{0,1\}^L {0,1}L,是个只含01的列矩阵,消息 m { 0 , 1 } m \in \{0,1\} m∈{0,1}
    1. D e c ( ) Dec() Dec(): D e c s k ( c t ) = < s k , c t > m o d    2 Dec_{sk}(ct)=<sk,ct> \mod 2 Decsk​(ct)=<sk,ct>mod2 可以解密验证一下 < s k , c t > = s k ( p k r + [ 0 m ] ) = s k p k r + s k [ 0 m ] = < 2 e , r > + m m \begin{aligned} <sk,ct> &= sk \cdot (pk \cdot r + \begin{bmatrix} \vdots \\ 0 \\ m\end{bmatrix}) \\ &=sk \cdot pk \cdot r+sk\begin{bmatrix} \vdots \\ 0 \\ m\end{bmatrix} \\ &= <2e,r>+m \\ &\approx m \end{aligned} <sk,ct>​=sk⋅(pkr+⎣⎢⎡​⋮0m​⎦⎥⎤​)=skpkr+sk⎣⎢⎡​⋮0m​⎦⎥⎤​=<2e,r>+mm < , > <,> <,>这个是内积。) 文章中把 [ < c , s > ] q [<\mathbf{c},\mathbf s>]_q [<c,s>]q​称为密钥 s \mathbf s s下密文 c c c的噪声

同态加法和乘法构建

接下来根据上面的来试着构建一下密文加法和乘法。
设两个密文

  1. c
  2. 1
  3. ,
  4. c
  5. 2
  6. \mathbf{c_1},\mathbf{c_2}
  7. c1​,c2​,满足
  8. <
  9. c
  10. 1
  11. ,
  12. s
  13. >
  14. =
  15. 2
  16. e
  17. 1
  18. +
  19. m
  20. 1
  21. ,
  22. <
  23. c
  24. 2
  25. ,
  26. s
  27. >
  28. =
  29. 2
  30. e
  31. 2
  32. +
  33. m
  34. 2
  35. <\mathbf{c_1},\mathbf{s}>=2e_1+m_1,<\mathbf{c_2},\mathbf{s}>=2e_2+m_2
  36. <c1​,s>=2e1​+m1​,<c2​,s>=2e2​+m2

有些地方省略了一下但是默认要模

  1. q
  2. q
  3. q
  • 加法 想构造出明文消息相加的形式,比较简单 c a d d = < c 1 + c 2 > m o d    q \mathbf {c}{add} =<\mathbf{c_1}+\mathbf{c_2}> \mod q cadd​=<c1​+c2​>modq 解密: D e c ( c a d d ) = < c a d d , s > = < c 1 + c 2 , s > = < c 1 , s > + < c 2 , s > = m 1 + m 2 + n o i s e \begin{aligned} Dec(\mathbf {c}{add}) &= <\mathbf {c}_{add},\mathbf s> \ &=<\mathbf{c_1}+\mathbf{c_2},\mathbf s> \ &=<\mathbf{c_1},\mathbf s>+<\mathbf{c_2},\mathbf s> \ &=m_1+m_2+noise \end{aligned} Dec(cadd​)​=<cadd​,s>=<c1​+c2​,s>=<c1​,s>+<c2​,s>=m1​+m2​+noise​ 显然符合同态加法。
  • 乘法 想构造出两个密文的乘积解密后是两个明文乘积的样子。 这里BGV方案中作者观察到 < c 1 , s > ⋅ < c 2 , s > = < c 1 ⊗ c 2 , s ⊗ s > <\mathbf{c_1},\mathbf s> \cdot <\mathbf{c_2},\mathbf s> =<\mathbf{c_1} \otimes\mathbf{c_2},\mathbf{s} \otimes \mathbf{s}> <c1​,s>⋅<c2​,s>=<c1​⊗c2​,s⊗s> ( ⊗ \otimes ⊗这个是张量积),上面的等式可以通过把左边的每一项拆开计算,比如把 c c c和 s s s都看二维的,计算左边表达式的结果,然后把所有的 c c c和 s s s分开成内积的形式,就能得到这个结果。 事实上这个来源于克罗内克积在这里插入图片描述 解密: D e c ( c m u l t ) = < c 1 ⊗ c 2 , s ⊗ s > = < c 1 , s > ⋅ < c 2 , s > = ( 2 e 1 + m 1 ) ( 2 e 2 + m 2 ) = m 1 m 2 + n o i s e \begin{aligned} Dec(\mathbf c_{mult})&= <\mathbf{c_1} \otimes\mathbf{c_2},\mathbf{s} \otimes \mathbf{s}> \ &= <\mathbf{c_1},\mathbf s> \cdot <\mathbf{c_2},\mathbf s> \ &= (2e_1+m_1) (2e_2+m_2) \ &= m_1m_2+noise \end{aligned} Dec(cmult​)​=<c1​⊗c2​,s⊗s>=<c1​,s>⋅<c2​,s>=(2e1​+m1​)(2e2​+m2​)=m1​m2​+noise​

因此,定义的同态操作如下:

  1. A
  2. d
  3. d
  4. i
  5. t
  6. i
  7. o
  8. n
  9. :
  10. Dec
  11. (
  12. c
  13. 1
  14. +
  15. c
  16. 2
  17. ,
  18. s
  19. )
  20. =
  21. Dec
  22. (
  23. c
  24. 1
  25. ,
  26. s
  27. )
  28. +
  29. Dec
  30. (
  31. c
  32. 2
  33. ,
  34. s
  35. )
  36. M
  37. u
  38. l
  39. t
  40. p
  41. l
  42. i
  43. c
  44. a
  45. t
  46. i
  47. o
  48. n
  49. :
  50. Dec
  51. (
  52. c
  53. 1
  54. c
  55. 2
  56. ,
  57. s
  58. s
  59. )
  60. =
  61. Dec
  62. (
  63. c
  64. 1
  65. ,
  66. s
  67. )
  68. Dec
  69. (
  70. c
  71. 2
  72. ,
  73. s
  74. )
  75. \begin{array}{l} Addition:\operatorname{Dec}\left(c_{1}+c_{2}, s\right)=\operatorname{Dec}\left(c_{1}, s\right)+\operatorname{Dec}\left(c_{2}, s\right) \\\\ Multplication:\operatorname{Dec}\left(c_{1} \otimes c_{2}, s \otimes s\right)=\operatorname{Dec}\left(c_{1}, s\right) \cdot \operatorname{Dec}\left(c_{2}, s\right) \end{array}
  76. Addition:Dec(c1​+c2​,s)=Dec(c1​,s)+Dec(c2​,s)Multplication:Dec(c1​⊗c2​,ss)=Dec(c1​,s)⋅Dec(c2​,s)​

同时我们可以看到,由于乘法定义为了张量积,那么密文和私钥就会膨胀得很厉害,所以需要降低它们。

GLWE(General Learning with Errors)

在BGV方案中把LWE和RLWE统一成了GLWE。
LWE中实例为

  1. (
  2. a
  3. ,
  4. b
  5. )
  6. Z
  7. q
  8. n
  9. ×
  10. Z
  11. q
  12. (a,b) \leftarrow \mathbb{Z}_q^n \times \mathbb{Z}_q
  13. (a,b)←Zqn​×Zq

RLWE中的实例为

  1. (
  2. a
  3. i
  4. ,
  5. b
  6. i
  7. )
  8. R
  9. q
  10. ×
  11. R
  12. q
  13. (a_i,b_i) \leftarrow {R}_q\times {R}_q
  14. (ai​,bi​)←Rq​×Rq

如果把

  1. Z
  2. \mathbb{Z}
  3. Z也看做环,那么即可将二者统一起来。

GLWE的定义如下,
在这里插入图片描述
则,可以通过两个参数(d,n)来确定选择的是LWE还是RLWE,LWE 只是用 d = 1 实例化的 GLWE。RLWE 是用 n = 1 实例化的 GLWE。
总之这不是一个新的结构,实际使用的还是RLWE和LWE。

基本方案

    1. E . S e t u p ( 1 λ , 1 μ , b ) \mathsf{E.Setup}(1^\lambda,1^\mu,b) E.Setup(1λ,1μ,b): 由比特 b b b来确定我们是构造LWE假设下的方案( b = 0 b=0 b=0)还是RLWE假设下的方案( b = 1 b=1 b=1). 选择一个 μ \mu μ比特的模数 q q q和参数 d = d ( λ , μ , b ) , n = n ( λ , μ , b ) , N = ( 2 n + 1 ) log q , χ = χ ( λ , μ , b ) d=d(\lambda,\mu,b),n=n(\lambda,\mu,b),N=\lceil (2n+1)\log q\rceil, \chi=\chi(\lambda, \mu, b) d=d(λ,μ,b),n=n(λ,μ,b),N=⌈(2n+1)logq⌉,χ=χ(λ,μ,b) 此处要求最终的参数使得GLWE问题实例具有 2 λ 2^{\lambda} 2λ强度. R = Z [ x ] / ( x d + 1 ) R=\mathbb Z[x]/(x^d+1) R=Z[x]/(xd+1), 并令参数集合 p a r a m s = ( q , d , n , N , χ ) params=(q,d,n,N,\chi) params=(q,d,n,N,χ).
    1. E . S e c r e t K e y G e n ( p a r a m s ) \mathsf{E.SecretKeyGen}(params) E.SecretKeyGen(params): 选择 s χ n \mathbf s'\leftarrow\chi^n s′←χn, 输出 s k = s = ( 1 , s ′ [ 1 ] , ⋯   , s ′ [ n ] ) ∈ R q n + 1 sk=\mathbf s=(1,\mathbf s'[1],\cdots,\mathbf s'[n])\in R_q^{n+1} sk=s=(1,s′[1],⋯,s′[n])∈Rqn+1​.
    1. E . P u b l i c K e y G e n ( p a r a m s , s k ) \mathsf{E.PublicKeyGen}(params,sk) E.PublicKeyGen(params,sk): 均匀选择 A R q N × n \mathbf A'\leftarrow R_q^{N\times n} A′←RqN×n​, 选择 e ← χ N \mathbf e\leftarrow \chi^N e←χN并令 b = A ′ s ′ + 2 e \mathbf b=\mathbf A'\mathbf s'+2\mathbf e b=A′s′+2e. 并令 p k = A = [ b ∣ − A ′ ] pk=\mathbf A=[\mathbf b|-\mathbf A'] pk=A=[b∣−A′]或者 [ b , A ] [\mathbf b,-\mathbf A'] [b,−A′](一个拼装矩阵)。这里 A ⋅ s = 2 e \mathbf A \cdot \mathbf s = 2e A⋅s=2e
    1. E . E n c ( p a r a m s , p k , m { 0 , 1 } ) \mathsf{E.Enc}(params,pk,m\in\{0,1\}) E.Enc(params,pk,m∈{0,1}): m = ( m , 0 , , 0 ) R q n + 1 \mathbf m=(m,0,\cdots,0)\in R_q^{n+1} m=(m,0,⋯,0)∈Rqn+1​, 选择 r R q N \mathbf r\leftarrow R_q^N rRqN​, 输出密文 c = m + A T r R q n + 1 \mathbf c=\mathbf m+\mathbf A^T\mathbf r\in R_q^{n+1} c=m+ATrRqn+1​.
    1. E . D e c ( p a r a m s , s k , c ) \mathsf{E.Dec}(params,sk,\mathbf c) E.Dec(params,sk,c): 输出 m [ [ c , s ] q ] 2 m\leftarrow [[\langle\mathbf c,\mathbf s\rangle]_q]_2 m←[[⟨c,s⟩]q​]2​.

这套基本方案其实就是BV11中描述的,只不过是换了一种形式。

密钥交换(Key Switching)

目的就是为了减小膨胀的密文和密钥。将因为张量积而扩张的大密文和大密钥替换成小密文和小密钥,且保持解密消息基本不变。

理论

先熟悉两个函数

  1. B
  2. i
  3. t
  4. D
  5. e
  6. c
  7. o
  8. m
  9. p
  10. (
  11. )
  12. BitDecomp()
  13. BitDecomp()和
  14. P
  15. o
  16. w
  17. e
  18. r
  19. o
  20. f
  21. 2
  22. (
  23. )
  24. Powerof2()
  25. Powerof2(),在这篇文章的扁平化小节有介绍不熟悉的可以看看。

简单来说,第一个函数的功能是把参数拆成二进制比特,第二个函数的功能是把参数扩张成2的幂次乘以参数的形式,使得内积乘积不变化。

  1. BitDecomp
  2. (
  3. c
  4. ,
  5. q
  6. )
  7. ,
  8. Powersof2
  9. (
  10. s
  11. ,
  12. q
  13. )
  14. =
  15. j
  16. =
  17. 0
  18. log
  19. q
  20. u
  21. j
  22. ,
  23. 2
  24. j
  25. s
  26. =
  27. j
  28. =
  29. 0
  30. log
  31. q
  32. 2
  33. j
  34. u
  35. j
  36. ,
  37. s
  38. =
  39. j
  40. =
  41. 0
  42. log
  43. q
  44. 2
  45. j
  46. u
  47. j
  48. ,
  49. s
  50. =
  51. c
  52. ,
  53. s
  54. \langle\operatorname{BitDecomp}(\mathbf{c}, q), \text { Powersof2}(\mathbf{s}, q)\rangle=\sum_{j=0}^{\lfloor\log q\rfloor}\left\langle\mathbf{u}_{j}, 2^{j} \cdot \mathbf{s}\right\rangle=\sum_{j=0}^{\lfloor\log q\rfloor}\left\langle 2^{j} \cdot \mathbf{u}_{j}, \mathbf{s}\right\rangle=\left\langle\sum_{j=0}^{\lfloor\log q\rfloor} 2^{j} \cdot \mathbf{u}_{j}, \mathbf{s}\right\rangle=\langle\mathbf{c}, \mathbf{s}\rangle
  55. BitDecomp(c,q), Powersof2(s,q)⟩=j=0∑⌊logq⌋​⟨uj​,2js⟩=j=0∑⌊logq⌋​⟨2juj​,s⟩=⟨j=0∑⌊logq⌋​2juj​,s⟩=⟨c,s

密钥交换主要来自[BV11]中的重线性化操作,但作者发现重线性化不仅仅可以通过更换密钥来降低密钥的维数,还可以将第一个密钥下的密文转换成第二个密钥下的密文,而二者加密的消息是相同的,这样可以直接在第二个密钥下进行解密。

密钥交换主要有两个步骤:
第一个算法

  1. S
  2. w
  3. i
  4. t
  5. c
  6. h
  7. K
  8. e
  9. y
  10. G
  11. e
  12. n
  13. (
  14. s
  15. 1
  16. ,
  17. q
  18. ,
  19. n
  20. 1
  21. ,
  22. s
  23. 2
  24. n
  25. 2
  26. )
  27. SwitchKeyGen(\mathbf s_1,q,n_1,\mathbf s_2n_2)
  28. SwitchKeyGen(s1​,q,n1​,s2​,n2​)接收两个密钥向量,向量各自的维数,和共同模数作为输入,输出一些辅助信息
  29. τ
  30. s
  31. 1
  32. s
  33. 2
  34. \tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}}
  35. τs1​→s2​​。第二个算法
  36. S
  37. w
  38. i
  39. t
  40. c
  41. h
  42. K
  43. e
  44. y
  45. (
  46. τ
  47. s
  48. 1
  49. s
  50. 2
  51. ,
  52. c
  53. 1
  54. ,
  55. n
  56. 1
  57. ,
  58. n
  59. 2
  60. ,
  61. q
  62. )
  63. SwitchKey(\tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}},\mathbf c_1,n_1,n_2,q)
  64. SwitchKeys1​→s2​​,c1​,n1​,n2​,q)接收辅助信息和前密钥加密的密文,来输出在后一个密钥下加密的密文。

理解说明:我们要将密钥

  1. s
  2. 1
  3. \mathbf{s}_{1}
  4. s1​下的密文
  5. c
  6. 1
  7. \mathbf{c}_{1}
  8. c1​切换到密钥
  9. s
  10. 2
  11. \mathbf{s}_{2}
  12. s2​下的密文
  13. c
  14. 2
  15. \mathbf{c}_{2}
  16. c2​,就需要先使用
  17. s
  18. 2
  19. \mathbf{s}_{2}
  20. s2​作为私钥,生成一个公钥,将
  21. P
  22. o
  23. w
  24. e
  25. r
  26. s
  27. o
  28. f
  29. 2
  30. (
  31. s
  32. 1
  33. )
  34. Powersof2( \left.\mathbf{s}_{1}\right)
  35. Powersof2(s1​)的每一项
  36. 2
  37. τ
  38. s
  39. 1
  40. [
  41. i
  42. ]
  43. 2^\tau \cdot \mathbf{s}_{1}[i]
  44. 2τ⋅s1​[i]进行加密,把这些密文的集合记作
  45. τ
  46. s
  47. 1
  48. s
  49. 2
  50. \tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}}
  51. τs1​→s2​​,可以看到,之前在BV11方案中密钥是有二次项的,但是这里直接一个
  52. s
  53. 1
  54. \mathbf{s}_{1}
  55. s1​就把所有的一次二次项全部囊括了,只需要简单的理解到
  56. s
  57. 1
  58. =
  59. s
  60. s
  61. \mathbf{s}_{1}=\mathbf{s} \otimes \mathbf{s}
  62. s1​=ss即可。

算法

具体操作如下,

    1. S w i t c h K e y G e n ( s 1 R q n 1 , s 2 R q n 2 ) SwitchKeyGen(\mathbf s_1 \in R_q^{n_1},\mathbf s_2 \in R_q^{n_2}) SwitchKeyGen(s1​∈Rqn1​​,s2​∈Rqn2​​): 首先 A E . P u b l i c k e y G e n ( s 2 , N ) \mathbf{A} \leftarrow E.PublickeyGen \left(\mathbf{s}_{2}, N\right) AE.PublickeyGen(s2​,N), N = n 1 log q N=n_{1} \cdot\lceil\log q\rceil N=n1​⋅⌈logq⌉,这里有 s 2 A = 2 e \mathbf{s}_{2} \cdot \mathbf A = 2e s2​⋅A=2e 接着 B A + P o w e r s o f 2 ( s 1 ) \mathbf{B} \leftarrow \mathbf{A}+ Powersof2( \mathbf{s}_{1}) BA+Powersof2(s1​):也就是把 P o w e r s o f 2 ( s 1 ) Powersof2( \left.\mathbf{s}_{1}\right) Powersof2(s1​)加到 A \mathbf{A} A的第一列,得到矩阵 B \mathbf{B} B,输出 τ s 1 s 2 = B \tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}}=\mathbf{B} τs1​→s2​​=B,可以把 B \mathbf{B} B看成 B = [ P o w e r s o f 2 ( s 1 ) A ] \mathbf{B} = [Powersof2(\mathbf{s}_{1})| \mathbf A] B=[Powersof2(s1​)∣A]或者 B = [ P o w e r s o f 2 ( s 1 ) , A ] \mathbf{B} = [Powersof2(\mathbf{s}_{1}),\mathbf A] B=[Powersof2(s1​),A]
    1. S w i t c h K e y ( τ s 1 s 2 , c 1 ) SwitchKey(\tau_{\mathbf{s}_{1} \rightarrow \mathbf{s}_{2}},\mathbf c_1) SwitchKeys1​→s2​​,c1​): 输出 c 2 = B i t D e c o m p ( c 1 ) T B R q n 2 \mathbf c_2=\mathsf{BitDecomp}(\mathbf c_1)^T\cdot \mathbf B\in R_q^{n_2} c2​=BitDecomp(c1​)TBRqn2​​

正确性验证,

  1. c
  2. 2
  3. ,
  4. s
  5. 2
  6. =
  7. BitDecomp
  8. (
  9. c
  10. 1
  11. )
  12. T
  13. B
  14. s
  15. 2
  16. =
  17. BitDecomp
  18. (
  19. c
  20. 1
  21. )
  22. T
  23. [
  24. Powersof2
  25. (
  26. s
  27. 1
  28. )
  29. ,
  30. A
  31. ]
  32. [
  33. 1
  34. ,
  35. s
  36. 2
  37. ]
  38. T
  39. =
  40. BitDecomp
  41. (
  42. c
  43. 1
  44. )
  45. T
  46. (
  47. 2
  48. e
  49. 2
  50. +
  51. Powersof
  52. 2
  53. (
  54. s
  55. 1
  56. )
  57. )
  58. =
  59. 2
  60. BitDecomp
  61. (
  62. c
  63. 1
  64. )
  65. ,
  66. e
  67. 2
  68. +
  69. BitDecomp
  70. (
  71. c
  72. 1
  73. )
  74. ,
  75. Powersof
  76. 2
  77. (
  78. s
  79. 1
  80. )
  81. =
  82. 2
  83. BitDecomp
  84. (
  85. c
  86. 1
  87. )
  88. ,
  89. e
  90. 2
  91. +
  92. c
  93. 1
  94. ,
  95. s
  96. 1
  97. \begin{aligned} \left\langle\mathbf{c}_{2}, \mathbf{s}_{2}\right\rangle &=\operatorname{BitDecomp}\left(\mathbf{c}_{1}\right)^{T} \cdot \mathbf{B} \cdot \mathbf{s}_{2} \\ &=\operatorname{BitDecomp}\left(\mathbf{c}_{1}\right)^{T} \cdot [\operatorname{Powersof2}(\mathbf{s}_{1}),\mathbf A] \cdot [1,\mathbf {s_2'}]^T\\ &=\operatorname{BitDecomp}\left(\mathbf{c}_{1}\right)^{T} \cdot\left(2 \mathbf{e}_{2}+\operatorname{Powersof} 2\left(\mathbf{s}_{1}\right)\right) \\ &=2\left\langle\operatorname{BitDecomp}\left(\mathbf{c}_{1}\right), \mathbf{e}_{2}\right\rangle+\left\langle\operatorname{BitDecomp}\left(\mathbf{c}_{1}\right), \operatorname{Powersof} 2\left(\mathbf{s}_{1}\right)\right\rangle \\ &=2\left\langle\operatorname{BitDecomp}\left(\mathbf{c}_{1}\right), \mathbf{e}_{2}\right\rangle+\left\langle\mathbf{c}_{1}, \mathbf{s}_{1}\right\rangle \end{aligned}
  98. ⟨c2​,s2​⟩​=BitDecomp(c1​)T⋅B⋅s2​=BitDecomp(c1​)T⋅[Powersof2(s1​),A]⋅[1,s2′​]T=BitDecomp(c1​)T⋅(2e2​+Powersof2(s1​))=2⟨BitDecomp(c1​),e2​⟩+⟨BitDecomp(c1​),Powersof2(s1​)⟩=2⟨BitDecomp(c1​),e2​⟩+⟨c1​,s1​⟩​

由于二进制化了,所以噪声就很小。

模交换(Modulus Switching)

目的是减小噪声,在[BV11]中的模数切换操作仅仅在同态计算结束后使用,并获得一个小的密文。在BGV中是迭代的使用来保持噪声水平基本不变,但是作为牺牲,模数会逐步减小至无法继续计算,也就是说深度基本上由模数来控制了。
如果噪声界限是

  1. B
  2. B
  3. B的话,那么同态乘法会产生
  4. B
  5. 2
  6. B^2
  7. B2的噪声,后续就是双指数级别的增长。模交换的核心就是做一次乘法计算就将噪声
  8. B
  9. 2
  10. B^2
  11. B2削减为
  12. B
  13. B
  14. B,使得噪声基本维持不变,模数就会从
  15. q
  16. L
  17. q^L
  18. qL一直减小到
  19. q
  20. q
  21. q

这就无需bootstrapping也能控制噪声的增长,从而达到一个有限级同态加密。

理论

目标是

  1. [
  2. c
  3. ,
  4. s
  5. ]
  6. q
  7. m
  8. o
  9. d
  10.   
  11. 2
  12. =
  13. [
  14. c
  15. ,
  16. s
  17. ]
  18. p
  19. m
  20. o
  21. d
  22.   
  23. 2
  24. [\langle\mathbf c,\mathbf s\rangle]_q \mod 2=[\langle \mathbf c',\mathbf s\rangle]_p \mod 2
  25. [⟨c,s⟩]q​mod2=[⟨c′,s⟩]p​mod2

类似[BV11]中的一样,从

  1. c
  2. c
  3. c
  4. c
  5. c'
  6. c′的切换只需要缩放一个
  7. (
  8. p
  9. /
  10. q
  11. )
  12. (p/q)
  13. (p/q)并适当的舍入。但是,有个惊人的发现就是如果
  14. s
  15. s
  16. s很短且
  17. p
  18. p
  19. p比
  20. q
  21. q
  22. q小很多,那么噪声也会缩小的。

  1. p
  2. p
  3. p
  4. q
  5. q
  6. q是两个奇数模数,
  7. c
  8. \mathbf c
  9. c是一个整数向量.
  10. c
  11. \mathbf c
  12. c’为一个距离
  13. (
  14. p
  15. /
  16. q
  17. )
  18. c
  19. (p/q)\cdot\mathbf c
  20. (p/q)⋅c最近的一个整数向量满足
  21. c
  22. =
  23. c
  24. m
  25. o
  26. d
  27.   
  28. 2
  29. \mathbf c'=\mathbf c\mod 2
  30. c′=cmod2,同时
  31. p
  32. =
  33. q
  34. m
  35. o
  36. d
  37.   
  38. 2
  39. p = q\mod 2
  40. p=qmod2

我们知道

  1. [
  2. c
  3. ,
  4. s
  5. ]
  6. q
  7. =
  8. c
  9. ,
  10. s
  11. k
  12. q
  13. [\langle\mathbf c,\mathbf s\rangle]_q=\langle\mathbf c,\mathbf s\rangle-kq
  14. [⟨c,s⟩]q​=⟨c,s⟩−kq
  15. [
  16. c
  17. ,
  18. s
  19. ]
  20. p
  21. =
  22. c
  23. ,
  24. s
  25. k
  26. p
  27. [\langle \mathbf c',\mathbf s\rangle]_p =\langle \mathbf c',\mathbf s\rangle-kp
  28. [⟨c′,s⟩]p​=⟨c′,s⟩−kp(模计算可以表示成减去模数的倍数)

由此得到第一个结论

  1. [
  2. [
  3. c
  4. ,
  5. s
  6. ]
  7. p
  8. ]
  9. 2
  10. =
  11. [
  12. c
  13. ,
  14. s
  15. k
  16. p
  17. ]
  18. 2
  19. =
  20. [
  21. c
  22. ,
  23. s
  24. k
  25. q
  26. ]
  27. 2
  28. =
  29. [
  30. c
  31. ,
  32. s
  33. ]
  34. q
  35. m
  36. o
  37. d
  38.   
  39. 2
  40. [[\langle \mathbf c',\mathbf s\rangle]_p]_2=[\langle \mathbf c',\mathbf s\rangle-kp]_2=[\langle\mathbf c,\mathbf s\rangle-kq]_2=[\langle\mathbf c,\mathbf s\rangle]_q \mod 2
  41. [[⟨c′,s⟩]p​]2​=[⟨c′,s⟩−kp]2​=[⟨c,s⟩−kq]2​=[⟨c,s⟩]qmod2

保证了解密时的正确性。

接着因为

  1. s
  2. s
  3. s很小,且
  4. [
  5. c
  6. ,
  7. s
  8. ]
  9. p
  10. =
  11. c
  12. ,
  13. s
  14. k
  15. p
  16. =
  17. c
  18. ,
  19. s
  20. k
  21. q
  22. p
  23. q
  24. =
  25. c
  26. ,
  27. s
  28. +
  29. p
  30. q
  31. (
  32. [
  33. c
  34. ,
  35. s
  36. ]
  37. q
  38. c
  39. ,
  40. s
  41. )
  42. =
  43. c
  44. ,
  45. s
  46. p
  47. q
  48. c
  49. ,
  50. s
  51. +
  52. p
  53. q
  54. [
  55. c
  56. ,
  57. s
  58. ]
  59. q
  60. =
  61. p
  62. q
  63. [
  64. c
  65. ,
  66. s
  67. ]
  68. q
  69. +
  70. c
  71. (
  72. p
  73. q
  74. )
  75. c
  76. ,
  77. s
  78. =
  79. p
  80. q
  81. [
  82. c
  83. ,
  84. s
  85. ]
  86. q
  87. +
  88. s
  89. m
  90. a
  91. l
  92. l
  93. \begin{aligned} [\langle \mathbf c',\mathbf s\rangle]_p =\langle \mathbf c',\mathbf s\rangle-kp &=\langle \mathbf c',\mathbf s\rangle-kq\cdot \frac pq \\ &= \langle \mathbf c',\mathbf s\rangle+\frac pq\cdot ([\langle\mathbf c,\mathbf s\rangle]_q-\langle\mathbf c,\mathbf s\rangle)\\ &=\langle \mathbf c',\mathbf s\rangle - \frac pq \langle\mathbf c,\mathbf s\rangle + \frac pq [\langle\mathbf c,\mathbf s\rangle]_q\\ &=\frac pq\cdot [\langle\mathbf c,\mathbf s\rangle]_q+\langle\mathbf c'-(\frac pq)\mathbf c,\mathbf s\rangle \\ &=\frac pq\cdot [\langle\mathbf c,\mathbf s\rangle]_q+small \end{aligned}
  94. [⟨c′,s⟩]p​=⟨c′,s⟩−kp​=⟨c′,s⟩−kqqp​=⟨c′,s⟩+qp​⋅([⟨c,s⟩]q​−⟨c,s⟩)=⟨c′,s⟩−qp​⟨c,s⟩+qp​[⟨c,s⟩]q​=qp​⋅[⟨c,s⟩]q​+⟨c′−(qp​)c,s⟩=qp​⋅[⟨c,s⟩]q​+small

倒数第二行等式的

  1. c
  2. (
  3. p
  4. q
  5. )
  6. c
  7. \mathbf c'-(\frac pq)\mathbf c
  8. c′−(qp​)c是一个的系数在
  9. (
  10. 1
  11. ,
  12. 1
  13. )
  14. (-1,1)
  15. (−1,1)内的矩阵,所以内积肯定比
  16. 1
  17. (
  18. s
  19. )
  20. \ell_1(s)
  21. ℓ1​(s)要小(
  22. 1
  23. \ell_1
  24. ℓ1​表示一阶范数,即向量每个元素的绝对值之和,它其实可以看作单位矩阵和
  25. s
  26. s
  27. s做内积,对每个维度加上个绝对值)

由此得到第二个结论

  1. [
  2. c
  3. ,
  4. s
  5. ]
  6. p
  7. =
  8. p
  9. q
  10. [
  11. c
  12. ,
  13. s
  14. ]
  15. q
  16. +
  17. c
  18. (
  19. p
  20. q
  21. )
  22. c
  23. ,
  24. s
  25. <
  26. (
  27. p
  28. q
  29. )
  30. [
  31. c
  32. ,
  33. s
  34. ]
  35. q
  36. +
  37. 1
  38. (
  39. s
  40. )
  41. <
  42. q
  43. /
  44. 2
  45. \begin{aligned} |[\langle \mathbf c’,\mathbf s\rangle]_p|&=\frac pq\cdot [\langle\mathbf c,\mathbf s\rangle]_q+\langle\mathbf c'-(\frac pq)\mathbf c,\mathbf s\rangle\\ &<(\frac pq)\cdot |[\langle\mathbf c,\mathbf s\rangle]_q|+\ell_1(\mathbf s)\\ &<q/2 \end{aligned}
  46. ∣[⟨c’,s⟩]p​∣​=qp​⋅[⟨c,s⟩]q​+⟨c′−(qp​)c,s⟩<(qp​)⋅∣[⟨c,s⟩]q​∣+ℓ1​(s)<q/2​

即,噪声也近乎按照比例下降。可做的乘法次数就从对数级别上升到了线性级别(

  1. log
  2. k
  3. k
  4. \log k \rightarrow k
  5. logkk),由此无需自举也能构建有限级加密方案。

在这里插入图片描述

算法

  1. c
  2. S
  3. c
  4. a
  5. l
  6. e
  7. (
  8. c
  9. ,
  10. q
  11. ,
  12. p
  13. ,
  14. r
  15. )
  16. \mathbf c'\leftarrow\mathsf{Scale}(\mathbf c,q,p,r)
  17. c′←Scale(c,q,p,r):获取一个最靠近的整数向量,和前面理论说过的一样。使得后面满足
  18. m
  19. =
  20. [
  21. [
  22. <
  23. c
  24. ,
  25. s
  26. >
  27. ]
  28. q
  29. ]
  30. r
  31. =
  32. [
  33. [
  34. <
  35. c
  36. ,
  37. s
  38. >
  39. ]
  40. p
  41. ]
  42. r
  43. m = [[<\mathbf c,\mathbf s>]_q]_r =[[<\mathbf c',\mathbf s>]_p]_r
  44. m=[[<c,s>]q​]r​=[[<c′,s>]p​]r

同态方案

方案算法:

    1. F H E . S e t u p ( 1 λ , 1 L , b ) \mathsf{FHE.Setup}(1^\lambda,1^L,b) FHE.Setup(1λ,1L,b):1. 输入安全参数、级别数和用来确定用LWE还是RLWE的参数,设 μ = μ ( λ , L , b ) = θ ( log λ + log L ) \mu=\mu(\lambda,L,b)=\theta(\log\lambda+\log L) μ=μ(λ,L,b)=θ(logλ+logL).2. 对于每个 j = L j=L j=L(电路输入层) to 0 \text{ to } 0 to 0(电路输出层):执行 p a r a m s j E . S e t u p ( 1 λ , 1 ( j + 1 ) μ , b ) params_j\leftarrow\mathsf{E.Setup}(1^\lambda,1^{(j+1)\cdot \mu},b) paramsj​←E.Setup(1λ,1(j+1)⋅μ,b), 生成一个阶梯式的模数(从 q L ( ( L + 1 ) μ b i t s ) q_L((L+1)\cdot \mu bits) qL​((L+1)⋅μbits)降低到 q 0 ( μ b i t s ) q_0(\mu bits) q0​(μbits)3. 对于每个 j = L 1 to 0 j=L-1\text{ to } 0 j=L1 to 0 d j = d L d_j=d_L dj​=dL​, χ j = χ L \chi_j=\chi_L χj​=χL​。此外, 每一层的 d , χ d,\chi d,χ参数需要与 L L L层统一, 而维数 n n n则没有这个要求.(这是由于在 q q q变小时, 维数的减少不会影响方案的安全性, 毕竟当 q q q下降时, 维数的减小不会让破解变得容易)
    1. F H E . K e y G e n ( { p a r a m s j } ) \mathsf{FHE.KeyGen}(\{params_j\}) FHE.KeyGen({paramsj​}):1. 对于每个 j = L to 0 j=L\text{ to }0 j=L to 0, 执行: 执行 s j E . S e c r e t K e y G e n ( p a r a m s s j ) \mathbf s_j\leftarrow \mathsf{E.SecretKeyGen}(paramss_j) sj​←E.SecretKeyGen(paramssj​)和 A j E . P u b l i c K e y G e n ( p a r a m s j , s j ) \mathbf A_j\leftarrow\mathsf{E.PublicKeyGen}(params_j,\mathbf s_j) Aj​←E.PublicKeyGen(paramsj​,sj​)2. s j s j s j \mathbf s_j'\leftarrow \mathbf s_j\otimes\mathbf s_j sj′​←sj​⊗sj​。3. 令 s j ′ ′ ← B i t D e c o m p ( s j ′ , q j ) \mathbf s_j''\leftarrow \mathsf{BitDecomp}(\mathbf s_j',q_j) sj′′​←BitDecomp(sj′​,qj​).(以 log q \log q logq位二进制展开)4. τ s j s j 1 S w i t c h K e y G e n ( s j , s j 1 ) \tau_{\mathbf s_{j}''\to\mathbf s_{j-1}}\leftarrow \mathsf{SwitchKeyGen}(\mathbf s_j'',\mathbf s_{j-1}) τsj′′​→sj1​​←SwitchKeyGen(sj′′​,sj1​) (当 j = L j=L j=L时不执行该步骤)。 实际上上述算法中, 我们就生成了每一层的公私钥, 并且做好了每一层的 τ s j s j 1 \tau_{\mathbf s_{j}''\to\mathbf s_{j-1}} τsj′′​→sj1​​。
    1. F H E . E n c ( p a r a m s , p k , m { 0 , 1 } ) \mathsf{FHE.Enc}(params,pk,m\in\{0,1\}) FHE.Enc(params,pk,m∈{0,1}): 计算并输出 E . E n c ( A L , m ) \mathsf{E.Enc}(\mathbf A_L,m) E.Enc(AL​,m).
    1. F H E . D e c ( p a r a m s , s k , c ) \mathsf{FHE.Dec}(params,sk,\mathbf c) FHE.Dec(params,sk,c): 根据密钥的层数选择 s j \mathbf s_j sj​, 计算并输出 E . D e c ( s j , c ) \mathsf{E.Dec}(\mathbf s_j,\mathbf c) E.Dec(sj​,c). 此处我们忽略了确定密文层数的参数来化简表示,原文写的可以使用一个指示参数来指定。

同态计算中要用到模数交换过程和密钥交换过程, 作者将其统一为一个

  1. R
  2. e
  3. f
  4. r
  5. e
  6. s
  7. h
  8. \mathsf{Refresh}
  9. Refresh过程:首先要根据计算密钥的格式, 将乘法(或加法)得到的结果进行
  10. P
  11. o
  12. w
  13. e
  14. r
  15. o
  16. f
  17. 2
  18. \mathsf{Powerof2}
  19. Powerof2操作, 然后依次进行模数切换和密钥切换,即,把一个
  20. s
  21. j
  22. =
  23. s
  24. j
  25. s
  26. j
  27. \mathbf s_j’=\mathbf{s}_j\otimes\mathbf s_j
  28. sj​’=sj​⊗sj​下得密文变为
  29. s
  30. j
  31. 1
  32. \mathbf s_{j-1}
  33. sj1​下得密文.。
    1. F H E . R e f r e s h ( c , τ s j s j 1 , q j , q j 1 ) \mathsf{FHE.Refresh}(\mathbf c,\tau_{\mathbf s_j''\to\mathbf s_{j-1},q_j,q_{j-1}}) FHE.Refresh(csj′′​→sj1​,qj​,qj1​​): 输入的是一个由 s j \mathbf s_{j}' sj′​加密的密文、密钥交换辅助信息,当前层和下一层的模数。 1. 扩张密文,使得密文与密钥的内积不变。计算 c 1 ← P o w e r o f 2 ( c , q j ) \mathbf c_1\leftarrow\mathsf{Powerof2}(\mathbf c,q_j) c1​←Powerof2(c,qj​)(这里能想到 < c 1 , s j ′ ′ > = < c , s j ′ > <\mathbf c_1,\mathbf s_j''> = <\mathbf c , \mathbf s_j'> <c1​,sj′′​>=<c,sj′​> 从前面的二进制转换那里能总结出来)2. 模交换,计算 c 2 S c a l e ( c 1 , q j , q j 1 , 2 ) \mathbf c_2\leftarrow\mathsf{Scale}(\mathbf c_1,q_j,q_{j-1},2) c2​←Scale(c1​,qj​,qj1​,2)3. 密钥交换,计算并输出 c 3 S w i t c h K e y ( τ s j s j 1 , c 2 , q j 1 ) \mathbf c_3\leftarrow \mathsf{SwitchKey}(\tau_{\mathbf s_j’’\to\mathbf s_{j-1}},\mathbf c_2,q_{j-1}) c3​←SwitchKeysj​’’→sj1​​,c2​,qj1​)

最后我们补充完同态借助

  1. R
  2. e
  3. f
  4. r
  5. e
  6. s
  7. h
  8. \mathsf{Refresh}
  9. Refresh完成的同态运算过程(输入的两个密文都是同一个密钥加密出来的):
    1. F H E . A d d ( p k , c 1 , c 2 ) \mathsf{FHE.Add}(pk,\mathbf c_1,\mathbf c_2) FHE.Add(pk,c1​,c2​): 首先计算 c 3 = c 1 + c 2 \mathbf c_3=\mathbf c_1+\mathbf c_2 c3​=c1​+c2​, 再计算输出 c 4 = F H E . R e f r e s h ( c 3 , q j , q j 1 ) \mathbf c_4=\mathsf{FHE.Refresh}(\mathbf c_3,q_j,q_{j-1}) c4​=FHE.Refresh(c3​,qj​,qj1​)。(有需要就调用刷新)
    1. F H E . M u l t ( p k , c 1 , c 2 ) \mathsf{FHE.Mult}(pk,\mathbf c_1,\mathbf c_2) FHE.Mult(pk,c1​,c2​): 首先计算 c 3 \mathbf c_3 c3​, 即由 c 1 , c 2 \mathbf c_1,\mathbf c_2 c1​,c2​所表示的多项式函数相乘得到的多项式函数对应的密文, 再计算并输出 c 4 = F H E . R e f r e s h ( c 3 , q j , q j 1 ) \mathbf c_4=\mathsf{FHE.Refresh}(\mathbf c_3,q_j,q_{j-1}) c4​=FHE.Refresh(c3​,qj​,qj1​)。

最后来看看整个方案的噪声增长:
在这里插入图片描述
在密钥交换和模交换后都会诞生一部分小的噪声,如果在模交换的时候设置模数为

  1. q
  2. q
  3. q,那么乘法后的噪声就是
  4. B
  5. 2
  6. /
  7. (
  8. B
  9. +
  10. s
  11. m
  12. a
  13. l
  14. l
  15. )
  16. B
  17. p
  18. o
  19. l
  20. y
  21. (
  22. n
  23. )
  24. B^2/(B+small)\rightarrow B\cdot poly(n)
  25. B2/(B+small)→Bpoly(n)

参考

同态加密(3) BGV方案

全同态加密:BGV

同态加密(七)无自举的分级全同态加密 1 (Leveled)Fully Homomorphic Encryption without Bootstrapping

Brakerski Z, Gentry C, Vaikuntanathan V. (Leveled) fully homomorphic encryption without bootstrapping[J]. ACM Transactions on Computation Theory (TOCT), 2014, 6(3): 1-36.

全同态加密I:理论与基础


本文转载自: https://blog.csdn.net/qq_43271194/article/details/127647277
版权归原作者 Amire0x 所有, 如有侵权,请联系我们删除。

“(BGV12)同态加密方案初学”的评论:

还没有评论