苦读格密码-lattice
对格的理解还是太肤浅了,这里加强一下理论学习
一、格的定义
首先介绍一些基本概念
假设在
则
长得就像晶胞一样(Crystal)
基本平行多面体(Fundamental Parallelepiped)
给定基,我们可以定义一个基本平行多面体:
这些向量称为格L的基,m是维数,n是格L的秩
格基可以写成一个矩阵
那其实好像也能用每个线段长度来定义这个晶胞
换而言之,我们只计算n维子空间上的晶胞大小就行了,这个其实就是
Kernal lattice
可以用sagemath求出核格
1 | q = 7 # 示例模数 |
二、行列式是格基变换中的不变量
定义 1 幺模矩阵(unimodular matrix)是行列式绝对值为1的整数方阵。
Hermite 正规形(Hermite Normal Form, HNF)
定义
对于矩阵
则称
- 上三角结构
是上三角矩阵: 对所有 成立。 - 所有零行必须位于非零行的下方。
- 主元性质
- 非零行的主元(第一个非零元素
)严格位于其上方行主元的右侧。 - 主元必须为正:
。
- 主元周边约束
- 主元下方:
( ,由上三角性保证)。 - 主元上方:
对所有 成立。
性质
- 唯一性:给定
,其 HNF 是唯一的。 - 幺模变换:
是整数可逆矩阵,保持格的生成集不变。
这看着和高斯消元法好像也没什么区别?
HNF在格密码中有什么用呢,考虑两个格基B和C
显然他们可以由彼此线性表出,而且系数是整数
那么就有
可以得到定理
这就可以和Hermite normal from对应上了,我们把矩阵A化成Hermite normal form,其实就是进行一个格基的变换
这与高斯消元法不同,高斯消元法不能保证系数还是整数
三、Gram-Schmidt正交化
对格基进行正交化,那么有
但这个可以帮助我们计算行列式
我们思考一下,Gram-Schmidt之后,都是垂直的向量,那体积就很好算了,就是每个向量模长乘一起,那怎么证明这个体积和原来一样呢?
考虑QR分解
而R则是对角线为
那么
还有一个不等式
四、最短向量问题
首先思考一个问题,如何判断一个区域内是否有格点?
这就用到了Minkowski-Lattice定理
Blichfeldt定理
如果一个多面体S,满足
因为S比晶胞大,所以我们可以把S中的部分拆开平移,变成拼图,然后让S覆盖L,这样就能找到格向量了
但我们不能保证这个格向量在S内,因为这不是凸集
Minkowski-Lattice定理
设
由于对称性,所以有一半体积其实作废了,所以要乘以
Minkowski第一定理
其实就是利用上面的定理构造一个凸集S
超立方体的体积
而最短向量又在s里
所以
最短向量问题(The Shortest Vector Problem, SVP)
五、LLL算法
什么是LLL约化基
那么我们如何得到短向量呢,可以先从短的基开始,LLL规约基满足两个条件,一个是尽可能短,另一个是尽可能正交
我们希望通过GSO得到一组基,那这个基自然要在格里,回顾一下
如果
所以
注意到
LLL算法
for i=1,2,..,n for j =i-1,..,1
if
Then swap
Else output B
注意到这个类似于Gauss算法,所以属于格基变换,求得的还是格基
下面介绍一下LLL约化基的性质
令
六、CopperSmith方法
我们可以利用LLL算法来求解模多项式问题
比如我们想要求解
注意到
先考虑
引理Howgrave-Graham
设h(x)是一个有d个单项式的多项式,如果满足
由
所以
根据上面这个,我们来构造
我们用
寻找满足
不妨令LLL约化得到的b_1为这个向量,那么