BUUCTF 每日打卡 2021-8-25
引言
前几天打了祥云杯,成绩还行,四道Crypto解了三道,最后一道懒得解了。线下应该稳了,但是和数学建模国赛冲突了去不了( 昨天把buu第四页刷完了
[NCTF2019]Reverse
加密代码如下:
1 | import os |
考察des加密算法 加密代码给出了第十个子密钥 根据加密算法,原64位密钥要经过置换得到56位密钥,再经过置换得到48位密钥,然后分段位移,得到16个子密钥 已知其中一个子密钥,要还原第二轮置换前的密钥,总共有\(2^8\)种情况,而继续还原原密钥,总共有\(2^{16}\)种情况,还可以接受 给出两种解法:一、还原原密钥;二、还原全部子密钥 解法一代码如下:
1 | import pyDes |
跑了几分钟,得到结果: 第二种解法代码如下:
1 | import pyDes |
参考了大佬的解法,其中key
只要是八位字符就行 得到结果:
[祥云杯 2021]Random_RSA
一道送分题 加密代码如下:
1 | from Crypto.Util.number import * |
由于如果random.seed
是一定的,那么生成的随机数就是一定的,题目给出了seed
,就可以还原dp
,进而进行RSA解密 获取dp
不能在python3下运行,需要在python2下得到随机数 代码如下:
1 | # python2 |
得到dp后,解密代码如下:
1 | from Crypto.Util.number import * |
结果为:
参考我2021-4-5的博客
[祥云杯 2021]myRSA
加密代码如下:
1 | # myRSA |
可以发现encry
函数返回x * c + y * c + z
因为 \[
\begin{cases}
x = p^2(p + 3*q - 1 ) + q^2 (q + 3p - 1) \\
y = 2pq + p + q
\end{cases}
\] 所以 \[
x+y = (p+q)^3-(p+q)^2+(p+q)+4pq
\] 就是这个z比较烦人 记c1 = x * c + y * c + z
,若\(c>z\),z//c=0
,而c = pow(b2l(message),e,p*q)
,z的位数大约为1040为,所以是有可能的 c是可以由已知量和输入得到,就可以得到\(c1//c=x+y\),又因为\(n=pq\)也是已知的,就可以求出p+q 再利用韦达定理,就可以求出p,q 再得到flag的密文记为cipher,显然\(x+y>>z\),那么\(pow(b2l(message),e,p*q) = cipher //(c1 // c)\),由此可以得到flag 代码如下:
1 | import gmpy2 |
结果为:
[祥云杯 2021]Guess
加密代码如下:
1 | from Crypto.Util.number import ( |
题目还给了生成key
的sage代码:
1 | from Crypto.Util.number import getRandomNBitInteger |
还有hint
:
1 | [269865700520122549144762599745168447135899292447636617756605602545212728167797447445787398106779613741477733230173614340453529478006749280203791219240495545320784253247776438152444000193996715061172344898960798274898870276035746116096626771403981985377907323596813517124099024451197742946526103390328807831246256 351825797459362105605308649037214670594688383340169438930434420259269928275998050547973935801446674821508093953928259345972518243250576886209287947085399150853100589302713875591726622523078239591200598436879752732176246887916248939358959982281252327937943016323841545720179709080112518678442049362350981509034718 263649494857153084116592322640026892708704523757635879704627428861744239824087544706911427923497181418081141799670872495368713195091290104184732226016053955456080069924363050718931449355663612295983210728462521014504883613920516962136372253488247300322354664463901602570541318156197056622985692829393446426824638 453400473599186415430546643705275038528777172686002821040599810743439930425207458033941717472852507386860793929840595207225134962986513734506356764693655438618941180687198445634254053696966577360482969943538482461972582638716434085445938134971492342779462032414137699485112547903822163588315191244265946324218228 221827206659930588955100802225668305862545149941640820857015107405314701820405616518433413575662470655465592803570411353938784340140188287733921352831214120360424367473260917811334848500233701311695438235451684226463170984345521338680563403806364662014170986174411732503648583380588103055128943038500134530643916 262203710827134666754393441371926810666786719624203864995763104952378827035382567436334257544099220873788181813028566666315029478997429146874858602787070177245600709015255267085423481719645325028750498589844959751577586557620102816409584289798347398835894955523264261758402589145048117452982723970755642721185948 449549947180605498384084224904383747663117854129634140960197279513891658001908553899154409208608867208695858453347485738326065752599578853421177093646899183717259826566392731977061092066943083219101516409628761436417329565252863717622046112713719560452994438641997826306366514591051557604666293190256180831457338 427882301208025139610114439882502441914598510240693844044902667415035988021658089285061603431657599603331045335448467272333422417626837392018638001129889364932929941669822436427404546395551452209585894226820734770968204014611476942151983657836762789688274393777314450201198374683092768582274185754609711412304708 206110709892941001547312247977630809641839341262123534620411119329846379553052343003462513763026898611550676850103678046155244343919504874675861711356256906122323272209951451243624891037181757295933079679771758786258823164385868611152404813858000740881052355543339622168479080269444970004478675521293416826708518 376172049695479754397279304655900327678015926783104795566699104261135819399512659621342636669298191140461316867639169744791504345311783942430174703887150776382877123936598986072421903671214609751973940119880560010023509512099294872489902196710299820192154670761462699775769831592820505043876853866377139051584700 354989144495191036439184720296945551786270296981167948019894874956969763278354891643393993638515549874937620037229446883785428867336828993393766325205264827014803398207234817979275257572341689686447010646631351076260136309756747006523828716693825921688154934832911308097472833298941167446737019496978821483004142 247657418221571455680808477138957290356931207729656804527032245580960429841816418251851497488948400261671314674513219816337747752077679968835580384381624054897709324089163678294189901105831869992119099572932762170016838924353956530516871378196167792087986296536436978303095420850688527841398649861755287315252914 267323214115576739778291260842843721623810532694699738318490243647729313782577235628052607303271826513284836885625483822163201361517891012567791817503099871180988597553316105403148790626072424557099203065132199859082058328832860860922184801132168393385984454558438841623269013769064186695669122926428112192958058 380213264649117070874301733758703992957052936843733186492527715942930662173593880870634301175054838023249481317633718679161000064110300930539209764959721575720322049712443403460593162873330727228662863503060615472077497723046998024646756953852274720572607225890476747502455930116669002121964715413052946067842934 299711354673898453867309253202762657296007144693008209662952150647212243688991887703988087318065032988637761345182760379040409182402949915825642302147237357969028446441002244872828954397547768452078685431997252342287035745022966033862847782615826742413561561692110959439029229515697207807688051683325604252733440 365249518697738703288761077464962564211784565489625880111214981001160495801883728584481549266513708874054054791287952319568149514368408201453178732248585813844809011050888061672886805741661833747721896023077257558372204817368398292194245959048942083958342665661675547822068884852334483336260109462386159088016564 234545469963164507706928881332558698102265602045874001492102111685872459757456367592469441102854212705510654825387325257074993658404998100908565444353109631283461873240676108320629040289352814544349197599373184745156814420454658805665114789039742029196643533194690810954176812644128288344876173839305663050924382 403528775485460422299177022688931715589694738265629775672770507924611837945109216220772816017023088114143940075372156298028685445638442326378577113339902407365411497947122572348948969051001772973442806880840187883877046852394584867407634101961472289147829591393511113697557028915654508582063486155060434533238994 257705800389350838171655930137607990615821847049495140599547431163884933722120908882943391518805467092890646138176976972348577478608553204931604995997522105267077845561071320509003102531223852713962266895091989335267822143524572493690679315729733459055455391559009207758735308530559987072982151466476819761020810 294949037304356424643319498923044835942305224417122064436278068994313693511819494043317635677951522630682156447848037907726136749360723795280554225964785571884704746898469546462623102938030066073650709553136937483623297572165996272004599095405260872411154410637266055198871382378758905668626258164495032515036494] |
看到key_gen
和enc
部分容易联想到Paillier cryptosystem 再看
handle
函数部分 前面用于验证用户的部分可以用哈希碰撞解决 Step1给出公钥n和g Step2加密一个输入的数,输出密文 Step3输入两个数,分别加密,但只输出其中一个 Step4解密一个输入的数 Step5猜Step3中输出的是哪个数的密文 猜对32次得到flag 从这里可以发现,cipher1对应偶数位的key,cipher2对应奇数位的key,所以问题的关键在于还原key 但是尽管知道了key的前四位,用题目给的hint和key的生成代码怎么都无法还原key 由于Paillier cryptosystem还有如下性质:
令\(m_1 = plaintext1 * plaintext2 * KEY\),\(m_2 = (plaintext1 * plaintext2)^{-1}\space mod\space n\),就可以利用Step4解密\(E(m_1, r_1)^{m_2}\space mod\space n^2\),得到\(D(E(m_1, r_1)^{m_2}\space mod\space n^2) \equiv m_1m_2\space mod\space n \equiv KEY\space mod\space n\),求出KEY[R]或KEY[R+1], 再利用Step5验证求出的是奇数位还是偶数位 重复直到还原key 代码如下:
1 | from pwn import * |
结果为:
结语
希望继续坚持