• GACTF2020密码学部分详解


    前言

    比赛网址:GACTF2020
    writeup参考链接

    一、ezAES

    1.1. 题目信息

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

    1.2. 分析

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

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

    因此,可穷举key的最后2位,每一位考虑所有可打印字符,有100种可能,因此穷举key的最后2位有(10^{4})种可能,处于合理范围;对每一个key,解密最后一组密文,将解密出的明文后10位与上一组密文后10位异或,若异或后均为' ',则说明穷举出正确的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)

    1.3. 解题

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

    程序运行结果如下:

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

    二、what_r_the_noise

    2.1. 题目信息

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

    2.2. 分析

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

    2.3. 解题

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

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

    最后得到flag为gactf{you_know_much_about_differential_privacy}

    三、da Vinci after rsa

    3.1. 题目信息

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

    3.2. 分析

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

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

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

    3.3. 解题

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

    程序运行结果如下:

    $ sage solve.sage
    flag{w5awd4fa994f87_dwad3123_2}
    

    四、elgamal_rsa

    4.1. 题目信息

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

    4.2. 分析

    (g^{q}equiv 1 extrm{mod} p,hequiv g^{d} extrm{mod} p)

    (c_{1}equiv g^{r_{1}} extrm{mod} p,c_{2}equiv mcdot h^{r_{1}} extrm{mod} p)

    (c_{11}equiv g^{r_{2}} extrm{mod} p,c_{22}equiv mcdot h^{r_{2}} extrm{mod} p)

    其中,(r_{2}equiv (Bcdot r_{1}+A) extrm{mod} q)

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

    (c_{2}^{B}cdot h^{A}equiv (mcdot h^{r_{1}})^{B}cdot h^{A}equiv m^{B}cdot h^{Bcdot r_{1}+A}equiv m^{B-1}cdot c_{22} extrm{mod} p)

    (m^{B-1}equiv c_{2}^{B}cdot h^{A}cdot c_{22}^{-1} extrm{mod} p),计算(tequiv (B-1)^{-1} extrm{mod} (p-1))

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

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

    4.3. 解题

    上述GitHub备份链接中的solve文件夹中为解题的脚本,解题分两步;第一步,解出secret;第二步,求解方程(cequiv m^{e} extrm{mod} N)((m<N)(N)已被分解,但是((e,phi(N))>1));

    程序运行结果如下:

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

    五、babycrypto

    5.1. 题目信息

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

    5.2. 分析

    在GF(p)上定义的点集({(x,y)|x,yin 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)":(kcdot (x,y)=(x,y)+cdots +(x,y))

    给出基点g,(A=acdot g,B=bcdot g),给出A,B;

    (shared=bcdot A),再利用shared生成AES密钥进行加密;

    p未知!!!先介绍Edwards曲线E:(x^{2}+y^{2}equiv 1+dx^{2}y^{2} extrm{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 extrm{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 extrm{mod} p),求(x_{1}^{2}+y_{1}^{2}-1)(x_{2}^{2}+y_{2}^{2}-1)的公约数,则p是其最大素因子;

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

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

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

    5.3. 解题

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

    程序运行结果如下:

    $ python step1.py
    435393448000740628395634230535241428961470055780764193459123534837759996
    

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

    $ sage solve.sage
    gactf{354b6ce4c03387a828a3c30061213204}
    
  • 相关阅读:
    [THREEJS]坐标高精度问题
    纹理的寻址方式
    [1009]JS语言精髓与编程实践笔记1
    万向锁
    (转)primitive restarting
    西藏游记
    平衡二叉树(AVL tree)
    初探redis事务
    redis发布与订阅
    初探redis分布式锁
  • 原文地址:https://www.cnblogs.com/coming1890/p/13590843.html
Copyright © 2020-2023  润新知