又称误差还原,容错学习问题,即已知一个矩阵 A A A以及一个向量,求解
b ^ = A x + e \hat{b}=A x+e b^=Ax+e
这里 e e e是一个固定数值范围内随机采集的一个随机噪音向量,所以这个问题就转化为通过 A A A和 b ^ \hat{b} b^来还原最初的未知向量 x x x
可以理解为:需要找到一组系数,使得一组基向量的线性组合无线逼近目标向量,使用噪音误差的大小来定义我们需要距离目标向量有多近。
分类
一般分为两类,决策LWE(简称为DLWE)的设定和搜索LWE(简称为SLWE)基本相同。唯一不同的是,SLWE最后的问题是需要我们找到 s s s,而DLWE只需要让我们辨别看到的 b ^ = A s + e \hat b = As+e b^=As+e到底是LWE问题中的误差乘积还是一个随机生成的向量。
关键概念
L W E ( n , m , q , x B ) : S e a r c h V e r s i o n L e t A ← R Z q m × n , s ← R Z q n , e ← R x B G i v e n ( A , A s + e ) , f i n d s ′ ∈ Z q n s . t . ∥ A s ′ − ( A s + e ) ∥ ∞ ≤ B LWE\left(n, m, q, x_{B}\right): Search Version\\ Let A \stackrel{R}{\leftarrow} \mathbb{Z}_{q}^{m \times n}, s \stackrel{R}{\leftarrow} \mathbb{Z}_{q}^n, e \stackrel{R}{\leftarrow} x_{B} \\ Given (A, A s+e) , find s^{\prime} \in \mathbb{Z}_{q}^{n} s.t. \left\|A s^{\prime}-(A s+e)\right\|_{\infty} \leq B LWE(n,m,q,xB):SearchVersionLetA←RZqm×n,s←RZqn,e←RxBGiven(A,As+e),finds′∈Zqns.t.∥As′−(As+e)∥∞≤B
帮助理解:
这里开始定义了四个重要的参数,
结合各个参数的含义,则LWE问题的定义就是给定矩阵 A A A与误差乘积 A s + e As+e As+e,如何能够搜索出(search)一个合理的 A s ′ As^{\prime} As′,使得得到的向量和问题给定的 A s + e As+e As+e之间的误差不能超过误差上限 B B B。
可以理解为:给定矩阵 A A A以及带有误差的结果 A s + e As+e As+e还原出未知的向量 s s s。
来看看这些个参数会如何影响LWE问题的难度
在解决证明一个困难问题的安全性的时候,我们一般都会使用决策版本的LWE问题(Decisional LWE)
L W E ( n , m , q , x B ) : D e c i s i o n a l V e r s i o n Let A ← R Z q m × n , s ⟵ R Z q n , e ← R x B , v ⟵ R Z q m . D i s t i n g u i s h ( A , A s + e ) f r o m ( A , v ) . L W E\left(n, m, q, x_{B}\right) : Decisional Version\\ \operatorname{Let} A \stackrel{R}{\leftarrow} \mathbb{Z}_{q}^{m \times n}, s \stackrel{R}{\longleftarrow} \mathbb{Z}_{q}^n, e \stackrel{R}{\leftarrow} x_{B}, v \stackrel{R}{\longleftarrow} \mathbb{Z}_{q}^{m} .\\ Distinguish (A, A s+e) from (A, v) . LWE(n,m,q,xB):DecisionalVersionLetA←RZqm×n,s⟵RZqn,e←RxB,v⟵RZqm.Distinguish(A,As+e)from(A,v).
只能看到两个值, A A A和 b ^ \hat b b^,需要辨别出看到的到底是一个LWE问题实例 b ^ = A s + e \hat b = As+e b^=As+e,还是一个随机变量 v v v
由于LWE问题本身就是困难的,所以从 A s + e As+e As+e中提取出未知变量 x x x来是很困难的,也就是,在我们眼中 A s + e As+e As+e和一个随机变量其实没多大区别,没法获取有价值的信息。
一般来说参数一个个生成比较费力,所以一般都指定一个参数例如 n n n然后交给一个函数 f ( n ) f(n) f(n)来生成其他参数的输出,只要保证参数生成符合要求即可。
LWE加密的本质思想是,把消息明文 m m m(0或1)叠加到随机均匀的LWE实例 < a , s > + e +e <a,s>+e上,就像one-time-pad一样,叠加后的结果与随机均匀选取的数区分不出来。
由于 < a , s > + e ∈ Z q +e \in \mathbb{Z_q} <a,s>+e∈Zq,因此它的值在 ( − q / 2 , q / 2 ] (-q/2,q/2] (−q/2,q/2]之间。
注意,这里的模运算是取的中心模。一般的模运算采用的是向下取整,也就是 a m o d p = a − ⌊ a / p ⌋ ∗ p a \mod p = a- \lfloor a/p \rfloor * p amodp=a−⌊a/p⌋∗p。故模 p p p的通常范围是 [ 0 , p − 1 ] [0,p-1] [0,p−1],而中心模使用的是 a m o d p = a − ⌈ a / p ⌋ ∗ p a \mod p = a- \lceil a/p \rfloor * p amodp=a−⌈a/p⌋∗p,使用的最近整数。顾故,模p的范围是 ( − p / 2 , p / 2 ] (-p/2,p/2] (−p/2,p/2]。可以把中心模看作是将 ( p / 2 , p ] (p/2,p] (p/2,p]映射到 ( − p / 2 , 0 ] (-p/2,0] (−p/2,0]上面。
然后将 ( − q / 2 , q / 2 ] (-q/2,q/2] (−q/2,q/2]看作一个有限环域,当需要加密一个bit的时候,把这个bit映射到环上去,0代表环的一头(即0),1代表环的另一头(即q/2),这就相当于对消息进行编码。我们叠加的噪音就等于是把这个映射的点往上或者往下位移了一部分,这样只要噪音的大小不过分(低于q/4),我们就可以通过看这个值到底在环的哪一侧来判断这个bit的具体取值了。但是一旦叠加噪音超过了临界值,那么就无法判断bit的值了。假如,噪音变大了,就有可能导致误差上限超过临界值,一旦超过,那么0和1极有可能映射到相同的点上去,那就导致解密失败。
当然,消息也可以是一个有限数值,如 m ∈ Z t m \in \mathbb{Z_t} m∈Zt,同样可以把消息空间映射到有限环域 Z q Z_q Zq上。思路如下,
这里的 m + e m+e m+e,由于带有噪声叠加,所以是没法直接解密的,也不能像比特加密一样单纯的映射到两个点周围。那么这里的加密就需要把 m m m搬到 Z q \mathbb{Z_q} Zq的高位上,相当于把 m m m放大了 q / t q/t q/t倍,即,把长度为 t t t的从地位端挪到了模 q q q的高位端。这样噪声因为比较小就会留在低位,这样明文和噪声分离,就容易解出明文。
由此,私钥加密算法如下,
私钥: s ← Z q n s \leftarrow \mathbb{Z_q^n} s←Zqn
消息: m ← Z t m m \leftarrow \mathbb{Z_t^m} m←Ztm
LWE参数: A ← Z q m × n A \leftarrow \mathbb{Z_q^{m \times n}} A←Zqm×n和向量 e ← χ m e \leftarrow \chi^m e←χm,计算 b = A s + e m o d q b = As+e \mod q b=As+emodq
加密: ( A , c = ⌊ q / t ⌋ ⋅ m + b ) (A,c=\lfloor q/t \rfloor \cdot m +b ) (A,c=⌊q/t⌋⋅m+b)
解密: ⌊ t q ( c − A s ) m o d q ⌉ m o d t \lfloor \dfrac{t}{q}(c-As) \mod q \rceil \mod t ⌊qt(c−As)modq⌉modt
令 ⌊ q / t ⌋ = q / t − △ \lfloor q/t \rfloor= q/t - \triangle ⌊q/t⌋=q/t−△,其中 0 ≤ △ < 1 0\le \triangle <1 0≤△<1,解密时, c − A s = t q m + ( e − △ m ) c-As = \dfrac{t}{q}m+(e-\triangle m) c−As=qtm+(e−△m),当噪声 ( e − △ m ) (e-\triangle m) (e−△m)小于 q / 2 t q/2t q/2t时,就近取整好就能正确还原 m m m。当 t = 2 t=2 t=2的时候就是对比特加密。
帮助理解:把 t t t这么长的消息空间,映射到 q q q这么长的环上去,等价于把 q q q直接 t t t等分,每一份代表一个值,(例如 t = 2 t=2 t=2就是把 q q q一分为二, t = 4 t=4 t=4就是把q一分为四),此时要想解密不出错,那么肯定要 m + e m+e m+e这个值在一份 q / t q/t q/t里面,这样才能正确解密,因为有个就近取整的四舍五入操作,所以 e e e不能大于一份 q / t q/t q/t的一半,即 e < ( q / t ) / 2 e<(q/t)/2 e<(q/t)/2。
这是一个基于DLWE(决策性LWE问题)的格密码学中的公钥加密系统,对比特加密
具体内容
正确性验证
将解密部分计算展开
x ~ = c 1 − c 0 ⋅ s = r T b + q / 2 ⋅ x − r T A s = r T ( A s + e ) − r T A s + q / 2 ⋅ x = r T e + q / 2 ⋅ x \begin{array}{c} \tilde{x}=c_{1}-c_{0} \cdot s \\ =r^{T} b+q / 2 \cdot x-r^{T} A s \\ =r^{T}(A s+e)-r^{T} A s+q / 2 \cdot x \\ =r^{T} e+q / 2 \cdot x \end{array} x~=c1−c0⋅s=rTb+q/2⋅x−rTAs=rT(As+e)−rTAs+q/2⋅x=rTe+q/2⋅x
环LWE问题是LWE问题在环上的版本,不同的是 A A A和 s s s的选取是在多项式环上。
多项式环 R q = Z q [ x ] / f ( x ) R_q= \mathbb{Z_q}[x]/f(x) Rq=Zq[x]/f(x),表示每次计算后都要对多项式系数模 q q q,对多项式模 f ( x ) f(x) f(x)。它其中的每个元素都是由 Z q \mathbb{Z_q} Zq中的 q q q个元素组成,每一次操作都相当于对 q q q个元素进行操作,也就是能够一次加密多个比特的明文,对比LWE每次仅能对一个比特操作来说能够大大提高效率满足实际需要。
同样,它也有两个版本,即search 和 decision。
先定义一些参数,安全参数 n n n,模 q = q ( n ) ≥ 2 q = q(n)\ge 2 q=q(n)≥2, f ( x ) = x d + 1 f(x) = x^d +1 f(x)=xd+1其中 d = d ( n ) d = d(n) d=d(n)是2的幂次, R = Z [ x ] / f ( x ) R = \mathbb{Z}[x]/f(x) R=Z[x]/f(x), R q = Z q [ x ] / f ( x ) R_q = \mathbb{Z}_q[x]/f(x) Rq=Zq[x]/f(x), χ \chi χ是 R R R上的错误概率分布。
随机选取 s ← R q s \leftarrow R_q s←Rq, a i ← R q a_i \leftarrow R_q ai←Rq,噪声 e i ← χ e_i \leftarrow \chi ei←χ,令 b i = a i ⋅ s + e i b_i = a_i \cdot s +e_i bi=ai⋅s+ei,其中 i = 1 , … , m i=1,\ldots,m i=1,…,m
简述就是,给定 m m m个 ( a i , b i ) (a_i,b_i) (ai,bi),求解出秘密元素 s ← R q s \leftarrow R_q s←Rq。
区分 m m m个随机均匀选取自 R q × R q R_q \times R_q Rq×Rq的 ( a i , b i ) (a_i,b_i) (ai,bi)和m个 ( a i , b i = a i ⋅ s + e i ) (a_i,b_i = a_i \cdot s+e_i) (ai,bi=ai⋅s+ei),其中 a i ← R q a_i \leftarrow R_q ai←Rq,噪声 e i ← χ e_i \leftarrow \chi ei←χ。
S e c r e t K e y G e n ( 1 λ ) SecretKeyGen(1_{\lambda}) SecretKeyGen(1λ):随机均匀选取 s k = s ← R q sk = s \leftarrow R_q sk=s←Rq。
P u b l i c K e y G e n ( s k ) PublicKeyGen(sk) PublicKeyGen(sk):随即均匀选取 a ← R q a \leftarrow R_q a←Rq,噪声 e 1 ← χ e_1 \leftarrow \chi e1←χ,计算 b = a ⋅ s + e 1 b = a \cdot s +e_1 b=a⋅s+e1, p k = ( b , a ) ∈ R q × R q pk = (b,a) \in R_q \times R_q pk=(b,a)∈Rq×Rq。
E n c ( p k , m ) Enc(pk,m) Enc(pk,m):加密 n n n位消息 m ∈ { 0 , 1 } n m \in \{0,1\}^n m∈{0,1}n,把它看作多项式 m ∈ R 2 m \in R_2 m∈R2的系数。随机选择 e 2 , e 3 , e 4 ← χ e_2,e_3,e_4 \leftarrow \chi e2,e3,e4←χ,输出密文 ( c 1 , c 2 ) (c_1,c_2) (c1,c2)。其中
c 1 = ⌊ q / 2 ⌋ ⋅ m + b e 2 + e 3 ∈ R q c 2 = a e 2 + e 4 ∈ R q c_1= \lfloor q/2 \rfloor \cdot m+be_2+e_3 \in R_q \\ c_2=ae_2+e_4 \in R_q c1=⌊q/2⌋⋅m+be2+e3∈Rqc2=ae2+e4∈Rq
D e c ( c , s k ) Dec(c,sk) Dec(c,sk):计算
m = ⌊ 2 q [ ( c 1 − c 2 ⋅ s ) m o d q ] ⌉ m o d 2 ⌊ 2 q [ < c , s > ] m o d q ⌉ m o d 2 m = \lfloor \frac{2}{q}[(c_1-c_2\cdot s)\mod q] \rceil \mod 2 \lfloor \frac{2}{q}[
解密的正确性
c 1 − c 2 s = ⌊ q / 2 ⌋ ⋅ m + b e 2 + e 3 − ( a e 2 s + e 4 s ) = ⌊ q / 2 ⌋ ⋅ m + e 1 e 2 + e 3 − e 4 s \begin{aligned} c_1-c_2s &= \lfloor q/2 \rfloor \cdot m+be_2+e_3-(ae_2s+e_4s) \\ &=\lfloor q/2 \rfloor \cdot m+e_1e_2+e_3-e_4s \end{aligned} c1−c2s=⌊q/2⌋⋅m+be2+e3−(ae2s+e4s)=⌊q/2⌋⋅m+e1e2+e3−e4s
可以看到噪声 e ∗ = e 1 e 2 + e 3 − e 4 s e^* = e_1e_2+e_3-e_4s e∗=e1e2+e3−e4s,当噪声小于 ⌊ q / 2 ⌋ / 2 \lfloor q/2 \rfloor/2 ⌊q/2⌋/2时,解密正确
噪声是偶数的形式,可以通过模2直接消除。
S e c r e t K e y G e n ( 1 λ ) SecretKeyGen(1_{\lambda}) SecretKeyGen(1λ):随机均匀选取 s k = s ← R q sk = s \leftarrow R_q sk=s←Rq。
P u b l i c K e y G e n ( s k ) PublicKeyGen(sk) PublicKeyGen(sk):随即均匀选取 a 1 ← R q a_1 \leftarrow R_q a1←Rq,噪声 e 1 ← χ e_1 \leftarrow \chi e1←χ,计算 b = a ⋅ s + 2 e 1 b = a \cdot s +2e_1 b=a⋅s+2e1, p k = ( b , a ) ∈ R q × R q pk = (b,a) \in R_q \times R_q pk=(b,a)∈Rq×Rq。
E n c ( p k , m ) Enc(pk,m) Enc(pk,m):加密 n n n位消息 m ∈ { 0 , 1 } n m \in \{0,1\}^n m∈{0,1}n,把它看作多项式 m ∈ R 2 m \in R_2 m∈R2的系数。随机选择 e 2 , e 3 , e 4 ← χ e_2,e_3,e_4 \leftarrow \chi e2,e3,e4←χ,输出密文 ( c 1 , c 2 ) (c_1,c_2) (c1,c2)。其中
c 1 = m + b e 2 + 2 e 3 ∈ R q c 2 = a e 2 + 2 e 4 ∈ R q c_1= m+be_2+2e_3 \in R_q \\ c_2=ae_2+2e_4 \in R_q c1=m+be2+2e3∈Rqc2=ae2+2e4∈Rq
D e c ( c , s k ) Dec(c,sk) Dec(c,sk):计算
m = [ ( c 1 − c 2 ⋅ s ) m o d q ] m o d 2 m =[(c_1-c_2\cdot s)\mod q] \mod 2 m=[(c1−c2⋅s)modq]mod2
解密的正确性
c 1 − c 2 s = m + b e 2 + 2 e 3 − ( a e 2 s + 2 e 4 s ) = m + 2 e 1 e 2 + 2 e 3 − 2 e 4 s \begin{aligned} c_1-c_2s &= m+be_2+2e_3-(ae_2s+2e_4s) \\ &=m+2e_1e_2+2e_3-2e_4s \end{aligned} c1−c2s=m+be2+2e3−(ae2s+2e4s)=m+2e1e2+2e3−2e4s
可以看到噪声 e ∗ = 2 e 1 e 2 + 2 e 3 − 2 e 4 s e^* = 2e_1e_2+2e_3-2e_4s e∗=2e1e2+2e3−2e4s,模2的时候噪声就可以直接消除。
格密码学与LWE问题(强推!)
《全同态加密从理论到实践》陈智罡
格密码之Ring-LWE (section 1)
李孟天. 基于环LWE的全同态加密方案关键技术研究[D].战略支援部队信息工程大学,2018.