格密码笔记四

一、格

v1,,vnRm 是线性无关向量组。称 v1,…,vn 生成(generate) 了 lattice L:

L=a1v1+a2v2++anvn:a1,a2,,anZ

即 L 中的元素是 v1,,vn 的整系数线性组合

基所包含的的向量个数称为 L 的纬度(dimension)

二、lattice 中基的关系

  • 假设 $v1,…,v_nlatticeL w_1,…,w_nLwjvi线w_1=a{11}v1+a{12}v2+⋯+a{1n}v_n$

​ $w2=a{21}v1+a{22}v2+⋯+a{2n}v_n$

​ ⋮ ⋮

​ $wn=a{n1}v1+a{n2}v2+⋯+a{nn}v_n$

系数 aij 全部是整数

  • wj 来组合出 vi

    U=(a11a12a1na21a22a2nan1an2ann)

显然 U⋅V=W,于是利用 wi 表达vi,系数是 U1W。 但 lattice 中,线性组合的系数必须全都是整数,于是U1 里面的元素也必须全部是整数。

1=det(I)=det(UU1)=det(U)det(U1),由行列式的定义式可以看出,如果一个矩阵元素全部是整数,那么行列式也必然是整数。从而det(U),det(U1) 都是整数,而它们的乘积为 1。

  • lattice L 的任意两个基,其基变换矩阵中的元素均为整数,且行列式为 ±1.

例如,Zn=(x1,x2,,xn):x1,,xnZ是包含了所有整数坐标向量的 lattice.

  • 整格(integral lattice):一个 integral(or integer) lattice,是指所包含的向量都拥有整数坐标的 lattice。或者说,一个 integral lattice,是 Zm 加法群的一个子群。

例如,Lv1=(2,1,3),v2=(1,2,0),v3=(2,3,5)

把它们作为行向量,写成矩阵:

A=(213120235)

接下来考虑 L 中的另一个向量组:

w1=v1+v3,w2=v1v2+2v3,w3=v1+2v2

于是有变换矩阵

U=(101112120)

从而可以计算出 w1,w2,w3

B=UA=(422577453)

我们注意到 U 的行列式是 −1,从而 w1,w2,w3 也是 L 的一个基。现在利用 wj 来组合出vi,系数是 U 的逆矩阵:

U1=(421211321)

v1=4w12w2w3

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
v1 = [2, 1, 3]
v2 = [1, 2, 0]
v3 = [2, -3, -5]

A = matrix([v1, v2, v3])
print(A)
# [ 2 1 3]
# [ 1 2 0]
# [ 2 -3 -5]

U = matrix([[1, 0, 1], [1, -1, 2], [1, 2, 0]])
print(U)
# [ 1 0 1]
# [ 1 -1 2]
# [ 1 2 0]
print(U.det())
# -1

B = U*A
print(B)
# [ 4 -2 -2]
# [ 5 -7 -7]
# [ 4 5 3]

inv_U = U.inverse()
print(inv_U)
# [ 4 -2 -1]
# [-2 1 1]
# [-3 2 1]

assert inv_U * B == A
  • 总结

1、若 LRm 是一个 n 维的 lattice,那么它的一个基可以被写成 n×m 矩阵 A.

2、L 的另一个基,可以通过 A 左乘一个 n×n 的基变换矩阵来得到,其中 U 必须是整系数矩阵,且行列式为 ±1. 满足这种条件的 U,称为 Z 上的一般线性群(general linear group),记为GLn(Z)。 它是满足“逆矩阵也为整系数矩阵”的整系数矩阵的群。


三、几何意义上的 lattice

加法子群(additive subgroup):Rm 的一个子集 L,它是加法子群当且仅当其在加法、减法运算上封闭。离散加法子群(discrete additive subgroup) :一个加法子群 L 为离散加法子群,当且仅当存在一个正的常数 ϵ>0使vL,LwRm:vw<ϵ=v

上面这个式子的几何意义是:对于 L 中的每一个点 v,其附近 ϵ 的(欧几里得)距离范围内,不存在 L 的其他点。也就是说 L 是离散的,每两个点之间的距离都不小于某个(足够小的)ϵ.

格(lattice) 一个 Rm 的子集是 lattice,当且仅当它是离散加法子群。

  • 一个 lattice 与线性空间是非常相似的,除了 lattice 必须由 basis 的整系数线性组合来生成,而线性空间可以用任意实数作为线性组合系数。lattice 可以视为 Rm 上的离散点集。

  • 基本域的概念

基本域(fundamental domain, fundamental parallelepiped)
设 L 是一个 n 维 lattice,v1,,vn 是一个基。则 L 对应这一组基的基本域是F(v1,,vn)=t1v1+t2v2++tnvn:0ti1

几何上,基本域就是这组基围出的区域.

LRn 是一个 n 维 lattice,F 是 L 的一个基本域。那么对于所有 wRn,它都可以写成如下形式:w=t+v for a unique t∈F and a unique v∈L。

这里的 t,v 都是唯一的。F+v=t+v:tF在 v 取遍 L 中的每一个点时,恰好覆盖了整个 Rn。

  • L 的所有基本域,体积都是一样的

将 lattice 的协体积视为 basis v1,,vn所围成的平行体 F 的协体积,若这些基向量长度固定的话,想要得到最大的协体积,必然各个向量之间都要正交(类比于,相同长度的四条线段围成平行四边形,当其恰好为正方形的时候面积最大)。于是我们得到了 lattice 协体积的上限:

(Hadamard 不等式):设 L 是一个 lattice,取其任意一个基 v1,,vn,设 F 是 L 的一个基本域。那么有det L=Vol(F)v1v2vn

其中,basis 的各个向量越像正交的,则协体积越接近上限。当 basis 各个向量恰好正交时,上面的 Hadamard 不等式取到等号。

  • LRn 的维度恰等于 n 时的行列式

设 L⊂Rn 是一个 n 维 lattice,设 v1,,vn 是基,F 是对应的基本域。

接下来我们写出各个基向量的坐标:

$vi=(r{i1},r{i2},…,r{in})$
把这些坐标写进矩阵里面:

$F=F(v1,…,v_n)=$\begin{pmatrix}
{r
{11}}&{r{12}}&{\cdots}&{r{1n}}\
{r{21}}&{r{22}}&{\cdots}&{r{2n}}\
{\vdots}&{\vdots}&{\ddots}&{\vdots}\
{r
{n1}}&{r{n2}}&{\cdots}&{r{nn}}\
\end{pmatrix}$$

则可以如下计算 F 的协体积:

Vol(F(v1,,vn))=|detF|

如果 lattice 的维度与空间的维度恰好相等,则只需要计算基向量的系数矩阵的行列式,即可得到 lattice 的协体积。

例如:之前代码里面的 lattice L,其协体积为detL=|detA|=|det(213 120 235 )|=|−36|=36

python
1
2
3
4
5
6
7
8
9
10
11
12
13
print(A)
# [ 2 1 3]
# [ 1 2 0]
# [ 2 -3 -5]
print(A.det())
# -36

print(B)
# [ 4 -2 -2]
# [ 5 -7 -7]
# [ 4 5 3]
print(B.det())
# 36

从一道CTF题初探NTRU格密码 - 先知社区 (aliyun.com)