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 inverse
from pwn import remote, context

context(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, inverse

e = ...
n = ...
c = ...

a = 90043967260093945222624152587689121936371930974666442796337497007806436220933640104101224556701782897110707124711581073042785835680900647501045466519201150330902139448582877574558481499349246396434566916237734745291901204887326075328782341527220826176727297933741479223587035887696689567725839887008586221103

assert a**8 == n

phi_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,key
from Crypto.Util.number import *
from Crypto.Cipher import AES
import os

assert (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 AES

cipher = 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。