文章目录
  1. 前言
  • ezAES
    1. 题目信息
    2. 分析
    3. 解题
  • what_r_the_noise
    1. 题目信息
    2. 分析
    3. 解题
  • da Vinci after rsa
    1. 题目信息
    2. 分析
    3. 解题
  • elgamal_rsa
    1. 题目信息
    2. 分析
    3. 解题
  • babycrypto
    1. 题目信息
    2. 分析
    3. 解题
  • 前言

    比赛网址:GACTF2020
    writeup参考链接

    ezAES

    题目信息

    附件是一个Python脚本,Gitee备份的challeng.py。

    分析

    整体浏览Python脚本后,可得此题考察CBC分组加密工作模式;总结一下脚本给出的信息:

    • key给出前14位(key长16位,即最后2位未知)
    • message的长度为86字节,因此明文最后一组填充10个’\n’
    • 密文最后一组给出后10个字节

    因此,可穷举key的最后2位,每一位考虑所有可打印字符,有100种可能,因此穷举key的最后2位有$10^{4}$种可能,处于合理范围;对每一个key,解密最后一组密文,将解密出的明文后10位与上一组密文后10位异或,若异或后均为’\n’,则说明穷举出正确的key;
    解出正确的key之后,可按照同样的方式计算出SECRET,从而获取整个明文;
    已知所有明文之后,由CBC工作模式:$m_{i}=D(c_{i};key)\oplus c_{i-1},i=n,\cdots,1$,其中$c_{0}=IV$,那么已知最后一组密文,就可以递推出IV:$c_{i-1}=D(c_{i};key)\oplus m_{i},i=n,\cdots,1$

    解题

    上述链接中的solve.py为解题的Python脚本;

    程序运行结果如下:

    1
    2
    3
    $ python solve.py
    [+] MBruteforcing: Found key: "pd"
    9j_for_aes_cbc!!

    what_r_the_noise

    题目信息

    噪音太大,听不见,China:124.71.145.165:9999(现在应该已经失效了)。

    分析

    大致意思是服务器返回的数据是加入了噪声的,让你去掉噪声,解出正确的明文;有点概率论知识应该想到获取多次数据取平均值。

    解题

    解题的Python脚本在Gitee备份中;

    解出的flag可能不完全正确,但是你基本可以猜出是什么单词了!

    最后得到flag为gactf{you_know_much_about_differential_privacy}

    da Vinci after rsa

    题目信息

    附件中包含两个文本文件encryption与output;encryption中是一列数,output给出“RSA公钥”与密文;Gitee备份

    分析

    da Vinci翻译了一下(英语不好)是达芬奇,这既然是密码学题目,自然去查了一下达芬奇密码,发现这是一本书,在网上不停地查这本书,找到一个片段,“打乱的数字”一下引起我的注意,后面马上提到“斐波那契数列”,回去一看,encryption中的那一列数确实是打乱的斐波那契数列,到此encryption的作用弄明白了;

    接下来将公钥的模数N放到yafu中分解,得到三个因子;但是我想,不怕,和RSA问题一样求解$d\equiv e^{-1}\ \textrm{mod}\ \phi(N)$即可解出$m\equiv c^{d}\ \textrm{mod}\ N$,编好程序运行时发现$e$在$\phi(N)$下没有逆,这一下子就不知道怎么办了,其实这样的方程也是有办法求解的,求解思路链接在此

    解出的$m$虽然有多个,但是flag每个字符都是可见字符,这样最后只剩下一个$m$,这还不是flag;花括号内正好25个字符,encryption中正好25个数,按照一样的规则打乱花括号内的25个字符即得到真正的flag;

    解题

    上述GitHub备份链接中的solve.sage脚本为解题的sage脚本;

    程序运行结果如下:

    1
    2
    $ sage solve.sage
    flag{w5awd4fa994f87_dwad3123_2}

    elgamal_rsa

    题目信息

    附件是一个Python脚本,Gitee备份

    分析

    $g^{q}\equiv 1\ \textrm{mod}\ p,h\equiv g^{d}\ \textrm{mod}\ p$

    $c_{1}\equiv g^{r_{1}}\ \textrm{mod}\ p,c_{2}\equiv m\cdot h^{r_{1}}\ \textrm{mod}\ p$

    $c_{11}\equiv g^{r_{2}}\ \textrm{mod}\ p,c_{22}\equiv m\cdot h^{r_{2}}\ \textrm{mod}\ p$

    其中,$r_{2}\equiv (B\cdot r_{1}+A)\ \textrm{mod}\ q$

    这里的$m$就是$secret$,$secret$是下面“RSA”加密的模数,因此首先要解出$secret$,这也是很好解的;

    $c_{2}^{B}\cdot h^{A}\equiv (m\cdot h^{r_{1}})^{B}\cdot h^{A}\equiv m^{B}\cdot h^{B\cdot r_{1}+A}\equiv m^{B-1}\cdot c_{22}\ \textrm{mod}\ p$

    $m^{B-1}\equiv c_{2}^{B}\cdot h^{A}\cdot c_{22}^{-1}\ \textrm{mod}\ p$,计算$t\equiv (B-1)^{-1}\ \textrm{mod}\ (p-1)$

    那么$(c_{2}^{B}\cdot h^{A}\cdot c_{22}^{-1})^{t}\equiv m\ \textrm{mod}\ p$

    解出$secret$后,放到yafu里面分解(因子是真的多,一度怀疑自己解错了),求解flag的思路链接

    解题

    上述GitHub备份链接中的solve文件夹中为解题的脚本,解题分两步;第一步,解出secret;第二步,求解方程$c\equiv m^{e}\ \textrm{mod}\ N$($m1$);

    程序运行结果如下:

    1
    2
    $ python step1.py
    329380824451982777596468080979390700896875051159309053251427777390225223390054462862874890632092714850180031743329031313028975903871751004003831036860000454098274963081490031808010876171935539110201531253322208564941373067673598629247111527738724700328114569409692796434368030258427126193825227856160081569366870307559297674909108870298864572520476006338972072593434914773857347865349086098662711283463352902488164071184362082990162654586995346553108747183805073294471613391819978413596510467204977114038549473397779377039088475929677184284430986636686769839308217865627271293739711926018699557041530631349486791876338842184994986024157099233298972714917732995013317087756483
    1
    2
    $ sage step2.sage
    you_4re_good_at_b0th_el94mal_and_rs4

    babycrypto

    题目信息

    附件是一个Python脚本,Gitee备份

    分析

    在GF(p)上定义的点集$\{(x,y)|x,y\in GF(p)\}$上定义加法”+”:$(x_{1},y_{1})+(x_{2},y_{2})=(x_{1}x_{2}-y_{1}y_{2},x_{1}y_{2}+x_{2}y_{1})$,定义乘法”$\cdot$”:$k\cdot (x,y)=(x,y)+\cdots +(x,y)$

    给出基点g,$A=a\cdot g,B=b\cdot g$,给出A,B;

    $shared=b\cdot A$,再利用shared生成AES密钥进行加密;

    p未知!!!先介绍Edwards曲线E:$x^{2}+y^{2}\equiv 1+dx^{2}y^{2}\ \textrm{mod}\ p$,曲线上的加法定义为$(x_{1},y_{1})+(x_{2},y_{2})=((x_{1}y_{2}+x_{2}y_{1})/(1+dx_{1}x_{2}y_{1}y_{2}),(x_{1}x_{2}-y_{1}y_{2})/(1-dx_{1}x_{2}y_{1}y_{2}))$

    令d=0,则E:$x^{2}+y^{2}\equiv 1\ \textrm{mod}\ p$,则加法重写为$(x_{1},y_{1})+(x_{2},y_{2})=(x_{1}y_{2}+x_{2}y_{1},x_{1}x_{2}-y_{1}y_{2})$

    若我们设定d=0,那么$A(x_{1},y_{1}),B(x_{2},y_{2})$满足方程$x^{2}+y^{2}\equiv 1\ \textrm{mod}\ p$,求$x_{1}^{2}+y_{1}^{2}-1$与$x_{2}^{2}+y_{2}^{2}-1$的公约数,则p是其最大素因子;

    下面考虑如何解出b,这是一个离散对数问题,难点是sage并未实现Edwards曲线及其运算;

    给出一个有用的结论:$\{(x,y)|x,y\in GF(p),x^{2}+y^{2}\equiv 1\ \textrm{mod}\ p\}$与$H=F_{p}(w)/(w^{2}+1)$(有限域$F_{p}$上的多项式在模$w^{2}+1$下的剩余环)同构,同构映射$\sigma :E\rightarrow H$,$\sigma((x,y))=x+yw$

    在sage中通过extend函数就可以生成H,从而可以求解此离散对数问题;

    解题

    上述GitHub备份链接中的solve文件夹中为解题的脚本,解题分两步;第一步,解出p;第二步,解出b然后以同样的方式生成AES密钥再对消息进行解密;

    程序运行结果如下:

    1
    2
    $ python step1.py
    435393448000740628395634230535241428961470055780764193459123534837759996

    使用yafu分解,可得到p(在solve.sage中有给出)

    1
    2
    $ sage solve.sage
    gactf{354b6ce4c03387a828a3c30061213204}