easy_rsa 1 2 3 4 5 你知道RSA的计算过程吗? p=150474187910604693951751102216937428287096857121318464365942108948013354093529083969836175203520723291633650397445624079097835342633698374360664431859715205069188747613588358704787498723579291820420152951494495525037965399869523293436632868754403013784208219416788134033526389570716844877844169860611793990069 q=176328320510842703154050397191202141510093601375792326881044923761820466961664669495680261118225236760828529943794818139397030668147445222106817171900023057870821132288923449391289236678296595098312411460461985058841299429241135329954538196500923388263879382888556516007406972985383231192255090653218467049687 e=65537 c=21453522704853309931080996843880601927644882897313218104377837346356206417687411311002313712343199634401765876782486307083419157502442599010476310063299686288758533778815404538357817796139332551297770660523647043960675835234843482677081997961645862021884029514083859666895678907395980653171306290483648173865672793808429386155491319305012683108501299924405102078629647022157603940782539838779521670838846845466337615993286675120791008702641343104762218791963722876450558389352199499314788764489396795520639191830349831905080922823934573119025278435557929103874255366862079445089288577051416075027947409890953080601192
p、q、e 和 c 都给你了,还用思考吗(如果不会,直接左转学习 RSA 算法原理)?
1 2 3 4 5 6 7 8 9 10 11 12 13 from Crypto.Util.number import *p = ... q = ... e = ... c = ... n = p*q phi = (p-1 )*(q-1 ) d = inverse(e, phi) m = pow (c, d, n) print (long_to_bytes(m))
rsa_d 交互式题,给你 p、q、e,让你求出 d。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from Crypto.Util.number import inversefrom pwn import remote, contextcontext(log_level="debug" ) io = remote("[REDACTED]" , 21423 ) io.recvline() p = int (io.recvline().strip().split(b'=' )[1 ]) q = int (io.recvline().strip().split(b'=' )[1 ]) e = int (io.recvline().strip().split(b'=' )[1 ]) io.recvline() io.recvuntil(b'd=' ) phi = (p-1 )*(q-1 ) d = inverse(e, phi) io.sendline(str (d).encode()) io.interactive()
夹里夹气 古典密码签到题目,将「嘤嘤?」替换为「.」,将「嘤嘤嘤」替换为「-」,得到摩斯密码,直接解码即可。
七七的欧拉 1 2 3 e=8401285423075497989963572888601376313375827722858883767564499066473101615084214973041844878664837606157257039358849583049856161628241418012475432529735909 n=4321524416983780646994834778612486851863709339970595612409550086067211224407144019110798099401660010305645681548980160563216101786447875231976835115531375372678886339587480251211072894186558627897353793098608766868067029578667171419890150599640781594755080391489447462042167529203389236065727274166091741227068469987681083794139925327545810024038937132463518225611578727737940746784891867532498184642892826569777559107609493212332054559366409007685504768163376250281644004067745087899653778023414105973047620041288118404657934689253192043728590231618132716567084621670074256312939305265244486145758609971249077639085204680923108132415216543541472534580414274250979940330459551536830268428508217821060604260805109071534457808355664329902779603050878055690772430842865701249378096775899778255848773171108341331128673249899037133851535556515961699925809139476576825524135111237249709241579903807179252011010794867269715170739895392375920757559721516050680666658719990497863646989338960261844762127142439486275294670858114079687572243312184222126710967744971775585723045524467708387051034760208768956889939050498139189352842087278125173957182804116052402778416216669522309692266036094371308166663738284209615212016564171075874421472070422416318901926525719485991792111414333398004433143751908199358861514725313334333703539239414806773743941986164981642517673117412666430463318509571757766510835600758060976848374353352239044908034501477295696684294816091801944163877509558909040753907584672390823893991672246726026216973013330313971007514064831801564703364591696610900089228302936595848024616691878437618798864186634802647568239526771151323609650598156701595265876736712670677452013054393336294483452480213271032488201259990782289047132105989846972462094302132564809025802421057537091870932014884606863807260521123084423689494401900014232257381801590783735595575258160274248494498550583673688754220860142413631521279464318987425447302135444093663034598455694901199312497459228254746451233078954904159983269585883146959928222698672413648364391121696092287848931565798557217897678221379451042304811449415982434055522599829843482810025780349284547491767219221510351411192251236517341826619338084348136539121415210345488359563985046136632077665460793346345051213014836088333266911684271237227766588616771431226302155269893547077232087387411935345207081799500649921586279416751311277417949192360648342427657867424947189027886922112452681434778850977010752230391327878892161 c=1319666577538961333645698288755316431847498788803191213042970951363587036899021668814931340784440773619019635330248746606532233949080268712626456845590851812018539646705520729734738948568349756255640832936325965096602018372418260009779997764653043892043725224481361578258532294625476542003357969893609762981355267857532927948279737945466285738730414948695579002627741734690862181161919734547857550654813379550806374778412603233570494684223057004866601064851006909940259029023083838730497564657690493780040030061594915385886594845808342023634855913932575150487723897981518504381563064479784253539091893925934095008385592529031453149337783826491324308222762190756839839091742536583068791632135883271750510776330897598323339568926234205068941397524390446254057404779041850572848212437589629794980799894974937730065394307284096622814438575278571743516485062058882794531407454597341604166586040406867868323002258035737328450923576878935675998377134860357842547595516243737449809845708319003744144753130977649201725370898918939022097783844477196723482879094829249203949784703408369396219233552019108990900029123063369670129291960293576115301371071209198455299007327352602249399500334424934488528506773472420414119617828578424633182320749576697196936762283306228974126242434663703609495003656244194067493769815032134577138807799395279843708630774412341952691146906264694889245375545635688534662371202213660012977431598746482601668122679279419039288257069843297770840263002870206849857995148396439717143553611140228607531647245352254251824086797704561756363448681983654454393569932173970943157225527780067126895832370645456372127507057750232257828579628856504832975775855059816283684123444984393171125206440588627925736223222718784319209561804023835238526792966229582251575475514349566824846911411659740321154272534589694497411065971714157409318007179403833025337349924938487211920583780456897879801099476865645416182025930390267064170271613760577949655548949317295792361772032185463678410983568470647837758657058230086368185901572658482084202212103405161775243930901117532775865963215971025744893777631306256061896284125630451368067313753222195227231131526000755922331413457862253392530308284156400411897252674398583100198330007779643967156773216464341590817951828849769679134515304258819218015083183653130972243262400248230445031327719507314015062447355358100770763425336581258193908638241498461735819218673116282476452340137513156421147748432605954889277898079292196216
将 n 丢入 FactorDB 查询可以得知此题中 n 是一个质数 的 8 次方,因此可以直接计算私钥后解密:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from Crypto.Util.number import long_to_bytes, inversee = ... n = ... c = ... a = 90043967260093945222624152587689121936371930974666442796337497007806436220933640104101224556701782897110707124711581073042785835680900647501045466519201150330902139448582877574558481499349246396434566916237734745291901204887326075328782341527220826176727297933741479223587035887696689567725839887008586221103 assert a**8 == nphi_n = (a - 1 ) * (a ** 7 ) d = inverse(e, phi_n) print (long_to_bytes(pow (c, d, n)).decode('ascii' ))
EasyAES 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 from secret import flag,keyfrom Crypto.Util.number import *from Crypto.Cipher import AESimport osassert (len (flag) == 39 )assert (len (key) == 16 )def padding (msg ): tmp = 16 - len (msg) % 16 pad = hex (tmp)[2 :].zfill(2 ) return bytes .fromhex(pad*tmp)+msg def encrypt (message, key, iv ): aes = AES.new(key, AES.MODE_CBC, iv=iv) enc = aes.encrypt(message) return enc iv = os.urandom(16 ) message = padding(flag) hint = bytes_to_long(key) ^ bytes_to_long(message[:16 ]) enc = encrypt(message, key, iv) print (enc)print (hex (hint))""" b'bsF\xb6m\xcf\x94\x9fg1\xfaxG\xd4\xa3\x04\xfb\x9c\xac\xed\xbe\xc4\xc0\xb5\x899|u\xbf9e\xe0\xa6\xdb5\xa8x\x84\x95(\xc6\x18\xfe\x07\x88\x02\xe1v' 0x47405a4847405a48470000021a0f2870 """
先稍微看一下代码,可以发现这是一个常规的 AES-CBC 加密,其中自己实现了明文的 padding。此外,题目给出了明文、密钥的长度,以及密钥和明文前 16 字节的异或值。
由于其 padding 的实现是左填充,结合明文长度和 padding 函数算法,不难得出实际参与 AES-CBC 加密的明文前 9 字节为 \x09
,因此可以通过异或值得到密钥的前 9 字节:
1 2 >>> long_to_bytes(0x47405a4847405a4847 ^0x090909090909090909 )b'NISANISAN'
不难猜测密钥其实就是四字母循环,为 NISANISANISANISA
。那么显然可得 AES-CBC 加密的第一个分组:
1 2 3 4 5 msg 09 09 09 09 09 09 09 09 09 49 53 43 54 46 7b 31 I S C T F { 1 key 4e 49 53 41 4e 49 53 41 4e 49 53 41 4e 49 53 41 N I S A N I S A N I S A N I S A enc 62 73 46 b6 6d cf 94 9f 67 31 fa 78 47 d4 a3 04
然后算一下剩下的部分:
1 2 3 4 5 6 7 8 9 10 11 from Crypto.Util.number import *from Crypto.Cipher import AEScipher = b'bsF\xb6m\xcf\x94\x9fg1\xfaxG\xd4\xa3\x04\xfb\x9c\xac\xed\xbe\xc4\xc0\xb5\x899|u\xbf9e\xe0\xa6\xdb5\xa8x\x84\x95(\xc6\x18\xfe\x07\x88\x02\xe1v' key = b'NISA' *4 iv = b'\x00' *16 aes = AES.new(key, AES.MODE_CBC, iv=iv) plain = aes.decrypt(cipher) print ("ISCTF{1" +plain[16 :].decode())
运行后得到 Flag。