BUAA 2039 LAB4 格论与同余密码体制

参考:Lattice学习笔记02:格中难题 - 知乎

            信安数基QUIZ1思路 – lihaooo's blog

             https://xz.aliyun.com/t/7163

求解目标

          首先从代码里抽取出下面这个等式:

                                                     h\equiv f^{-1}g\mod p

 同乘f^{-1}有:                        

                                                   fh\equiv g\mod p                           ···························(1)

 此外加密时可以得到等式:
                                                      e\equiv rf^{-1}g+m \mod p

 一样同乘f^{-1}有:

                            ​​​​​​​        ​​​​​​​        ​​​​​​​        fe\equiv rg+mf\mod p

 考虑(1)式(f,g)可得到:
                                                     f h=kp+g                             ···························(2)

 从向量的角度来看(2)式,巧妙地构造如下两个二维向量\alpha _1,\alpha _2
                                                     \alpha _1=(1,h)     \alpha _2=(0,p)

 那么向量(f,g)可以用\alpha _1,\alpha _2表示

                                                     (f,g)=f\alpha _1-k\alpha _2

        我们的目标就是通过\alpha _1,\alpha _2求解出(f,g) ,这里需要了解一些关于格的知识,如SVP问题、高斯启发、高斯格基规约算法

线性代数的基础

        学好线代很重要.......但我基本都忘了,只好再复习一遍(wuwuwu)。原来线代里在群和域有很不错的例子。

线性无关

        给出向量组\alpha _1\alpha _2\alpha _3...\alpha_n,若有

                                               \alpha _i\neq k_1\alpha _1+k_2\alpha _2...k_n\alpha _n

        即\alpha _i不能写成线性组合的形式,那么说\alpha _1\alpha _2\alpha _3...\alpha_n线性无关

        线性无关可以写成线性方程组的形式:

                记矩阵A=[\alpha _1,\alpha _2, \alpha _3,...,\alpha _n]\alpha _1\alpha _2\alpha _3...\alpha_n线性无关等价于方程组Ax=0只有唯一

         解x=0
 

基向量

        基向量是一组线性无关且可以生成某个空间的一组向量

施密特正交化

       将线性无关的向量组化为正交向量组(两两作内积为0),具体方法如下:

       设\alpha _1,\alpha _2为原始向量组,\beta _1,\beta _2为正交化之后的向量(这里不用将其单位化)

                       令                      \beta _1=\alpha _1       \beta _2=\alpha _2-k_1\beta_1

                      根据正交有

                                                            \beta _1* \beta _2=0

                      即                            \alpha _1(\alpha _2-k_1\beta _1)=0

                      解出                               k_1=\frac{\alpha _1\alpha _2}{|\alpha _1|^2}

                      所以                              \beta _2=\alpha _2-\frac{\alpha _1\alpha _2}{|\alpha _1|^2}\alpha _1

         这一点将会用于高斯格基规约化算法

格的定义与相关问题

       在m维欧氏空间上给出n维线性无关的向量组\alpha _1,\alpha _2,\alpha _3.....\alpha _n,由它们生成的整系数线性组合k_1\alpha _1+k_2\alpha _2+...+k_n\alpha _n的集合称为格,记为L,同时记向量组\alpha _1,\alpha _2,\alpha _3.....\alpha _n为格基B

                                                  L(B)=\sum_{I=1}^{n}k_i\alpha _i

       与一般的线性空间不同的是,格是由整系数线性组合生成的,而不是在实数域上选取的。那么我们可以将格看作是线性空间上一些离散的向量,如下图所示:

         上图表示格L的基B为i,j,由i,j的整数线性组合生成的是蓝色的点,这些离散的点共同构成了格L

SVP问题

       正是由于格是离散的向量组成,那么这里面一定存在非零模长最短的向量。求解该向量称为SVP问题。在低维度的格,求解该问题是可行的。实际上,LAB4就是求解二维格的最短向量。

高斯启发式

     不加证明地给出最短向量长度\nu _{min}的估计值:

                                                  \nu _{min}=\sqrt{\frac{n}{2\pi e}}(det L)^{\frac{1}{n}}

   其中n为格的维度,det L为格的行列式,格的行列式定义如下:
           设B是格L的基,那么B构成一个矩阵

                                                        B=[\alpha _1,\alpha _2,...,\alpha _n] 

           则我们定义                             detL=|detB|                          其中 |detB|为B的行列式绝对值

 最短向量的模长下界

             \widetilde{B}=[\widetilde{b_1},\widetilde{b_2},...,\widetilde{b_n}]是格基B=[b_1,b_2,..,b_n]的施密特正交化,那么最短向量的下界为:

                                          \nu _{min}\geq min{||\widetilde{b_i}||}, i=0,1,2,...,n               其中||\widetilde{b_i}||\widetilde{b_i}的模长

高斯格基规约算法

        由最短向量的下界可知,求解最短向量可化为求解最短的正交基。在线性空间的施密特正交化方法可以得出

                                                        \beta _2=\alpha _2-\frac{\alpha _1\alpha _2}{|\alpha _1|^2}\alpha _1

然而求解该问题得到的系数k_1=\frac{\alpha _1\alpha _2}{|\alpha_1|^2} 并不一定是整数,这样不满足格对整系数线性组合的要求

于是就有了高斯格基规约算法:

         类似于欧几里得算法求最大公约数,高斯算法也是不断进行“辗转相除”:

                  首先在二维格L中,设格基为v_1,v_2  且|v_1|<|v_2|

                  利用    k_1=\lceil\frac{\alpha _1\alpha _2}{|\alpha_1|^2}\rceil     代替     \frac{\alpha _1\alpha _2}{|\alpha_1|^2}

                  然后利用施密特正交化可以解出

                                                 v_2^*=v_2-\lceil\frac{\alpha _1\alpha _2}{|\alpha_1|^2}\rceil v_1

                如果|v_2^*|>|v_1|,那么算法结束,否则交换v_2^*,v_1继续正交化,最后得出的结果v_1就是最短

                非零向量

       我个人认为算法的大致原理就是通过类似施密特正交化不断地将一个格基向量作线性变换,每次变换得到的结果都在逼近于正交基。

        注意:在线性空间中,基做线性变换并不能得到变换后的还是一组基,但是当线性变换的核\sigma ^{-1}(0)={0}时,映射之后还是一组基。这里的核在群论的视角看就是正规子群。但是高斯算法没有将每一个基作线性变换,而是只对其中一个变换,得到的v_1,v_2^*仍然是一组基。

        至于算法的正确性,参考:格基规约算法:算法详解_su1yu4n's Blog-CSDN博客_格基规约

高斯算法如下,参考lihao的代码:

import numpy as np
def GLR(a,b):
    if a @ a > b @ a:  
        a, b = b, a
    m = (a @ b) // (a @ a)    # @符号即为量向量点乘,计算施密特正交化的系数
    while m > 0:
        b = b - m * a
        if a @ a > b @ b:
            a, b = b, a
        m = (a @ b) // (a @ a)
   return a

LAB4

        首先对(f,g)进行估计,猜测其就是要求的最短向量(不确定是否有数学方法直接证明是(f,g)就是最短向量,这里只能先猜测估计)

       根据高斯启发给出的估计值,先计算基矩阵B的行列式值

                                      |B|=|\alpha _1,\alpha_2|=\begin{vmatrix} 1 &0 \\ h& p \end{vmatrix},where: \alpha_1=\binom{1}{h},\alpha_2=\binom{0}{p}

        可以算出最小的向量模长在p附近,同样在代码里给出的范围,发现

                                                                |(f,g)|\leq p

        所以猜测(f,g)就是最短的向量

        代码如下,"借鉴"lihaoooo的代码(手动狗头):

from libnum import n2s,invmod
import numpy as np

def func(e, f, g, q):
    a = (f * e) % q
    b = (invmod(f, g) * a) % g
    return n2s(b)


def GLR(h, q):
    a = np.array([1, h], dtype=object)  
    b = np.array([0, q], dtype=object)
    if a @ a > b @ a: 
        a, b = b, a
    m = (a @ b) // (a @ a)
    while m > 0:
        b = b - m * a
        if a @ a > b @ b:
            a, b = b, a
        m = (a @ b) // (a @ a)
    (f, g) = a
    return f, g


e=48953801553956075632630973525713256336678525493000461583515578737484335752866054745032875148523940930815671297944556770294647342931586523862235049355437962717298443021620612871828326212526353675586983455347376619665675133788140124881419206246849076991960211099984639980187450574216593522602772954227058146628
public = (
    93608760163776111600863892826402691327519685094787906078746228077571092521304859442042456730909349785689012146093193253902807071155381352862768229328037820332815675322315117655139453490127179129628411522424188523742244679612622892809260922425808662067275656156484642984826411084304557228322662340507691788187,
    64368557732138634874513838535508558186827301262837820980941444795968457904383650242005576157872393467551461621029526150327355155845775238340889139580533053629136238729532953235835489170694435285713143025428178403803981561282204618848861297267176084408551460029890017500515417082756129583125574305678548485412)
q, h = public
f, g = GLR(h, q)

# f,g=(5757417223335213455957769909472949689244437567260338949667212415336770281702458911397296283119947916250854554668903077755211962319976997781105452685944734 ,5696879148822213991671548047430119693046517873220919339547277415084747545432938774463358955765949728198554500808728640503617161495190933986520108322621869)
print(func(elf,g,q))

          

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值