GACTF2020密码学部分详解


前言

比赛网址:GACTF2020
writeup参考链接

一、ezAES

1.1. 题目信息

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

1.2. 分析

整体浏览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\)

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问题一样求解\(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;

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\ \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的思路链接

4.3. 解题

上述GitHub备份链接中的solve文件夹中为解题的脚本,解题分两步;第一步,解出secret;第二步,求解方程\(c\equiv m^{e}\ \textrm{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,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,从而可以求解此离散对数问题;

5.3. 解题

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

程序运行结果如下:

$ python step1.py
435393448000740628395634230535241428961470055780764193459123534837759996

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

$ sage solve.sage
gactf{354b6ce4c03387a828a3c30061213204}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM