格密码

线性代数前置知识

先回顾一下学校线代课程讲过的几个概念

向量空间

\(V\)是 n 元向量的集合,如果\(V\)非空,并且对于向量的线性运算封闭(即对任意 \(\boldsymbol{v_1} \in V,\boldsymbol{v_2} \in V,k \in \mathbb{R}\) ,都有 \(\boldsymbol{v_1+v_2} \in V,k\boldsymbol{v_1} \in V\) ),则称 \(V\) 是一个向量空间

向量空间的基与维数

向量空间\(V\)的一个极大无关组叫做\(V\)的一个\(V\) 的秩叫做\(V\)维数,记作\(dim(V)\)。若 \(dim(V)=r\),则称\(V\)\(r\)维向量空间。

若已知\(r\)维向量空间\(V\)的基为\(\boldsymbol{v_1,v_2,\cdots,v_r}\),则向量空间\(V\)可以表示成

\[ V=\{ \boldsymbol{v}=x_1\boldsymbol{v_1}+x_2\boldsymbol{v_2}+\cdots +x_r\boldsymbol{v_r} | x_1,x_2,\cdots,x_r \in \mathbb{R}\} \]

向量正交与施密特(Schmidt)正交化

\(\boldsymbol{a\neq 0,b\neq 0}\)时,当\((\boldsymbol{a,b}=0)\),即\(\boldsymbol{a^Tb}=0\)时,称向量\(\boldsymbol{a,b}\)正交。

由两两正交的非零向量组成的向量组称为正交向量组,由单位向量组成的正交向量组称为标准正交向量组

\(n\)维欧氏空间求解正交基,一组基底为\((\alpha_1,\alpha_2,\cdots,\alpha_n)\)

  • Step1:令 \(\beta_1=\alpha_1\)
  • Step2:计算\(\alpha_2\)\(\beta_1\)方向上的投影,并做差得到 \[\beta_2=\alpha-\frac{(\beta_1,\alpha_2)}{(\beta_1,\beta_1)}\beta_1\]
  • Step3:计算\(\alpha_3\)在向量\(\beta_1,\beta_2\)方向的投影,继续做差得到\(\beta_3\)

\(n\)元向量的集合 \(v_1,\cdots,v_n \in \mathbb{R}^n\),格(Lattices)就是这些向量的线性组合

\[L=\{a_1v_1+a_2v_2+\cdots+a_nv_n \mid a_1,a_2,\cdots,a_n \in \mathbb{Z}\}\]

对比向量空间的定义,可以发现系数是整数,因此定义出来的格空间是一些格点,而非连续的向量空间。

下图是一个二维格,平行四边形的一组邻边是格的基底。通过对这两个向量不断进行线性组合,那么就产生了很多格点,就形成了一个格。

基本域

假定 \(v_1,v_2,\cdots,v_n\) 是格 \(L\) 的基,\(F\{v_1,v_2,\cdots,v_n\}=\{a_1v_1+a_2v_2+\cdots+a_nv_n \mid a_1,a_2,\cdots,a_n \in [0,1]\}\)

上图中的平行四边形,就是二维格中一组基底构成的基本域。

格基本域的体积等于格的行列式的值,基本域的体积就是积分,而这也正是行列式的几何意义,\(Volume(F\{v_1,v_2,\cdots,v_n\})=det(L)\)

矩阵表示

假定 \(v_1,v_2,\cdots,v_n\) 是格 \(L\) 的基,\(w_1,w_2,\cdots,w_n \in L\),则必然存在整系数 \(a_{ij}\) 使得:

\[ \begin{cases} w_1=a_{11}v_1+a_{12}v_2+\cdots+a_{1n}v_n \\ w_2=a_{21}v_1+a_{22}v_2+\cdots+a_{2n}v_n \\ \vdots \\ w_n=a_{n1}v_1+a_{n2}v_2+\cdots+a_{nn}v_n \end{cases} \]

可以提取出一个系数矩阵

\[ A= \begin{bmatrix} a_{1,1} & a_{1,2} & \ldots & a_{1,n}\\ a_{2,1} & a_{2,2} & \ldots & a_{2,n}\\ \vdots & \vdots & \ddots & \vdots \\ a_{n,1} & a_{n,2} & \ldots & a_{n,n} \end{bmatrix} \]

进而将上述方程组转换为矩阵表示\(\boldsymbol{w}=A * \boldsymbol{v}\)

LLL/BKZ 算法

之前打国际赛看到 discord 里一直有人赞美 flatter,应该是加速 LLL 用的,我还没配好环境。

一种格基约简算法,可以找到格上的一组最短的正交基

Sagemath中可以直接调用函数。

但对于函数的实现以及算法的原理没必要深究,在具体题目当中会使用即可。

1
2
3
4
M = matrix(ZZ,[[],[]])
L = M.LLL()
L = M.BKZ(block_size=2)
x = L[0]

下图是高斯启发式,为我们展示了格上最短向量的欧几里得范数的大致范围。

这样我们就知道构造出来的格,是否可以规约出我们的目标向量,也为我们调整格的平衡提供了思路。接下来我们在以下几个问题当中具体看一下LLL算法的应用。

lattice 应用

下面将首先介绍两个最基本问题SVPCVP,这是格上的两个困难问题,都属于 NP 完全问题。因此在这两个困难问题上也将延伸出很多格密码体系。

SVP

最短向量问题(Shortest Vector Problem,SVP)

这是最基本的一个问题,后续很多格问题最终都转换成了SVP问题,从LLL算法中我们也可以看出,最终得到的是格上的最短正交向量组。

下面从一个例子来介绍格的构造和 LLL 的应用。

1
2
3
4
5
6
7
p = getPrime(1023)
q = getPrime(1023)
f = getPrime(2048)
g = getPrime(2048)
f =
g =
assert (p * f - 58 * f + q) % g == 44

\[(p*f - 58 * f + q) \% g = 44\] \[k\cdot g+44=(p-58)\cdot f+q\] 我们目的是通过\(f,g\)求出\(p,q\),从代码的定义可以看到,\(p,q\)的位数相比于\(f,g\)来说很小,因此可以应用格的思路,构造一个合适的格,规约出\((p,q)\)

写出如下方程组 \[k\cdot g-(p-58)\cdot f=q-44\] \[k\cdot 0-(p-58)\cdot (-1)=p-58\] 可以看到第二个式子是一个恒等式,在构造格时我们通常需要加入这样的恒等式。

下面将方程组转换为矩阵。

\[(k, p-58) \begin{bmatrix}0&g\\1&-f \end{bmatrix}=(p-58,q-44)\]

得到了\(v*B=w\)的形式。在这个式子中我们关心的是\(w\)向量是否是格\(B\)上的最短向量,\(v\)这是线性组合的系数并不用过多关注。

在介绍高斯启发式的时候,提到了格上最短向量的欧几里得范数的大致范围,我们现在验证一下,看看\(w\)是否是格\(B\)上的最短向量,即比较长度\(||w||\)和高斯期望值\(\sigma(det(B))\)

\[||w|| = \sqrt{(p-58)^2+(q-44)^2}\approx 2^{1024}\] \[\sigma(det(B))\approx det(B)^{1/2}=\sqrt{g}\approx 2^{1024}\]

于是\(w\)大概率为格\(B\)上的最短向量,构造格\(B\)进行LLL算法即可。

还有个例子可以看背包加密

CVP

最近向量问题(Closest Vector Problem),格上另一个最常见的问题。

给定格\(L\)的一组基与向量\(v\),找到在\(L\)上离\(v\)最近的一个向量。

方便理解还是看一下几何意义,在连续空间中任找一点\(p\)(注意:不一定在格上),要找到格上距离点\(p\)最近的一个点。

LWE

LWE 问题(Learn With Error)

ACD

ACD 问题(Approximate Common Divisor),近似公约数(应该也可以叫 AGCD)

给定\(t\)\(x_i\)满足:\(x_i=pq_i+r_i\)

\(x_i\) 已知,\(p\)\(\alpha\) 位,\(q_i\)\(\beta\) 位 ,\(r_i\)\(\rho\) 位(\(\rho \lt\lt \alpha\)),求 \(p\)

\(p\)相当于\(t\)\(x\)的近似公约数,因此要求了\(r_i \lt\lt p\)

构造

\[(q_0,q_1,\cdots,q_t)\begin{bmatrix} 2^{\rho} & x_1 & x_2 & \cdots & x_t \newline 0 & -x_0 & 0 & \cdots & 0 \newline 0 & 0 & -x_0 & \cdots & 0 \newline \vdots & \vdots & \vdots & \ddots & \vdots \newline 0 & 0 & 0 & \cdots & -x_0\end{bmatrix}=(q_02^{\rho},q_0x_1-q_1x_0,\cdots,q_0x_t-q_tx_0)=(q_02^{\rho},q_0r_1-q_1r_0,\cdots,q_0r_t-q_tr_0)\]

记为 \(v\cdot B=w\)

使用LLL算法得到 \(q_02^{\rho}\)后就可以求出\(p\)

HNP


格密码
https://sch01ar.github.io/2023/11/10/lattice/
作者
Roo1e
发布于
2023年11月10日
许可协议