参考文献:
- Schnorr C P, Euchner M. Lattice basis reduction: Improved practical algorithms and solving subset sum problems[J]. Mathematical programming, 1994, 66(1): 181-199.
- Chen Y, Nguyen P Q. BKZ 2.0: Better lattice security estimates[C]//International Conference on the Theory and Application of Cryptology and Information Security. Springer, Berlin, Heidelberg, 2011: 1-20.
- Gama N, Nguyen P Q, Regev O. Lattice enumeration using extreme pruning[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 2010: 257-278.
文章目录
欧几里得球(Euclidean ball)
半径
R
R
R的
n
n
n维球,它的体积为:
V
n
(
R
)
=
R
n
⋅
π
n
/
2
Γ
(
n
/
2
+
1
)
=
R
n
⋅
V
n
(
1
)
V_n(R) = R^n \cdot \frac{\pi^{n/2}}{\Gamma(n/2 + 1)} = R^n \cdot V_n(1)
Vn(R)=Rn⋅Γ(n/2+1)πn/2=Rn⋅Vn(1)
其中
Γ
(
s
)
\Gamma(s)
Γ(s)是
G
a
m
m
a
Gamma
Gamma函数:
Γ
(
s
)
=
∫
0
∞
t
s
−
1
e
−
t
d
t
\Gamma(s) = \int_0^\infty t^{s-1} e^{-t} dt
Γ(s)=∫0∞ts−1e−tdt
利用斯特林公式( Stirling’s approximation),得到:
V
n
(
1
)
−
1
/
n
≈
n
2
π
e
≈
n
/
17
V_n(1)^{-1/n} \approx \sqrt{\frac{n}{2 \pi e}} \approx \sqrt{n/17}
Vn(1)−1/n≈2πen≈n/17
高斯启发式(Gaussian Heuristic):对于
n
n
n维格
L
L
L和连续集合
S
⊂
R
m
S \subset R^m
S⊂Rm,在
S
∩
L
S \cap L
S∩L中的格点数大约是
v
o
l
(
S
)
/
v
o
l
(
L
)
vol(S)/vol(L)
vol(S)/vol(L)
假设 S S S是半径 R R R的 n n n维球,那么其中的格点数约为 V n ( R ) / d e t ( L ) V_n(R)/det(L) Vn(R)/det(L)
格的高斯启发式:
λ
1
(
L
)
≈
(
d
e
t
(
L
)
V
n
(
1
)
)
1
/
n
≈
n
/
17
⋅
∏
i
=
1
n
∥
b
i
∗
∥
\lambda_1(L) \approx (\frac{det(L)}{V_n(1)})^{1/n} \approx \sqrt{n/17} \cdot \prod_{i=1}^{n} \|b_i^*\|
λ1(L)≈(Vn(1)det(L))1/n≈n/17⋅i=1∏n∥bi∗∥
其中
b
i
∗
b_i^*
bi∗是施密特正交基(Gram-Schmidt orthogonal basis)
简记为: G H ( L ) = d e t ( L ) 1 / n / V n ( 1 ) 1 / n GH(L) = det(L)^{1/n} / V_n(1)^{1/n} GH(L)=det(L)1/n/Vn(1)1/n
高维球的性质
- 高维球的体积集中在薄球壳上
- 高维球的体积集中在任意赤道面上
- d d d维的正态分布,虽然密度在原点处最高,但原点附近的球体几乎没有体积;随机点集中在半径 σ d − 1 ± O ( 1 ) \sigma \sqrt{d-1} \pm O(1) σd−1±O(1)的薄球壳上
- 高维球体的体积趋近于0,高维立方的体积恒等于1;高维球体可以包裹高维立方的面中心点,但顶点间最远距离为 d ≫ 2 \sqrt{d} \gg 2 d≫2
- 下面是高维立方的面中心点到顶点的距离渐变过程:
# 假设立方体棱长为2,方便观察
>>> f=lambda d: [np.sqrt(1+(d-1)*x**2) for x in np.arange(0, 1.1, 0.1)]
>>> f(100)
[1.0, 1.4106735979665885, 2.227105745132009, 3.148015247739439, 4.1036569057366385, 5.07444578254611, 6.053098380168623, 7.036334272900913, 8.022468448052633, 9.010549372818508, 10.0]
# 对于单位立方,公式为
>>> f=lambda d: [np.sqrt(0.5**2+(d-1)*x**2) for x in np.arange(0, 0.55, 0.05)]
>>> f(100)
[0.5, 0.7053367989832943, 1.1135528725660044, 1.5740076238697196, 2.0518284528683193, 2.537222891273055, 3.0265491900843116, 3.5181671364504563, 4.011234224026317, 4.505274686409254, 5.0]
# 很明显,0.5 < 1 < 5.0
正交投影(orthogonal projection)
对于
n
n
n维格,格基
{
b
1
,
b
2
,
⋯
,
b
n
}
\{b_1,b_2,\cdots,b_n\}
{b1,b2,⋯,bn}(
m
m
m维向量),
i
∈
{
1
,
⋯
,
n
}
i \in\{1,\cdots,n\}
i∈{1,⋯,n},定义映射
π
i
:
R
m
↦
s
p
a
n
(
b
1
,
⋯
,
b
i
−
1
)
⊥
\pi_i: R^m \mapsto span(b_1,\cdots,b_{i-1})^{\bot}
πi:Rm↦span(b1,⋯,bi−1)⊥
易知
v
−
π
i
(
v
)
∈
s
p
a
n
(
b
1
,
⋯
,
b
i
−
1
)
v - \pi_i(v) \in span(b_1,\cdots,b_{i-1})
v−πi(v)∈span(b1,⋯,bi−1)
特别地,
π
1
(
⋅
)
=
i
d
\pi_1(\cdot)=id
π1(⋅)=id,是恒等映射。
平凡的计算方法:
π
i
(
v
)
=
v
−
∑
i
=
1
i
−
1
v
⋅
b
i
∗
b
i
∗
⋅
b
i
∗
⋅
b
i
∗
\pi_i(v) = v - \sum_{i=1}^{i-1} \frac{v \cdot b_i^*}{b_i^* \cdot b_i^*} \cdot b_i^*
πi(v)=v−i=1∑i−1bi∗⋅bi∗v⋅bi∗⋅bi∗
但实际上,假设
v
=
v
1
b
1
+
⋯
+
v
n
b
n
v=v_1b_1+\cdots+v_nb_n
v=v1b1+⋯+vnbn,由于
b
k
=
b
k
∗
+
∑
j
=
1
k
−
1
μ
k
,
j
b
j
∗
b_k = b_k^* + \sum_{j=1}^{k-1} \mu_{k,j} b_j^*
bk=bk∗+j=1∑k−1μk,jbj∗
那么
v
=
∑
j
=
1
n
(
v
j
+
∑
k
=
j
+
1
n
μ
k
,
j
v
k
)
b
j
∗
v = \sum_{j=1}^{n} (v_j + \sum_{k=j+1}^{n} \mu_{k,j}v_k) b_j^*
v=j=1∑n(vj+k=j+1∑nμk,jvk)bj∗
根据施密特正交基的性质,截断:
π
i
(
v
)
=
∑
j
=
i
n
(
v
j
+
∑
k
=
j
+
1
n
μ
k
,
j
v
k
)
b
j
∗
\pi_i(v) = \sum_{j=i}^{n} (v_j + \sum_{k=j+1}^{n} \mu_{k,j}v_k) b_j^*
πi(v)=j=i∑n(vj+k=j+1∑nμk,jvk)bj∗
因此计算他们的范数是容易的,不必反复计算内积:
∥
π
i
(
v
)
∥
2
=
∑
j
=
i
n
(
v
j
+
∑
k
=
j
+
1
n
μ
k
,
j
v
k
)
2
⋅
∥
b
j
∗
∥
2
\| \pi_i(v) \|^2 = \sum_{j=i}^{n} (v_j + \sum_{k=j+1}^{n} \mu_{k,j}v_k)^2 \cdot \| b_j^* \|^2
∥πi(v)∥2=j=i∑n(vj+k=j+1∑nμk,jvk)2⋅∥bj∗∥2
投影子格(projective sublattice):
L
i
,
j
:
=
L
(
π
i
(
b
i
)
,
π
i
(
b
i
+
1
)
,
⋯
,
π
i
(
b
j
)
)
L_{i,j} := L(\pi_i(b_i),\pi_i(b_{i+1}),\cdots,\pi_i(b_j))
Li,j:=L(πi(bi),πi(bi+1),⋯,πi(bj))
局部块(local block):
B
i
:
=
{
π
i
(
b
i
)
,
π
i
(
b
i
+
1
)
,
⋯
,
π
i
(
b
j
)
}
B_i := \{\pi_i(b_i),\pi_i(b_{i+1}),\cdots,\pi_i(b_j)\}
Bi:={πi(bi),πi(bi+1),⋯,πi(bj)}
块长为
β
=
j
−
i
+
1
\beta=j-i+1
β=j−i+1
枚举算法
假设
λ
1
(
L
)
<
R
\lambda_1(L) < R
λ1(L)<R,为了解决
S
V
P
SVP
SVP,我们搜索向量
v
v
v对应的系数组合
(
v
1
,
v
2
,
⋯
,
v
n
)
(v_1,v_2,\cdots,v_n)
(v1,v2,⋯,vn),并满足
n
n
n个不等式:
∥
π
n
+
1
−
k
(
v
)
∥
2
≤
R
2
,
1
≤
k
≤
n
\| \pi_{n+1-k}(v) \|^2 \le R^2,\,\, 1 \le k \le n
∥πn+1−k(v)∥2≤R2,1≤k≤n
关于格
L
L
L的搜索半径为
R
R
R的枚举树:树的深度为
n
n
n,其深度
k
k
k的节点是
r
a
n
k
−
k
rank-k
rank−k的投影格
π
n
+
1
−
k
(
L
)
\pi_{n+1-k}(L)
πn+1−k(L)中所有的范数不超过
R
R
R的向量。
对于一个深度 k k k的节点 u ∈ π n + 1 − k ( L ) u \in \pi_{n+1-k}(L) u∈πn+1−k(L),它的父节点是深度 k − 1 k-1 k−1的 π n + 2 − k ( u ) \pi_{n+2-k}(u) πn+2−k(u),因此节点 v v v的祖先节点的范数不比 ∥ v ∥ \|v\| ∥v∥大,这个序列可以用于剪枝。
特别的,根节点是零向量,因为 π n + 1 ( L ) = { 0 } \pi_{n+1}(L)=\{0\} πn+1(L)={0};而叶子节点,就是所有满足 ∥ v ∥ ≤ R \|v\| \le R ∥v∥≤R的向量,因为 π 1 ( v ) = v \pi_{1}(v)=v π1(v)=v
不剪枝的枚举算法,对于不等式组,
1
≤
k
≤
n
1 \le k \le n
1≤k≤n
∥
π
n
+
1
−
k
(
v
)
∥
2
=
∑
j
=
n
+
1
−
k
n
(
v
j
+
∑
i
=
j
+
1
n
μ
i
,
j
v
i
)
2
⋅
∥
b
j
∗
∥
2
≤
R
2
\| \pi_{n+1-k}(v) \|^2 = \sum_{j=n+1-k}^{n} (v_j + \sum_{i=j+1}^{n} \mu_{i,j}v_i)^2 \cdot \| b_j^* \|^2 \le R^2
∥πn+1−k(v)∥2=j=n+1−k∑n(vj+i=j+1∑nμi,jvi)2⋅∥bj∗∥2≤R2
提出第
n
+
1
−
k
n+1-k
n+1−k项:
∣
v
n
+
1
−
k
+
∑
i
=
n
+
2
−
k
n
μ
i
,
n
+
1
−
k
⋅
v
i
∣
≤
R
2
−
∑
j
=
n
+
2
−
k
n
(
v
j
+
∑
i
=
j
+
1
n
μ
i
,
j
v
i
)
2
⋅
∥
b
j
∗
∥
2
∥
b
n
+
1
−
k
∗
∥
| v_{n+1-k} + \sum_{i=n+2-k}^{n} \mu_{i,n+1-k} \cdot v_i | \le \frac{\sqrt{R^2 - \sum_{j=n+2-k}^{n} (v_j + \sum_{i=j+1}^{n} \mu_{i,j}v_i)^2 \cdot \| b_j^* \|^2}}{\|b_{n+1-k}^*\|}
∣vn+1−k+i=n+2−k∑nμi,n+1−k⋅vi∣≤∥bn+1−k∗∥R2−∑j=n+2−kn(vj+∑i=j+1nμi,jvi)2⋅∥bj∗∥2
于是,对于
k
=
1
k=1
k=1,考虑对称性,有枚举范围
0
≤
v
n
≤
R
/
∥
b
n
∗
∥
0 \le v_n \le R/\|b_n^*\|
0≤vn≤R/∥bn∗∥
假设整系数 v n + 2 − k , ⋯ , v n v_{n+2-k},\cdots,v_n vn+2−k,⋯,vn已经确定,那么 v n + 1 − k v_{n+1-k} vn+1−k的枚举范围 I n + 1 − k I_{n+1-k} In+1−k也可以确定下来。区间中心为 v n + 1 − k = ⌊ − ∑ i = n + 2 − k n μ i , n + 1 − k ⋅ v i ⌉ v_{n+1-k} = \lfloor -\sum_{i=n+2-k}^{n} \mu_{i,n+1-k} \cdot v_i \rceil vn+1−k=⌊−∑i=n+2−knμi,n+1−k⋅vi⌉,然后依次搜索 ± 1 , ± 2 , ⋯ \pm1,\pm2,\cdots ±1,±2,⋯
剪枝枚举算法(Pruned Enumeration),设置更严格的不等式,即
∥
π
n
+
1
−
k
(
v
)
∥
2
≤
R
k
2
,
1
≤
k
≤
n
\| \pi_{n+1-k}(v) \|^2 \le R_k^2,\,\, 1 \le k \le n
∥πn+1−k(v)∥2≤Rk2,1≤k≤n
其中边界参数(bounding parameters)
R
1
≤
R
2
≤
⋯
≤
R
n
=
R
R_1 \le R_2 \le \cdots \le R_n = R
R1≤R2≤⋯≤Rn=R是
n
n
n个实数,由剪枝策略确定。
剪枝,实际上是将“不太可能”是最短向量的枝丫去除,因此剪枝算法的“成功概率”并不是 1 1 1。我们通过反复执行剪枝枚举算法,提高求解 C V P CVP CVP的成功率。注意,剪枝算法是确定性的,因此我们执行剪枝枚举之前,需要将格基“随机化”。
极限剪枝(Extreme Pruning):选择某种边界参数,使得算法成功率很小,但却以指数级降低时间复杂度。
BKZ(Block Korkin Zolotarev reduction)
对于格
L
L
L的有序基底
{
b
1
,
b
2
,
⋯
,
b
n
}
\{b_1,b_2,\cdots,b_n\}
{b1,b2,⋯,bn},若它是
s
i
z
e
−
r
e
d
u
c
e
d
size-reduced
size−reduced,并且满足
∥
b
i
∗
∥
=
λ
1
(
π
i
(
L
)
)
\|b_i^*\| = \lambda_1(\pi_i(L))
∥bi∗∥=λ1(πi(L))
那么它称为:
K
o
r
k
i
n
−
Z
o
l
o
t
a
r
e
v
b
a
s
i
s
Korkin-Zolotarev\,\,\,basis
Korkin−Zolotarevbasis
任意的
K
Z
KZ
KZ基,都满足:
4
i
+
3
≤
∥
b
i
∥
2
λ
i
2
≤
i
+
3
4
,
i
=
1
,
2
,
⋯
,
n
\frac{4}{i+3} \le \frac{\|b_i\|^2}{\lambda_i^2} \le \frac{i+3}{4},\,\,\, i=1,2,\cdots,n
i+34≤λi2∥bi∥2≤4i+3,i=1,2,⋯,n
然而,计算出
K
Z
KZ
KZ基的时间复杂度是指数级的。
我们退而求其次,使得长度为
β
\beta
β的局部块
B
i
B_i
Bi,满足
s
i
z
e
−
r
e
d
u
c
e
d
size-reduced
size−reduced,并且
δ
⋅
∥
b
i
∗
∥
≤
λ
1
(
π
i
(
L
(
b
i
,
⋯
,
b
min
(
i
+
β
−
1
,
n
)
)
)
)
=
λ
1
(
L
i
,
min
(
i
+
β
−
1
,
n
)
)
,
i
=
1
,
2
,
⋯
,
n
−
1
\delta \cdot \| b_i^* \| \le \lambda_1(\pi_i(L(b_i,\cdots,b_{\min(i+\beta-1,n)}))) = \lambda_1(L_{i,\min(i+\beta-1,n)}),\,\,\, i=1,2,\cdots,n-1
δ⋅∥bi∗∥≤λ1(πi(L(bi,⋯,bmin(i+β−1,n))))=λ1(Li,min(i+β−1,n)),i=1,2,⋯,n−1
其中
1
/
4
≤
δ
≤
1
1/4 \le \delta \le 1
1/4≤δ≤1,这称为
β
−
r
e
d
u
c
e
d
w
i
t
h
δ
\beta-reduced\,\,with\,\,\delta
β−reducedwithδ
BKZ算法:先做格约简(格基越好,枚举树越小),然后对于
i
=
1
,
⋯
,
n
−
1
i=1,\cdots,n-1
i=1,⋯,n−1,在投影子格
L
i
,
min
(
n
,
i
+
β
−
1
)
L_{i,\min(n,i+\beta-1)}
Li,min(n,i+β−1)上执行枚举算法,得到局部块
B
i
B_i
Bi上的最短向量
v
v
v,并把它插入原始格基中
(
b
1
,
b
2
,
⋯
,
b
i
−
1
,
v
,
b
i
,
⋯
,
b
min
(
n
,
i
+
β
−
1
)
)
(b_1,b_2,\cdots,b_{i-1},v,b_{i},\cdots,b_{\min(n,i+\beta-1)})
(b1,b2,⋯,bi−1,v,bi,⋯,bmin(n,i+β−1))
这使得这些向量线性相关。需要对它做格基约化(例如
L
L
L
LLL
LLL算法),重新得到格基,它满足
∥
b
i
∗
∥
=
λ
1
(
L
i
,
min
(
i
+
β
−
1
,
n
)
)
\| b_i^* \| = \lambda_1(L_{i,\min(i+\beta-1,n)})
∥bi∗∥=λ1(Li,min(i+β−1,n))
然后继续枚举,继续格约简,直到格基不再变化。实际上,在算法的前若干轮,格基的质量会有明显提高;再之后,其格基的质量就很接近 B K Z BKZ BKZ算法的约简极限了,可以提前终止。