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