@格密码学习笔记 从初学到脱发
在学习格之前,也需要一些数论基础知识(还没更新到)
首先,我们为什么需要使用(学习)格密码?
格密码 | 一般密码 |
---|---|
可证明安全 | 并非都可证明 |
安全基于最糟糕问题 | 安全基于平均情况的困难 |
困难性基于格困难问题 | 困难性基于整数分解,离散对数等 |
(暂时)不会被量子算法所破解 | 已存在有效算法 |
计算开销少 | 模指数,离散对数等计算开销大 |
注:
- 并非所有的现代密码都属于严格可证明安全
- 例如RSA等基于整数分解的问题,我们都知道n=pq是大素数就行,但是p,q的选择是一个很复杂的问题,因为其中一些素数组合对分解而言存在问题,这也是为什么我们会看到有些文中出现了安全素数这一概念,而随着数学家的深入研究,安全素数也并非绝对安全。可能我们所选取的整数分解中存在10%的漏洞,所以我们所采用的安全规约实际上是规约到平均难度上的。而格密码采用的是基于最糟糕情况的困难,也就是说,破解了一个问题,就能破解整个系统。这对于密码设计来说,我们能够更清楚的了解系统的安全性。
- 格困难问题研究时间向较于整数分解等出现时间短,其破解有限算法并不多。
格的基础知识
定义1: 格(Lattice) 给定 n n n个线性无关向量 b 1 , b 2 , … , b n ∈ R m b_1,b_2,\dots, b_n\in \mathbb{R}^m b1,b2,…,bn∈Rm,由该组向量产生的格被定义为,
L ( 1 , b 2 , … , b n ) = { ∑ x i b i ∣ x i ∈ Z } \mathcal{L}(_1,b_2,\dots, b_n)=\{\sum x_ib_i|x_i\in\mathbb{Z}\} L(1,b2,…,bn)={∑xibi∣xi∈Z}
我们通常将向量组 b 1 , b 2 , … , b n b_1,b_2,\dots, b_n b1,b2,…,bn称为格的一组基,空间维数m为格的维,基向量个数n称为格的秩,同一个格可以有多组不同的基,但基的维数相同。当m=n时格是满秩的,一般只讨论满秩的格。
定义2: 格空间(Span) 格
L
(
B
)
\mathcal{L}(B)
L(B)中基向量的所有线性组合(linear combinations)所形成的集合,就叫做这组基向量所构成的空间(SPAN),
s
p
a
n
(
L
(
B
)
)
=
s
p
a
n
(
B
)
=
{
B
y
∣
y
∈
R
n
}
.
span(\mathcal{L}(B))=span(B)= \{ By|y\in\mathbb{R}^n \}.
span(L(B))=span(B)={By∣y∈Rn}.
定义3: 格基础区域(Fundamental Parallelepiped).对于任意格基
B
B
B,定义
P
(
B
)
=
{
B
x
∣
x
∈
R
n
,
∀
i
:
0
≤
x
i
<
1
}
\mathcal{P}(B)=\{Bx|x\in\mathbb{R}^n,\forall i:0\le x_i \lt 1\}
P(B)={Bx∣x∈Rn,∀i:0≤xi<1}
注意:由向量生成的基础区域不应该包含除原点外的任何顶点
引理1: 设 Λ \Lambda Λ为秩为 n n n的格,设 b 1 , b 2 , … , b n ∈ Λ b_1,b_2,\dots, b_n\in \Lambda b1,b2,…,bn∈Λ为 n n n个线性无关的格向量。其中, b 1 , b 2 , … , b n b_1,b_2,\dots, b_n b1,b2,…,bn表示为 Λ \Lambda Λ的基,当且仅当 P ( b 1 , b 2 , … , b n ) ⋂ Λ = 0 \mathcal{P}(b_1,b_2,\dots, b_n) \bigcap \Lambda=0 P(b1,b2,…,bn)⋂Λ=0.
- Λ \Lambda Λ是所有整数线性组合的集合。
- 而 P ( b 1 , b 2 , … , b n ) \mathcal{P}(b_1,b_2,\dots, b_n) P(b1,b2,…,bn)被定义为 b 1 , b 2 , … , b n b_1,b_2,\dots, b_n b1,b2,…,bn线性组合的集合,其系数取值在 [ 0 , 1 ) [0,1) [0,1)中。
所以,这两个集合的交集是{0}。
定义4: 幺模矩阵(unimodular matrix). 假设矩阵
U
∈
Z
n
×
n
U\in \mathbb{Z}^{n\times n}
U∈Zn×n,且
∣
U
∣
=
±
1
|U|=\pm1
∣U∣=±1,则称
U
U
U为幺模矩阵。例如矩阵
(
1
1
1
0
)
\begin{pmatrix} 1 &1 \\1&0 \end{pmatrix}
(1110)
引理2 如果 U U U是幺模矩阵,则 U − 1 U^{-1} U−1也是幺模矩阵。
引理3 若两个格基 B 1 , B 2 ∈ R n × n B_1,B_2 \in \mathbb{R}^{n \times n} B1,B2∈Rn×n 等价,当且仅当 B 2 = B 1 U B_2=B_1U B2=B1U,其中 U U U表示某个特定幺模矩阵。
这一步我们可以换个思路来理解,将幺模矩阵理解为一种的初等行变换的形式,而这样的变换不会改变行列式的特征值。
因此 我们可以得到:
引理4 两个格基 b i , b j b_i,b_j bi,bj等价时,当且仅当一个可以通过以下操作得到另一个格基:
- b i ← b i + k b j b_i \leftarrow b_i+kb_j bi←bi+kbj,其中 k ∈ Z k\in\mathbb{Z} k∈Z
- b i ⟺ b j b_i \iff b_j bi⟺bj
- b i ← − b j b_i \leftarrow -b_j bi←−bj
定义5 行列式(Determinant). 设 Λ = L ( B ) \Lambda=\mathcal{L}(B) Λ=L(B)为秩 n n n的格。定义 Λ \Lambda Λ的行列式为 d e t ( Λ ) det(\Lambda) det(Λ),作为 P ( B ) \mathcal{P}(B) P(B)的 n n n维度体积。 d e t ( Λ ) : = d e t ( B T B ) det(\Lambda):=\sqrt{det(B^TB)} det(Λ):=det(BTB)。在 Λ \Lambda Λ是满格的情况下, B B B是方阵,则有 d e t ( Λ ) = ∣ d e t ( B ) ∣ det(\Lambda)=|det(B)| det(Λ)=∣det(B)∣。
行列式代表了多面体的体积,也代表了格点的密度。
定义6 连续极小 (Successive Minima),令 λ 1 ( L ) \lambda_1(\mathcal{L}) λ1(L)表示为格 L \mathcal{L} L中( ℓ 2 \ell_2 ℓ2)长度的最短的非零向量集合。
定义7: 施密特正交化(Schmidt orthogonalization)是求欧氏空间正交基的一种方法。从欧氏空间任意线性无关的向量组α1,α2,……,αm出发,求得正交向量组β1,β2,……,βm,使由α1,α2,……,αm与向量组β1,β2,……,βm等价,再将正交向量组中每个向量经过单位化,就得到一个标准正交向量组,这种方法称为施密特正交化。
这种方法输出了一个正交向量的集合。且经过施密特正交基可以生成一个基本区域(fundamental region
)
引理1: 由
(
v
1
,
…
,
v
n
)
(v_1,\dots,v_n)
(v1,…,vn)所组成的格的行列式为
∏
∣
∣
v
i
~
∣
∣
\prod||\tilde{v_i}||
∏∣∣vi~∣∣.
引理2:
λ
1
\lambda_1
λ1 的下界为
m
i
n
∣
∣
v
i
~
∣
∣
min ||\tilde{v_i}||
min∣∣vi~∣∣
Blichfeld’s Theorem: 对于任意一个格
L
\mathcal{L}
L和体积大于
d
e
t
(
L
)
det(\mathcal{L})
det(L)集合
S
S
S,存在
z
1
,
z
2
∈
S
,
z
1
≠
z
2
z_1,z_2 \in S,z_1 \ne z_2
z1,z2∈S,z1=z2 则
z
1
−
z
2
∈
L
z_1-z_2 \in \mathcal{L}
z1−z2∈L
这个比较好理解,若图中袋鼠的体积大于基本区域,那么我们按照格向量平移后,他会存在与相邻两个图像的交点,这两个交点的差便是我们的平移向量。
Minkowsi’s Theorem: 对任意的格
L
\mathcal{L}
L和关于原点对称的凸集合
S
S
S,且
S
S
S的体积大于
2
n
d
e
t
(
L
)
2^ndet(\mathcal{L})
2ndet(L),
S
S
S中一定存在一个格点。
我们先将这个多边形缩小
2
n
2^n
2n倍(每个维度缩小2倍,即仍然满足小多边形
S
′
S'
S′的体积大于
d
e
t
(
L
)
det(\mathcal{L})
det(L)),我们从Blichfeld’s Theorem可得
S
′
S'
S′中一定存在
z
1
−
z
2
z_1-z_2
z1−z2为格向量,当我们把
z
1
z_1
z1和
z
2
z_2
z2放大2倍后,可知
2
z
1
,
2
z
2
2z_1,2z_2
2z1,2z2在大集合
S
S
S里面,取
2
z
1
−
2
z
2
2z_1-2z_2
2z1−2z2向量的平均值一定也在
S
S
S中,所以红点一定是格点。
推论: 对任意的格 L \mathcal{L} L, λ 1 ( L ) ≤ n ⋅ d e t ( L ) 1 n \lambda_1(\mathcal{L}) \le \sqrt{n}\cdot det(\mathcal{L})^{\frac{1}{n}} λ1(L)≤n⋅det(L)n1
从上面可以看出格的定义和向量空间类似,但通过基生成向量时要求整数系数。这一点使得格在几何上由离散且呈周期性结构的点构成,这大概也是“格”这个名字的由来。具备直观感受的格的维度是2或者3,即可对应生活中可感知的几何空间,但在密码学中为了达到足够安全性,格的维度一般在1000左右。
格上困难问题
最短向量问题 SVP
最短向量问题即,给定格的一个基,在格中找到一个非零向量,其长度在所有非零格向量上最短。
这里的长度我们用欧几里德范数表示,也可以称作 ℓ 2 \ell_2 ℓ2范数,定义为 ∥ x ∥ 2 = ∑ x i 2 \|x\|_2 = \sqrt {\sum x_i^2} ∥x∥2=∑xi2。通常,我们会直接用 ∥ x ∥ \|x\| ∥x∥表示 ℓ 2 \ell_2 ℓ2范数。但是,有一些情况,我们也会使用到其他的范数,如 ℓ 1 \ell_1 ℓ1范数( ∥ x ∥ 1 = ∑ ∣ x i ∣ \|x\|_1 = \sum |x_i| ∥x∥1=∑∣xi∣)和 ℓ ∞ \ell_\infin ℓ∞范数( ∥ x ∥ ∞ = m a x { ∣ x i ∣ } \|x\|_\infin = max\{ |x_i|\} ∥x∥∞=max{∣xi∣})。
- 最短向量问题(Shortest Vector Problem,SVP): 给定格基 B ∈ Z m × n B\in\mathbb{Z}^{m \times n} B∈Zm×n ,找一个非零向量 v v v,满足 ∀ u ∈ L ( B ) \forall u\in \mathcal{L(B)} ∀u∈L(B),都有 ∥ v ∥ ≤ ∥ u ∥ \|v\|\le\|u\| ∥v∥≤∥u∥。
- γ − \gamma- γ−近似最短问题(SVP- γ \gamma γ): 给定格基 B ∈ Z m × n B\in\mathbb{Z}^{m \times n} B∈Zm×n ,找一个非零向量 v v v,满足 ∀ u ∈ L ( B ) \forall u\in \mathcal{L(B)} ∀u∈L(B),都有 ∥ v ∥ ≤ γ ∥ u ∥ \|v\|\le\gamma\|u\| ∥v∥≤γ∥u∥。
- G a p S V P γ GapSVP_\gamma GapSVPγ:给定格基后,判定 λ 1 \lambda_1 λ1是否小于1或大于 γ \gamma γ
- S I V P γ SIVP_\gamma SIVPγ(最短独立向量问题):给定矩阵 B B B,找出 n n n个 L ( B ) \mathcal{L}(B) L(B)中长度小于等于 γ λ n ( L ( B ) ) \gamma\lambda_n(\mathcal{L}(B)) γλn(L(B))线性无关的向量
- 逐次最小长度问题(Successive Minima Problem,SMP)
以上这些概念,都源于刚说的空间内放置球体的问题。确定球的最大格堆积密度(堆积半径下体积/容积)等价于求格的最短向量(SVP)长度,确定球的最小格覆盖密度(覆盖密度下体积/容积)则等价于求到格点的最近距离(CVP)。
最近向量问题 CVP
给定一个格基和一个目标向量,找到离目标点最近的格点。
- C V P γ CVP_\gamma CVPγ:给定格 B B B和点 v v v,找出里点 v v v最近的一个格点,且距离小于系数 γ \gamma γ倍
- Decisional CVP:假设格基 B ∈ Z m × n B\in\mathbb{Z}^{m\times n} B∈Zm×n,目标向量为 t ∈ Z m t\in\mathbb{Z}^m t∈Zm,有理数 r ∈ Q r\in\mathbb{Q} r∈Q,判断 d i s t ( t , L ( B ) ) dist(t,\mathcal{L}(B)) dist(t,L(B))是否正确。
- Optimization CVP:给定一个格基 B ∈ Z m × n B\in\mathbb{Z}^{m \times n} B∈Zm×n和目标向量 t ∈ Z m t \in \mathbb{Z}^{m} t∈Zm,找到 d i s t ( t , L ( B ) ) dist(t,\mathcal{L}(B)) dist(t,L(B))。
- Search CVP:给定格基 B ∈ Z m × n B \in \mathbb{Z}^{m \times n} B∈Zm×n和目标向量 t ∈ Z m t \in \mathbb{Z}^{m} t∈Zm,使得 ∣ ∣ B x − t ∣ ∣ ||Bx-t|| ∣∣Bx−t∣∣最小。
注:对于任意近似影子 γ \gamma γ而言,SVP问题不比CVP问题难。也就是说,如果你能够解决CVP问题,那么你也能在近似因子等于10的条件下解决SVP问题。
BDD困难问题
BDD(Bounded Distance Decoding):给出一个点 v v v已经是与格点很近( l e n g t h < λ 1 ( L ( B ) length<\lambda_1(\mathcal{L}(B) length<λ1(L(B)/2)的点,找出最近的格点(这个格点只有一个解)
LWE困难问题
照着知乎大佬Steven Yue的博客定义:LWE的search版本定义如下:
我也不知道这篇我看懂没得,我就在里面再消化。
若我们已知一个矩阵
A
x
=
b
Ax=b
Ax=b,我们可以利用高斯消元的过程,很快的进行求解对吧。那如果我们加入噪音呢?即给出
b
^
=
A
x
+
e
\hat{b}=Ax+e
b^=Ax+e。其中
e
e
e暂时理解为普通噪音,那么是否能够通过
b
^
\hat{b}
b^和矩阵
A
A
A求得未知向量
x
x
x。因为噪音的缘故,再利用高斯消元法可能导致最终的结果相差甚远,所以我们能做的也就只有通过暴力破解,不断的代入我们猜测的
x
^
\hat{x}
x^然后减去
b
^
\hat{b}
b^(
A
x
+
e
−
A
x
^
Ax+e-A\hat{x}
Ax+e−Ax^)看得到的值是否足够小。
ps.如果我们把这里的 A A A看做格基, b ^ \hat{b} b^看做目标向量,而 e e e是一个极小值,求格点 x x x。给定格基和目标向量,求距离目标最近的格点。还是有点像CVP问题哈。
当然,上面是Search版本。作为公钥密码而言,一般会利用Decisional版本。Search和Decisional版本的区别是什么呢?个人理解而言,search版本我们是search
到
x
x
x这一个值,即求解。而Decisional版本类似密文不可区分性?也就是说,给定了一个LWE实例
A
s
+
e
As+e
As+e,我们区分这个是随机产生的还是由矩阵
A
A
A产生的。
经典算法
Regev算法
- K e y G e n ( 1 λ ) KeyGen(1^\lambda) KeyGen(1λ):通过安全参数 λ \lambda λ确定 n n n,然后依次算出 m , q , B m,q,B m,q,B(因为 m , q , B m,q,B m,q,B的生成通常关于一个 P o l y ( n ) Poly(n) Poly(n))。然后随机算去LWE问题所需的举证 A ← Z q m × n , s ← Z q n , e ← x B m A \leftarrow \mathbb{Z}_q^{m\times n},s \leftarrow \mathbb{Z}_q^{n},e \leftarrow x_B^{m} A←Zqm×n,s←Zqn,e←xBm,并计算误差乘积 b = A s + e b=As+e b=As+e。此外,这里的 B B B必须满足 m B < q / 4 mB<q/4 mB<q/4。最后,程序输出私钥 s k = s sk=s sk=s,公钥 p k = ( A , B ) pk=(A,B) pk=(A,B)。
- E n c ( p k , x ∈ { 0 , 1 } ) Enc(pk,x\in\{0,1\}) Enc(pk,x∈{0,1}):注意到,Regev算法只针对了一个比特位。首先,我们随机选取一个nonce向量 r ← Z 2 m r \leftarrow \mathbb{Z}_2^{m} r←Z2m(即由0-1比特构成的m*1的向量),然后计算出密文的第一部分 c 0 ← r T A c_0 \leftarrow r^TA c0←rTA。随后计算出密文第二部分 c 1 ← r T b + ⌊ q / 2 ⌋ x c_1 \leftarrow r^Tb+\lfloor q/2 \rfloor x c1←rTb+⌊q/2⌋x。最后输出密文 c = ( c 0 , c 1 ) c=(c_0,c_1) c=(c0,c1)。
- D e c ( s k , c ) Dec(sk,c) Dec(sk,c):在解密阶段,我们只需要计算 x ^ = c 1 − c 0 s = r T e + ⌊ q / 2 ⌋ ⋅ x \hat{x} = c_1-c_0s=r^Te+\lfloor q/2 \rfloor \cdot x x^=c1−c0s=rTe+⌊q/2⌋⋅x。由于 r r r的取值是由0-1比特构成的m*1的向量,而 e e e的取值范围是 x B m x_B^{m} xBm。所以 r T e < m B < q / 4 r^Te<mB<q/4 rTe<mB<q/4。当 ∣ x ^ ∣ < q / 4 |\hat{x}|<q/4 ∣x^∣<q/4时, x = 0 x=0 x=0,反之, x = 1 x=1 x=1;
则此处的安全证明可以归结到 A s + e As+e As+e和 v v v不可区分的DLWE困难问题上。
GSW加密
GSW 方案整体思想:近似特征向量技术
我们回顾一下线性代数中特征向量与特征值特性:
设
C
C
C是
n
n
n阶方阵,如果存在数
μ
\mu
μ和非零
n
n
n维向量
x
x
x,使得
C
x
=
μ
x
Cx=\mu x
Cx=μx,则称
μ
\mu
μ是
A
A
A的一个特征值。非零
n
n
n维向量
x
x
x称为矩阵
C
C
C的属于特征值
m
m
m的特征向量。
若我们将 C C C看做密文, x x x看做私钥, μ \mu μ看做明文。实际上,上述的等式还满足乘法同态和加法同态,这就可以当做一个完美的全同态的方式。但是,这完全脱离了加密,因为 μ \mu μ完全可以通过在 C C C上使用高斯消元的方法获得。
与Regev加密相同,我们在该加密中添加入噪声。形成以下形式: C x = μ x + e m o d q Cx=\mu x+e\,mod\,q Cx=μx+emodq
我们再来测试其同态特性:
加法同态:
(
C
1
+
C
2
)
x
=
C
1
x
+
C
2
x
=
(
μ
1
+
μ
2
)
x
+
e
1
+
e
2
(C_1 +C_2)x = C_1x+C_2x=(\mu_1+\mu_2)x+e_1+e_2
(C1+C2)x=C1x+C2x=(μ1+μ2)x+e1+e2
这里虽然出现了
e
1
+
e
2
e_1+e_2
e1+e2,但是因为噪音很小 可以忽略掉。
乘法同态:
C
1
C
2
⋅
x
=
C
1
(
C
2
⋅
x
)
=
C
1
(
μ
2
x
+
e
)
=
μ
1
μ
2
x
+
μ
2
e
1
+
C
1
e
2
C_1C_2\cdot x=C_1(C_2\cdot x)=C_1(\mu_2x+e)=\mu_1\mu_2x+\mu_2e_1+C_1e_2
C1C2⋅x=C1(C2⋅x)=C1(μ2x+e)=μ1μ2x+μ2e1+C1e2
但是这里的乘法就出现问题了。
因为
μ
2
∈
Z
q
\mu_2 \in Z_q
μ2∈Zq,而
C
C
C的大小可能会在计算过程中变得很大。所以作者提出了一种 Flatten ciphertext技术。
其本质就是将密文的“体量” 在乘法进行扩张,降低噪音对单bit的影响。 这句话是我的个人理解,合不合理还需要大佬论证。 ^~^
在介绍方案前,我们先定义一些符号与函数
- a ∈ Z q k a \in Z^k_q a∈Zqk
- l = ⌊ l o g 2 q ⌋ + 1 l=\lfloor log_2q\rfloor+1 l=⌊log2q⌋+1
-
N
=
k
⋅
l
N=k\cdot l
N=k⋅l
函数: - B i t D e c o m p ( a ) = ( a 1 , 0 , … , a 1 , l − 1 , … , a k , 0 , … , a k , l − 1 ) BitDecomp(a)=(a_{1,0},\dots,a_{1,l-1},\dots,a_{k,0},\dots,a_{k,l-1}) BitDecomp(a)=(a1,0,…,a1,l−1,…,ak,0,…,ak,l−1),其中 a i , j a_{i,j} ai,j是 a i a_i ai二进制的低位开始的第 j j j位。
- B i t D e c o m p − 1 ( b ) = ( ∑ j 2 j b 1 , j m o d q , … , ∑ j 2 j b k , j m o d q ) BitDecomp^{-1}(b)=(\sum_j2^jb_{1,j}\,mod\,q,\dots,\sum_j2^jb_{k,j}\,mod\,q) BitDecomp−1(b)=(∑j2jb1,jmodq,…,∑j2jbk,jmodq),实际上是将 B i t D e c o m p BitDecomp BitDecomp的扩张的二进制缩回正常的10进制。
- F l a t t e n ( b ) = B i t D e c o m p ( B i t D e c o m p − 1 ( b ) ) Flatten(b)=BitDecomp(BitDecomp^{-1}(b)) Flatten(b)=BitDecomp(BitDecomp−1(b)) 这里是精髓部分,因为二进制向量每个bit位在进行操作后会被放大,我们将其恢复成十进制在重新转换成扩张的二进制。说白了就是你的操作虽然是在二进制向量下的,但是因为向量不会自己进位,所以需要有这一步骤。
- P o w e r s o f 2 ( s ) = ( s 1 , 2 s 1 , … , 2 l − 1 , … , s k , 2 s k , … , 2 l − 1 s k ) m o d q Powersof2(s)=(s_1,2s_1,\dots,2^{l-1},\dots,s_k,2s_k,\dots,2^{l-1}s_k)\,mod\,q Powersof2(s)=(s1,2s1,…,2l−1,…,sk,2sk,…,2l−1sk)modq,这里的函数其实就是对应函数 B i t D e c o m p BitDecomp BitDecomp保证其乘法操作在10进制下的正确性。
对上面函数左用比较模糊?看看下面:
- 对于
∀
a
,
s
∈
Z
q
k
\forall a , s ∈ Z_q^k
∀a,s∈Zqk,有
B i t D e c o m p ( a ) ⋅ P o w e r s o f 2 ( s ) = ( a ⋅ s ) BitDecomp(a)\cdot Powersof2(s) =(a\cdot s) BitDecomp(a)⋅Powersof2(s)=(a⋅s) - 对于 $\forall a ∈ Z_q^N
以及
以及
以及 s ∈ Z_q^k$,有
a ⋅ P o w e r s o f 2 ( s ) = B i t D e c o m p − 1 ( a ) ⋅ s a \cdot Powersof2(s) = BitDecomp^{-1}(a) \cdot s a⋅Powersof2(s)=BitDecomp−1(a)⋅s
那我们就开始方案部分:
- S e t u p ( 1 n , 1 L ) : Setup(1^n,1^L): Setup(1n,1L): 选择一个模数 q q q,其中 ∣ q ∣ = κ ( λ , L ) |q|=\kappa(\lambda,L) ∣q∣=κ(λ,L)比特,格基的维度 n = n ( λ , L ) n=n(\lambda,L) n=n(λ,L),以及适用于针对已知攻击至少达到 2 λ 2^{\lambda} 2λ的LWE噪音分布 χ = χ ( λ , L ) \chi=\chi(\lambda,L) χ=χ(λ,L),此外,选择参数 m = m ( λ , L ) = O ( n l o g q ) m=m(\lambda,L)=O(nlogq) m=m(λ,L)=O(nlogq)。公共参数 p a r a m s = ( n , q , χ , m ) params=(n,q,\chi,m) params=(n,q,χ,m),令 l = ⌊ l o g q ⌋ + 1 l=\lfloor log q\rfloor+1 l=⌊logq⌋+1, N = ( n + 1 ) ⋅ l N=(n+1)\cdot l N=(n+1)⋅l
- S K G e n ( p a r a m s ) : SKGen(params): SKGen(params):取 t ⃗ ← Z q n \vec{t} \leftarrow Z^n_q t←Zqn。输出 s k = s ⃗ ← ( 1 , − t 1 , ← , − t n ) ∈ Z q n + 1 sk=\vec{s}\leftarrow(1,-t_1,\leftarrow,-t_n)\in Z^{n+1}_q sk=s←(1,−t1,←,−tn)∈Zqn+1,令 v ⃗ = P o w e r s o f 2 ( s ⃗ ) \vec{v}=Powersof2(\vec{s}) v=Powersof2(s)。
- P K G e n ( p a r a m s , s k ) : PKGen(params,sk): PKGen(params,sk):均匀的生成一个矩阵 B ← Z q m × n B\leftarrow Z^{m\times n}_q B←Zqm×n和一个噪音向量 e ⃗ ← χ m \vec{e}\leftarrow \chi^{m} e←χm。令 b ⃗ = B ⋅ t ⃗ + e ⃗ \vec{b}=B\cdot \vec{t}+\vec{e} b=B⋅t+e。令公钥 p k = A = [ b ⃗ ∣ B ] pk=A=[\vec{b}|B] pk=A=[b∣B]。 (注意:Av=e)
- E n c ( p a r a m s , p k , μ ) : Enc(params,pk,\mu): Enc(params,pk,μ): 这里的消息 μ ∈ Z q \mu\in Z_q μ∈Zq,并均匀生成一个矩阵 R ∈ { 0 , 1 } N × m R\in\{0,1\}^{N \times m} R∈{0,1}N×m,并输出C: C = F l a t t e n ( μ ⋅ I N + B i t D e c o m p ( R ⋅ A ) ) ∈ Z q N × N C=Flatten(\mu\cdot I_N+BitDecomp(R \cdot A))\in Z^{N \times N}_q C=Flatten(μ⋅IN+BitDecomp(R⋅A))∈ZqN×N
- D e c ( ( p a r a m s , s k , C ) : Dec((params, sk, C): Dec((params,sk,C):计算 x i ← < C i , v ⃗ > x_i \leftarrow <C_i,\vec{v}> xi←<Ci,v>。输出 μ ′ = ⌊ x i / v i ⌉ \mu'=\lfloor x_i/v_i \rceil μ′=⌊xi/vi⌉
BFV加密方案
预备知识
多项式环
在数论基础知识中简单介绍了环的概念,这里我们应用的是多项式环的概念。首先,我们先回顾环的概念。
环: 设R是一个非空集合,在
R
R
R上定义了加法和乘法两种代数运算,分别记为“+”和“·”。如果
R
R
R具有如下性质:
-
R
R
R对于加法是一个交换群。
a. R R R关于加法封闭,即任意元素 a , b ∈ R a,b \in R a,b∈R,有 a ⋅ b ∈ R a \cdot b \in R a⋅b∈R
b. R R R关于加法结合律成立。即对于 R R R中任意元素 a + ( b + c ) = ( a + b ) + c a+(b+c)=(a+b)+c a+(b+c)=(a+b)+c。
c. R R R存在单位元。即 R R R中存在一个元素 e e e对 R R R中任意元素 a a a满足 a + e = a a+e=a a+e=a
d. R R R中存在逆元。对 R R R中任意元素 a a a, R R R存中都存在一个元素 b b b使得 a + b = e a+ b =e a+b=e。
f. R R R关于加法满足交换律, a + b = b + a a+b=b+a a+b=b+a。 - R R R对于乘法封闭。
- 乘法满足结合律。即对于即对于 R R R中任意元素 a ⋅ ( b ⋅ c ) = ( a ⋅ b ) ⋅ c a\cdot(b\cdot c)=(a\cdot b)\cdot c a⋅(b⋅c)=(a⋅b)⋅c。
- 分配律成立,即对于
R
R
R中任意元素 有
a
⋅
(
b
+
c
)
=
a
⋅
b
+
a
⋅
c
a\cdot(b+c)=a\cdot b+a\cdot c
a⋅(b+c)=a⋅b+a⋅c。
则称 ( R , + , ⋅ ) (R,+,\cdot) (R,+,⋅)为一个环。
我们再来对比多项式环:
多项式环: 设 R R R是一个有单位元 1 1 1的交换环, x x x是 R R R上的一个未定元, a 0 , a 1 , … , a n ∈ R a_0,a_1,\dots,a_n \in R a0,a1,…,an∈R, 则称 f ( x ) = a 0 + a 1 x + ⋯ + a n x n f(x)=a_0+a_1x+\dots+a_nx^n f(x)=a0+a1x+⋯+anxn是环 R R R上 x x x的一个多项式。其中, a i x i a_ix^i aixi被称为 f ( x ) f(x) f(x)的 i i i次项, a i a_i ai被称为 i i i次项系数,若 a n ≠ 0 a_n\neq0 an=0,则称 f ( x ) f(x) f(x)的次数为 n n n,记作 d e g ( f ( x ) ) = n deg(f(x))=n deg(f(x))=n.
感谢以下大佬的学习笔记 让我能看懂理解与消化,有疑惑的地方也可以看以下大佬的笔记
跳转链接: 小北极星笔记. 知乎-六三. 刘巍然-学酥的夏令营视频 Steven Yue学习笔记