【格密码学】【虚空】格密码学基础学习笔记(上)

前言

这里是我在飞书写给学弟学妹的格密码学基础,用相对通俗易懂的语言介绍了格密码学的基础知识和相关内容,部分内容其实并不是数学上的严谨可证,为了方便阅读将部分概念给通俗化了一些,使得不那么晦涩难懂,毕竟是初学者嘛,理解永远比抠字眼要重要。

OK,这里就来让我详细讲讲简单格密码学。

首先我们不严谨的讲一下什么是格,有了格的概念之后就有格密码学的概念了。

0x00 格的概念

老样子,我们先抛出格(Lattice)的详细定义:
Lattice是 R n R^n Rn这个空间中的一个离散的、具有加法运算的子群(A discrete additive subgroup)
这个定义一看就很让人头大哈,我们先对这个定义的各个名词做个简单的介绍,然后我们一会儿再用我们自己的语言去进行描述。

0x01 空间

首先 R n R^n Rn这个东西是什么,如果把右上角的n去掉,我们对这个符号很熟悉,他代表着实数集合,例如 x ∈ R x \in R xR就是x属于R,让我们用幂的概念拓展一下,显然,在幂运算里, R 1 = R R^1=R R1=R,n=1的时候就是全体实数集合,我们数形结合的时候可以表示为数轴的形式。
或者为了方便,我们把他写成点的形式,由于是一维数轴,在上边的点通常去掉括号,我们给他补回来,写成(x)

那么R²表示的是什么呢?我们可以类比为平面直角坐标系,平面直角坐标系就是有两个数轴垂直得来的,上边的点我们记为(x,y),那么这个点在平面直角坐标系上,我们可以写为 ( x , y ) ∈ R 2 (x,y) \in R^2 (x,y)R2
同理,在立体坐标系中, ( x , y , z ) ∈ R 3 (x,y,z) \in R^3 (x,y,z)R3
n其实就是表示的维度,例如在n维的坐标系中, ( a 1 , a 2 , a 3 , … , a n ) ∈ R n (a_1,a_2,a_3,\dots,a_n) \in R^n (a1,a2,a3,,an)Rn
当然,当n大于3的时候,"点"这个传统的概念已经不太适合了,我们把这个点称作一个 向量 a a a,把 R n R^n Rn称作一个空间,其中的每一个点(向量)的坐标都有n个数,且每个数都是实数。
当然拓展延伸一下, Z n Z^n Zn也是常用的,表示的是n维的全体整数集合。
OK,这是第一个概念,其实非常好理解对吧,就是一个n维坐标,其中每一个数都是实数而已。

0x02 离散

然后是第二个概念,离散。

首先要明确,离散指的是什么,我们类比函数的连续性做个定性的描述,首先要明确,Rn(不想打数学公式了,大概看懂指的是什么就行)空间一定是连续的,譬如n=2的时候是平面直角坐标系,如果他不是连续的,那么我们压根没办法在上边画出连续的函数。
又或者是数轴,我们任意找一个实数,都在数轴上,这就是连续的大概意义,那么什么是离散呢?
数轴是连续的,但是自然数是在R上离散的,这里指明R是因为一些更深层次的严谨。(后边的解释可以不看:因为如果不指明R,我们可以取自然数集合Z,Z的无穷小是1,Z上任意一个数加上无穷小(1)都在Z上,自然是连续的)
言归正传,离散就是这样一个概念,他不是连续的,是一个个分开的点,加上一个无穷小之后不是下一个预想的值。

0x03 群

然后简单讲一下群的概念,简单来说,一个集合记为G,加上一种运算记为X,在满足一些性质的时候,就构成了群。
这里的性质有四条,下面的字母符号都属于集合G:
有单位元e(就是我们通常意义上的单位"1"),即 a X e = a aXe=a aXe=a
任意一个数b有逆元 b − 1 b^{-1} b1,即 b − 1 X b = e b^{-1}Xb=e b1Xb=e,这里的e就是上边的单位元
满足结合律,即 a X ( b X c ) = ( a X b ) X c aX(bXc)=(aXb)Xc aX(bXc)=(aXb)Xc
运算X在集合G上封闭,即无论你任取G中的元素进行X运算,得到的结果一定还是属于集合G的。
你不能两个运算完得到的结果不在G中了,举个最常见的例子,开根号,3是整数,但是根号三是无理数,所以开根号这个运算不能和整数集合构成一个群。
例如整数集合Z,加上 “加法运算”就构成了整数加法群。

0x04 子群

那什么是子群呢?子群没听说过,子集听说过吧,永远不要忘了群的本质还是集合,子群就比子集多了一点要求,子群自身也得是个群,他也要满足上边的几条性质。
例如集合G { 1 , − 1 , i , − i } \{1,-1,i,-i\} {1,1,i,i}在乘法上就是一个乘法群,这里的i是复数i
大家可以试着算一下,我这里简单说一下,不想看可以跳过
我们先变一下形, − 1 = i 2 , − i = i 3 , 1 = i 4 -1=i^2,-i=i^3,1=i^4 1=i2,i=i3,1=i4,那么原集合可以写为 { 1 , i , i 2 , i 3 } \{1,i,i^2,i^3\} {1,i,i2,i3}
你任取两个数进行乘法运算,譬如 i 2 ∗ i 3 = i 5 = 1 ∗ i = i i^2 * i^3 = i^5 = 1*i = i i2i3=i5=1i=i在集合G中,满足封闭性
乘法自然满足结合律,单位元是1
1的逆元是他自身,i的逆元是i的三次方,i平方的逆元是他自身,i的三次方的逆元是i
满足定义,那么G是一个群
那么我们再来考虑集合E={1,-1}
E显然在乘法运算上也是一个群,这个大家自己一试便知。你要真不会算就@虚空guoql 我教你算
而且注意到E是G的一个子集,两者都是群,那么我们可以称E为G的一个子群,严谨一点可以称作E是G的一个具有乘法运算的子群。

0x05 格定义的另一种表示

好了,这下格的严谨定义的名词我们就解释完了。很显然我感觉懂得还是懂,不懂的还是不懂。让我们形象一点,还是拿最熟悉的平面直角坐标系来举例子,我们把平面直角坐标系上的整数点全部标出来,并定义向量加法,显然平面直角坐标系和向量加法构成了一个群,而且这些整数点和向量加法也构成了一个群,并且这些点是离散的,恭喜你,你找到了二位的格,就是这些点。
我们用某乎上的一张图做演示
image1

e1,e2这两个向量暂时不用管,我们马上就要介绍了。

请注意,我们下边的介绍全部是二维情况下的,当然肯定可以推广到N维。
让我们回到平面直角坐标系上来,并且忘掉所有群的东西,就回归高中,回归向量的思维即可。
对于平面直角坐标系上的任意一点(a,b),都可以写为 a i + b j ai+bj ai+bj的形式,其中i,j是两个向量,分别为 i = ( 0 , 1 ) , j = ( 1 , 0 ) i=(0,1),j=(1,0) i=(0,1),j=(1,0),这是很显然的,根据向量的加法和乘法就可以得到这个结论。

0x06 基向量

然后我们思考向量共线,高中知识告诉我们,向量共线当且仅当 i = k j , k ∈ R i=kj,k\in R i=kj,kR的时候,类比平面直角坐标系,我们不禁想问,为什么i和j必须是这两个值?我能不能把他化为其他任意值?事实上当i和j不共线时,是可以的,并且总能够表示平面直角坐标系上的任意一点。
那么更进一步,我们可以竖着写,把 i = ( x i , y i ) i=(x_i,y_i) i=(xi,yi) j = ( x j , y j ) j=(x_j,y_j) j=(xj,yj)给竖起来并合起来,写成 [ x i , x j y i , y j ] \begin{bmatrix} x_i,x_j \\ y_i,y_j \end{bmatrix} [xi,xjyi,yj]的形式,是的,这就是矩阵,矩阵的某种意义就是表示的将空间进行转换,例如这里就是将平面直角坐标系转为平面坐标系,因为新的i,j可以不互相垂直。所以没有直角了。
然后,我们给i和j起个新名字,叫他们为基向量,这样我们就可以将一个空间用基向量进行描述了。
当然,这是二维情况,n维也是一样的,无非就是有n个基向量,并且任取两个不同的基向量之间肯定不平行,或者用线性代数讲就是线性无关。如果两个向量平行了,那么就代表着有一个坐标值无法表示了。

或者更进一步的证明(这里可以不用看,跟格没关系,并且我要用线性代数的知识了),如果两个向量平行,我们称作线性相关,如果一个空间的基向量中存在线性相关,那么这个空间会坍缩,有几个线性相关就坍缩几个维度。这里其实牵扯到了行列式的值的含义,在空间中,基向量所组成的矩阵的行列式的值表示为该空间中一块的大小。如果存在线性相关了,那么行列式的值为0,那么这个块的大小也为0,这个块大小是什么东西下边会谈,总之,如果块为0了,那么所有点都会坍缩在原点O上,即不存在n维空间了,直到我们删去所有的线性相关的基向量,才能构成其空间。(额外bb:那么这时候这些基向量构成了极大线性无关组)

OK,有了这些知识,我们就可以解释上图的e1,e2到底是什么妖魔鬼怪了,其实就是构成了这个平面坐标系的基向量,而且由于上图的格(点)是在坐标系上选取整数点得到的,所以如果我们改变基向量,这些整数点都会变化,如下图
image2

当然我们可以随意更改基向量的值,只要不是平行的就行。
image3

图中那些绿色的点就是格。

0x07 格密度

OK,接下来我们要介绍格的一个概念,格的密度。
老样子,简单介绍一下格的密度是怎么来的,在格所张成的空间Rn中任取一点,注意这一点可以任取,不用必须是格点,从这点出发向空间内任意方向均散射一个长度为r的向量,其构成的图形的体积记为S,基向量组成的矩阵的行列式大小记作D,那么格点密度φ当r足够大时为 φ = S D \varphi = \frac{S}{D} φ=DS
其实上边的S就是一个球(高维空间称作一个超球体),而行列式的值D其实就是一个下图中灰色P的区域的面积(体积),由于我没有想到好的办法在不引入线性代数的基础上解释为什么是行列式的值,所以如果你不能理解,就记住就好了。
image4

而几何意义其实很好理解,无非就是我选取一片空间数数里边有多少个点罢了,只不过我们没办法直接数点,只能用体积相除的方式来进行约算,所以这也就是为什么上边要求r足够大了,否则只是估计,下图为了说明我们其实数的是格点,将网格稍微平移了一下,使得格点在网格中心。
image5

如果你是好奇宝宝,想要知道超球体的体积怎么来的,我不拦你,壮士好走(超球体公式推导
这里直接给出公式
V n = A n r n V_n = A_nr^n Vn=Anrn,其中 A n = π n 2 ( n 2 ) ! A_n = \frac{\pi^{\frac{n}{2}}}{(\frac{n}{2})!} An=(2n)!π2n,这里边的阶乘要用伽马函数来算,为了美观,这里直接给出伽马函数的两个性质就能算了。你不用去思考什么是伽马函数(好奇宝宝除外),由于伽马函数那个符号比较难打,我用F(x)代替,对于伽马函数,有以下结论:
F ( x ) = ( x − 1 ) ! F(x) = (x-1)! F(x)=(x1)!在原来阶乘定义里x只能为整数,现在可以为正实数了
F ( x ) = ( x − 1 ) ∗ F ( x − 1 ) F(x) = (x-1)*F(x-1) F(x)=(x1)F(x1)
F ( 1 2 ) = π F(\frac{1}{2})=\sqrt{\pi} F(21)=π

我们可以验算超球体公式的正确性,例如n=3时, ( 3 2 ) ! = ( 5 2 − 1 ) ! = F ( 5 2 ) (\frac{3}{2})! = (\frac{5}{2} - 1)! = F(\frac{5}{2}) (23)!=(251)!=F(25)
F ( 5 2 ) = 3 2 ∗ F ( 3 2 ) = 3 2 ∗ 1 2 ∗ F ( 1 2 ) = 3 4 ∗ π F(\frac{5}{2}) = \frac{3}{2}*F(\frac{3}{2}) = \frac{3}{2} * \frac{1}{2}*F(\frac{1}{2}) = \frac{3}{4}*\sqrt{\pi} F(25)=23F(23)=2321F(21)=43π
A 3 = π 3 2 F ( 5 2 ) = π 3 2 3 4 ∗ π 1 2 = 4 3 π A_3 = \frac{\pi^{\frac{3}{2}}}{F(\frac{5}{2})} = \frac{\pi^{\frac{3}{2}}}{\frac{3}{4}*{\pi}^{\frac{1}{2}}} = \frac{4}{3}\pi A3=F(25)π23=43π21π23=34π
所以 V 3 = 4 3 π r 3 V_3 = \frac{4}{3}\pi r^3 V3=34πr3
就是球体体积,当然你可以验算n=2的时候,就不用伽马函数了
A 2 = π 1 ! = π A_2 = \frac{\pi}{1!} = \pi A2=1!π=π
V 2 = π r 2 V_2 = \pi r^2 V2=πr2
就是圆的面积。

然后我们思考这样一个问题,对于格中的一个点,距离他最近的一个点的距离是多少?或者用几何语言来说,我们希望以格上一点为圆心,画一个半径为r的圆,使得格上另一点能够在圆上,那么r的最小值是多少?
image6

譬如这个图里,这里r就是λ1,当然依次类推,次小值就是λ2,等等等等
那么我们如何表示这个值?
我们用欧式距离来表示,即对于两个n维向量x和y,其欧式距离表示为
∣ ∣ x − y ∣ ∣ = ∑ i = 1 n ( x i − y i ) 2 ||x-y|| = \sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} ∣∣xy∣∣=i=1n(xiyi)2
那么对于两个距离最近的格点x和y也一样,即
λ 1 = ∣ ∣ x − y ∣ ∣ \lambda_1 = ||x-y|| λ1=∣∣xy∣∣

格密码学初步

OK,这就是格密码学最基本的东西了,那么我们接下来,就要讲,我们构造格有什么用?
这就要讲到我们的两个格上难题了,一个是SVP问题,一个是CVP问题。格密码学的安全性由这两个困难问题所保障,只要这两个问题没有解决,那么在一定程度上,其对应的密码体系就是安全的。

在讲SVP问题之前,我们需要一些定义,我们现在定义格上向量v为从格上一点指向格上另一点的向量。
有了这个定义,我们可以给出SVP问题(Shortest Vector Problem,最短向量问题)的定义:
在格中寻找一个最短的非零向量,即寻找一个向量 v∈ L,使得它的欧几里得范数 ||v|| 最小
即对于任意一个格L,要找到向量v,使得他的模是最小距离

(到这里戛然而止惹,剩下的回头再继续更,先把基础打好,下一篇开LLL高斯启发式之类的东西,还有背包问题的算法)

图片参考链接:知乎lattice基础

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值