zoukankan      html  css  js  c++  java
  • WMCTF2020密码学部分详解

    比赛网址:WMCTF2020

    一、piece_of_cake

    1. 题目信息

    附件是一个py脚本,Gitee备份中的task.py。

    2. 分析

    eat_cake函数中的各个变量的定义如下:

    • (p,q)为512位随机素数,(ph=(p-1) cdot (q+1),N=p cdot q,d=e^{-1} extrm{mod} ph)

    • (cake)为768位随机素数,(q)重新赋值为1536位随机素数,将(d)的值赋给(f)(g)为随机素数,(g)的位数等于(q)的位数减去(f)的位数再减去1

    • (h=f^{-1} cdot g extrm{mod} q)(r)为512位随机素数,(c=(r cdot h+cake) extrm{mod} q)

    (h=f^{-1} cdot g extrm{mod} q)可得(f cdot h equiv g extrm{mod} q),记为(f cdot h-t cdot q=g),构造矩阵

    [M=egin{pmatrix} 1 & h\ 0 & q end{pmatrix} ]

    则有

    [egin{pmatrix} f & -t end{pmatrix} cdot egin{pmatrix} 1 & h\ 0 & q end{pmatrix} = egin{pmatrix} f & g end{pmatrix} ]

    ( egin{pmatrix} f & g end{pmatrix} )是格(L(M))上的短格基,因此有可能可使用LLL算法或BKZ算法求出,这里说有可能求出,因为在解题时并不是每次都能找到短格基( egin{pmatrix} f & g end{pmatrix} )
    假设我们求出的短格基为( egin{pmatrix} f & g end{pmatrix} ),再由公式(c=(r cdot h+cake) extrm{mod} q)

    (f cdot c equiv f cdot (r cdot h+cake) equiv (r cdot g+f cdot cake) extrm{mod} q)

    从而

    ((r cdot g+f cdot cake)= f cdot c extrm{mod} q)

    两边模(g)可得

    (f cdot cake equiv (f cdot c extrm{mod} q) extrm{mod} g)

    于是

    (cake=f^{-1} cdot (f cdot c extrm{mod} q) extrm{mod} g)

    注意,上面等式中(f^{-1})(f)(g)下的逆,不能与括号内的(f)抵消。

    3. 解题

    上述链接中的solve.sage为解题的sage脚本。

    4. 备注

    此exp并不能保证次次成功!不过它的有效性不可否认,上述链接中的test.sage即可验证。

    以下是我对test.sage四次的运行结果:

    $ sage test.sage
    success! 48 -th
    $ sage test.sage
    success! 2 -th
    $ sage test.sage
    success! 50 -th
    $ sage test.sage
    success! 24 -th
    

    从而验证了解题脚本solve.sage的有效性。

    二、babySum

    1. 题目信息

    附件是两个py脚本与一个json文件,Gitee备份中的task.py与check.py。

    2. 分析

    task.py告诉我们生成data中数据的逻辑,其实很好理解:生成(n=120)个150位的随机数,组成数组(A),从中选(k=20)个相加生成和(s)

    记数组(A=[a_{1},cdots,a_{n}]),check.py读入120个数(b_{1},cdots,b_{n}(b_{i}={0,1})),其中20个为1,另外100个为1,检验(sum_{i=1}^{n}a_{i} cdot b_{i}=s),如果等式成立,就打印出flag。

    到这里我们共有3个约束条件:

    • (sum_{i=1}^{n}b_{i}=k)
    • (sum_{i=1}^{n}a_{i} cdot b_{i}=s)
    • (b_{i}=0,1;i=1,cdots,n)

    遇到这种问题一般转化为格基约减问题,构造矩阵( egin{pmatrix} 1 & & & & a_{1} & 1 \ & 1 & & & a_{2} & 1 \ & &ddots & &vdots &vdots \ & & & 1 & a_{n} & 1 \ & & & & -s & -k & end{pmatrix}=M )

    那么( egin{pmatrix} b_{1} & b_{2} & cdots & b_{n} & 1 end{pmatrix} cdot M=egin{pmatrix} b_{1} & b_{2} & cdots & b_{n} & 0 & 0 end{pmatrix} )

    即通过格基约减可以求出(b_{1},cdots,b_{n})

    理想很丰满,现实很骨感!

    约减后的格基无法达到我们需要的结果!直到看到writeup,这里需要记住一个很有用的技巧,可类比约束优化问题对约束条件的处理,当不满足约束条件(egin{cases} sum_{i=1}^{n}b_{i}=k\ sum_{i=1}^{n}a_{i} cdot b_{i}=s end{cases} )时加大“惩罚”,我们重新设计格基矩阵(M)( egin{pmatrix} 1 & & & & N cdot a_{1} & N \ & 1 & & & N cdot a_{2} & N \ & &ddots & &vdots &vdots \ & & & 1 & N cdot a_{n} & N \ & & & & -N cdot s & -N cdot k & end{pmatrix} )
    其中(N=[sqrt{n}],)
    此时仍然有( egin{pmatrix} b_{1} & b_{2} & cdots & b_{n} & 1 end{pmatrix} cdot M=egin{pmatrix} b_{1} & b_{2} & cdots & b_{n} & 0 & 0 end{pmatrix} )

    然后就是比较玄学的问题,对同一格,改变格基矩阵行的顺序,约减的结果也会不同,官方的writeup就是不断打乱格基矩阵的行,然后进行格基约减;再就是为了更快得到结果,需要进行多线程编程;上述链接中的solve.sage为解题的sage脚本;官方设置的8个线程,我自己改成6个线程,跑了几次,基本上都是20分钟左右出结果。

    $ sage solve.sage   
    (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)
    cost time:  0:25:27
    
  • 相关阅读:
    多线程使用常识
    《30天自制操作系统》实现中文显示
    DDD实践(一)
    为了钱这是很正当的,我跟你干,我要获得一个好的收入,我要改善我的生活,我要提高我的生活质量(转)
    Java对象序列化/反序列化的注意事项(转)
    Java使用Socket传输文件遇到的问题(转)
    大胆采用开源工具(转)
    如果常量类进行改变时,只编译常量类,而使用常量的类不重新编码,这样改动实际上算没有生效(转)
    在html中写python代码的语法和特点-----基于webpy的httpserver
    在Activity中为什么要用managedQuery()
  • 原文地址:https://www.cnblogs.com/coming1890/p/13503520.html
Copyright © 2011-2022 走看看