Single

[BJDCTF2020]部分Crypto1 min read

[BJDCTF2020]Polybius

密文:ouauuuoooeeaaiaeauieuooeeiea
hint:VGhlIGxlbmd0aCBvZiB0aGlzIHBsYWludGV4dDogMTQ=
flag:解出明文后,请加上BJD{}

才疏学浅,看了官方WP记录一下,脚本库+1

解hint的base64得到:The length of this plaintext: 14

再结合题目的名字Polybius,可以得知是棋盘密码。

密文只出现了“aeiou”五个字母,猜测加密表是“aeiou”。

ou au uu oo oe ea ai ae au ie uo oe ei ea
45 15 55 44 42 21 13 12 15 32 54 42 23 21

但是解密出来不对,需要爆破加密表。

因为棋盘密码是5*5的格子,爆破加密表就有5!种可能性,

可以通过下面的脚本来进行加密表爆破:

import itertools

key = []
cipher = "ouauuuoooeeaaiaeauieuooeeiea"
for i in itertools.permutations('aeiou', 5):
    key.append(''.join(i))
for each in key:
    temp_cipher = ""
    result = ""
    for temp in cipher:
        temp_cipher += str(each.index(temp))          
#这里其实是将字母的表换成数字的表以便后续计算
    for i in range(0,len(temp_cipher),2):
        current_ascii = int(temp_cipher[i])*5+int(temp_cipher[i+1])+97     
#因为棋盘密码是采用两位一起表示一个字母
        if current_ascii>ord('i'):
            current_ascii+=1
        result += chr(current_ascii)
    if "flag" in result:
        print(each,result)

运行后得到两个结果:

uoaei flagispolybius
uoaie flagkxoplubkyx

毫无疑问是第一个啦。

    U O A E I
U   a b c d e
O   f g h i k
A   l m n o p
E   q r s t u
I   v w x y z

[BJDCTF2020]easyrsa

题目下载

和普通RSA题目的区别是多了个这个:

z=Fraction(1,Derivative(arctan(p),p))-Fraction(1,Derivative(arth(q),q))

这里学到了,是p²+q²。已知p²+q²=(p-q)²+2pq,求出p-q得:

38655638074534726798492077075663447529685791965622785744291599744172599600277952500074987075247145202422406135863097610906456502129057888930841082426037785952636937542696842531871082637806760303859828128204411356302639111523367696324607828786231529865293956576176379165535334571113969283794819938252097174160

同理p²+q²=(p+q)²-2pq,求出p+q得:

250474028594377426111821218884061933467907597574578255066146260367094595399741196827532923836761733594976933366636149201492628708413319929361097646526652140204561542573663223469009835925309935515892458499676903149172534494580503088868430625144808189083708827363335045028702993282231537893799541685169911232442

利用p+q-(p-q)=2q得出q:

105909195259921349656664570904199242969110902804477734660927330311460997899731622163728968380757294196277263615386525795293086103142131020215128282050307177125962302515483190468569376643751587606016315185736245896434947691528567696271911398179288329609207435393579332931583829355558784305002360873458907029141

得出p:

144564833334456076455156647979862690498796694770100520405218930055633597500009574663803955456004439398699669751249623406199542605271188909145969364476344963078599240058180033000440459281558347909876143313940657252737586803051935392596519226965519859474501391969755712097119163926672753588797180811711004203301

[BJDCTF2020]RSA

题目下载

根据题目给出的信息可以看出两组都公用了一个q,

因此,q可以通过求最大公约数(gmpy2.gcd)得出。

n1:

13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037

n2:

12806210903061368369054309575159360374022344774547459345216907128193957592938071815865954073287532545947370671838372144806539753829484356064919357285623305209600680570975224639214396805124350862772159272362778768036844634760917612708721787320159318432456050806227784435091161119982613987303255995543165395426658059462110056431392517548717447898084915167661172362984251201688639469652283452307712821398857016487590794996544468826705600332208535201443322267298747117528882985955375246424812616478327182399461709978893464093245135530135430007842223389360212803439850867615121148050034887767584693608776323252233254261047

gcd(n1,n2)/q:

99855353761764939308265951492116976798674681282941462516956577712943717850048051273358745095906207085170915794187749954588685850452162165059831749303473106541930948723000882713453679904525655327168665295207423257922666721077747911860159181041422993030618385436504858943615630219459262419715816361781062898911

p1:

135283423427545651023916134156519717109709399113553907832988770259402226695880524199087896377303631866790192008529658716376684328032075836094156150811025163336681163420875451747389868549203081743561907379260240665153166927504059379076555558704275659133135906827306189040804323574468819553401905127999523676067

顺路也求了p2:

128247614380441198621646495410948309946997239795951661931273072927374035259759992149357909896141726187046548986417994702167046344214464500647935997258628531837792334712721963467008407166687868929005971168361860024531036817205076054969304421022680304986295959208344157424943500032828301016675631415023886775977

因为题目给出条件assert(e<100000),以及pow(294,e,n)的值,

通过这些条件,用如下脚本可以很轻松的爆破出e:

output = 381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303761876517101208677107311006065728014220477966000620964056616058676999878976943319063836649085085377577273214792371548775204594097887078898598463892440141577974544939268247818937936607013100808169758675042264568547764031628431414727922168580998494695800403043312406643527637667466318473669542326169218665366423043579003388486634167642663495896607282155808331902351188500197960905672207046579647052764579411814305689137519860880916467272056778641442758940135016400808740387144508156358067955215018 
n = 13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
for i in range(1,100000):
    if(pow(294,i,n) == output):
        print(i)

运行得到e为52361。至此所有的条件都找到了,直接利用RSATOOL等工具解就可以啦。