[LitCTF 2023]md5的破解
from hashlib import md5
from string import ascii_lowercase,digits
import itertools
f1 = 'LitCTF{md5can3derypt213thoughcrsh}'
for i in itertools.product(ascii_lowercase+digits, repeat=4):
t = ''.join(i)
flag = f1[:13] + t[:2] + f1[13:16] + t[2] + f1[16:31] + t[3] + f1[31:]
h = md5(flag.encode()).hexdigest()
if h == '496603d6953a15846cd7cc476f146771':
print(flag)
[NISACTF 2022]funnycaeser
应该是变异凯撒,先试试
s = [i for i in b'''NRQ;P<uLliW^(XQ/QT\NDh''']
for i in range(len(s)):
print(chr(s[i] + i),end='')
得到 NSS>TA{Strai4e_>aenaX}
很接近flag的格式,发现非字母对应的地方有点问题,考虑到题目说凯撒5号
给非字母位移5
于是脚本如下
s = [i+5 if not chr(i).isalpha() else i for i in b'''NRQ;P<uLliW^(XQ/QT\NDh''']
for i in range(len(s)):
print(chr(s[i] + i),end='')
NSSCTF{Stran9e_CaesaX}
发现还是有点问题,根据题意
手动改最后一位为r
[第五空间 2021]signin
from Crypto.Util.number import *
from tqdm import trange
import gmpy2
c = 86415476382906786465939442398992406348852252355326334785583474583480585659663836032856765037225261433532613020730103955916772373674295180495452293421279237222544308971840820110279355118064931506637793547489441433938707518241461449059717326341918746156620038847745542794560335988858156929013492541794032580255
e = 65537
n = 166337085427556441543394334802135957169988266794453522153008810336368247289697353242192853337017363111987395194428553050681210209730724596529629525357502302165396675392000087988956194589350195512264427901330860811469484473725396354231555692283910488095918243519370430703255279433498479943391876108577325840381
x = 2509898544460604898497702985357222191225421344430742181152035006910161802193623236888758239071502008180363546424715261788
def findp(p,plist):
l=len(p)
if l==400:
plist.append(int(p,2))
else:
pp=int(p,2)
qq=(x^^pp)%2**l
if pp*qq%2**l==n%2**l:
findp('1'+p,plist)
findp('0'+p,plist)
plist=[]
findp('1',plist)
for i in trange(len(plist)):
PR.<x> = PolynomialRing(Zmod(n))
f = x*2^400 + plist[i]
f = f.monic()
r = f.small_roots(X=2^112, beta=0.4)
if r:
p = int(plist[i]+r[0]* 2^400)
if n%p == 0:
break
q = n // p
d = gmpy2.invert(e, (p-1)*(q-1))
print(long_to_bytes(power_mod(c, d, n)))
[NSSCTF 2022 Spring Recruit]rrrsssaaa
n最少有3077位
大于p3 3072位
于是p3开三次得到p就行了
from Crypto.Util.number import *
import gmpy2
e = 65537
n = 44571911854174527304485400947383944661319242813524818888269963870884859557542264803774212076803157466539443358890313286282067621989609252352994203884813364011659788234277369629312571477760818634118449563652776213438461157699447304292906151410018017960605868035069246651843561595572415595568705784173761441087845248621463389786351743200696279604003824362262237505386409700329605140703782099240992158439201646344692107831931849079888757310523663310273856448713786678014221779214444879454790399990056124051739535141631564534546955444505648933134838799753362350266884682987713823886338789502396879543498267617432600351655901149380496067582237899323865338094444822339890783781705936546257971766978222763417870606459677496796373799679580683317833001077683871698246143179166277232084089913202832193540581401453311842960318036078745448783370048914350299341586452159634173821890439194014264891549345881324015485910286021846721593668473
c = 11212699652154912414419576042130573737460880175860430868241856564678915039929479534373946033032215673944727767507831028500814261134142245577246925294110977629353584372842303558820509861245550773062016272543030477733653059813274587939179134498599049035104941393508776333632172797303569396612594631646093552388772109708942113683783815011735472088985078464550997064595366458370527490791625688389950370254858619018250060982532954113416688720602160768503752410505420577683484807166966007396618297253478916176712265476128018816694458551219452105277131141962052020824990732525958682439071443399050470856132519918853636638476540689226313542250551212688215822543717035669764276377536087788514506366740244284790716170847347643593400673746020474777085815046098314460862593936684624708574116108322520985637474375038848494466480630236867228454838428542365166285156741433845949358227546683144341695680712263215773807461091898003011630162481
p3 = 891438237083490546089708018947678893226384856270496377765399277417697191150845296075484241536063149330788867177806265725641352439792185047059884077696267280233195764685547392586251429555216372682368991273055524268769223153988946085858123028200360359212117360701384933036871231911448311911374115683475228820531478240539549424647154342506853356292956506486091063660095505979187297020928573605860329881982122478494944846700224611808246427660214535971723459345029873385956677292979041143593821672034573140001092625650099257402018634684516092489263998517027205660003413512870074652126328536906790020794659204007921147300771594986038917179253827432120018857213350120695302091483756021206199805521083496979628811676116525321724267588515105188480380865374667274442027086789352802613365511142499668793725505110436809024171752137883546327359935102833441492430652019931999144063825010678766130335038975376834579129516127516820037383067
q3 = 44571911854174527304485400947383944661319242813524818888269963870884859557542264803774212076803157466539443358890313286282067621989609252352994203884813364011659788234277369629312571477760818634118449563652776213438461157699447304292906151410018017960605868035069246651843561595572415595568705784173761440671033435053531971051698504592848580356684103015611323747688216493729331061402058160819388999663041629882482138465124920580049057123360829897432472221079140360215664537272316836767039948368780837985855835419681893347839311156887660438769948501100287062738217966360434291369179859862550767272985972263442512061098317471708987686120577904202391381040801620069987103931326500146536990700234262413595295698193570184681785854277656410199477649697026112650581343325348837547631237627207304757407395388155701341044939408589591213693329516396531103489233367665983149963665364824119870832353269655933102900004362236232825539480774
r3 = 22285955927087263652242700473691972330659621406762409444134981935442429778771132401887106038401578733269721679445156643141033810994804626176497101942406682005829894117138684814656285738880409317059224781826388106719230578849723652146453075705009008980302934017534623325921780797786207797784352892086880720749202442492937918619992591614713131681306874944356693778359565004415437554407990089293135634916859631279984463829118336826115430997439527110961309956466956650522900331263720500751112297418506140413317489683875995326726992533904683800042127871963320754241310699432792081707870167598822650064976439270556418985242630368723264289700246406905189810458354474959276748887369363592834205660349184660073395182450526542246354364903399132116153732074081050985584216815493617906868615192465631416955706457835185743023758573279838341229835613609332206338401219168119635681832981552328638132500079074010106995297184587143613134093145
p = gmpy2.iroot(p3,3)[0]
i = 0
while True:
r = p * 5 + i
if isPrime(r):
i = 0
break
else:
i += 1
while True:
q = p * 10 + i
if isPrime(q):
break
else:
i += 1
d = gmpy2.invert(e,(p-1)*(q-1)*(r-1))
print(long_to_bytes(pow(c,d,n)))
[长安杯 2021]checkin
from Crypto.Util.number import *
import gmpy2
e = 1049
c1 = 4513855932190587780512692251070948513905472536079140708186519998265613363916408288602023081671609336332823271976169443708346965729874135535872958782973382975364993581165018591335971709648749814573285241290480406050308656233944927823668976933579733318618949138978777831374262042028072274386196484449175052332019377
c2 = 3303523331971096467930886326777599963627226774247658707743111351666869650815726173155008595010291772118253071226982001526457616278548388482820628617705073304972902604395335278436888382882457685710065067829657299760804647364231959804889954665450340608878490911738748836150745677968305248021749608323124958372559270
kn = 2**e - c1
for q in range(2**15,2**16):
if isPrime(q) and gmpy2.gcd(kn,q) != 1:
if(kn % q == 0):
kp = kn // q
print (q, kp)
break
q = 34211
# kp拿去分解
p = 170229264879724117919007372149468684565431232721075153274808454126426741324966131188484635914814926870341378228417496808202497615585946352638507704855332363766887139815236730403246238633855524068161116748612090155595549964229654262432946553891601975628848891407847198187453488358420350203927771308228162321231
n = p*q
d = gmpy2.invert(e,(p-1)*(q-1))
M = pow(c2,d,n)
tem = 1
for i in range(p - q , p):
tem = tem*i%p
m = (-M*tem)%p
print(long_to_bytes(m))
[LitCTF 2023]factordb (中级)
[zer0pts 2020]ROR
from Crypto.Util.number import *
lines = open("chall.txt","rb").readlines()
s = ''
for line in lines:
s += bin(int(line.strip()))[-1]
print(long_to_bytes(int(s[::-1], 2)))
[LitCTF 2023]Virginia
from Crypto.Util.number import *
import gmpy2
flag = ''
c = [86, 116, 128, 80, 98, 85, 139, 122, 134, 114, 125, 136, 117, 123, 129, 127, 128, 128, 142, 130, 140, 147, 127, 132, 131, 136, 151, 134, 152, 164]
for i in range(len(c)):
c[i] = c[i] - i+ (ord("L") - 86)
flag += chr(c[i])
print(flag)
[HNCTF 2022 Week1]baBAbaseSEse
[LitCTF 2023]P_Leak
dp泄露
[HGAME 2022 week1]Matryoshka
套成这样我包做不出来的
https://www.nssctf.cn/note/set/190
发现像盲文的东西只有三个字符来回出现
于是考虑到摩斯
摩斯->反转摩斯->hex->Vigenere(hgame)->base64->rail_fence(22)->ceasar(21)
[HDCTF 2023]Normal_Rsa(revenge)
n 1280位
p 256位 p2 < n 直接开根
q2 <n直接开根
from Crypto.Util.number import *
import gmpy2
e=65537
P = 8760210374362848654680470219309962250697808334943036049450523139299289451311563307524647192830909610600414977679146980314602124963105772780782771611415961
Q = 112922164039059900199889201785103245191294292153751065719557417134111270255457254419542226991791126571932603494783040069250074265447784962930254787907978286600866688977261723388531394128477338117384319760669476853506179783674957791710109694089037373611516089267817074863685247440204926676748540110584172821401
n = 12260605124589736699896772236316146708681543140877060257859757789407603137409427771651536724218984023652680193208019939451539427781667333168267801603484921516526297136507792965087544395912271944257535087877112172195116066600141520444466165090654943192437314974202605817650874838887065260835145310202223862370942385079960284761150198033810408432423049423155161537072427702512211122538749
c = 7072137651389218220368861685871400051412849006784353415843217734634414633151439071501997728907026771187082554241548140511778339825678295970901188560688120351732774013575439738988314665372544333857252548895896968938603508567509519521067106462947341820462381584577074292318137318996958312889307024181925808817792124688476198837079551204388055776209441429996815747449815546163371300963785
p = gmpy2.iroot(P,2)[0]
q = gmpy2.iroot(Q,2)[0]
r = n // p // q
d = gmpy2.invert(e,(p-1)*(q-1)*(r-1))
print(long_to_bytes(pow(c,d,n)))
[AFCTF 2018]One Secret, Two encryption
共享素数
[SWPUCTF 2022 新生赛]善哉善哉
文件尾处有摩斯
解得新佛曰
解得一串字符串
查wp得知要过md5,这个当时的题应该有说的(然而也未必) 复现没这句话
[黑盾杯 2020]Round
一开始以为是base92 base85之类的,这种题要知道flag的格式就比较好做,可以直接找找规律
s = ':D@J::K=r<ecXi^\[V:X\jXit'
for i in range(1,26):
flag = ''
for j in range(len(s)):
flag += chr(ord(s[j]) + i)
if 'CTF' in flag or 'ctf' in flag or 'flag' in flag:
print(flag)
[湖湘杯 2021]signin
已知 n1/n2 = p14*q1/p24*q2
p1和p2接近
于是有
n1/n2 约等于 q1/q2
连分数逼近
逼近的脚本来自la佬https://lazzzaro.github.io/2020/05/06/crypto-RSA/
from Crypto.Util.number import *
import gmpy2
pk = (1150398070565459492080597718626032792435556703413923483458704675295997646493249759818468321328556510074044954676615760446708253531839417036997811506222349194302791943489195718713797322878586379546657275419261647635859989280700191441312691274285176619391539387875252135478424580680264554294179123254566796890998243909286508189826458854346825493157697201495100628216832191035903848391447704849808577310612723700318670466035077202673373956324725108350230357879374234418393233, 1242678737076048096780023147702514112272319497423818488193557934695583793070332178723043194823444815153743889740338870676093799728875725651036060313223096288606947708155579060628807516053981975820338028456770109640111153719903207363617099371353910243497871090334898522942934052035102902892149792570965804205461900841595290667647854346905445201396273291648968142608158533514391348407631818144116768794595226974831093526512117505486679153727123796834305088741279455621586989)
c1, c2 = (361624030197288323178211941746074961985876772079713896964822566468795093475887773853629454653096485450671233584616088768705417987527877166166213574572987732852155320225332020636386698169212072312758052524652761304795529199864805108000796457423822443871436659548626629448170698048984709740274043050729249408577243328282313593461300703078854044587993248807613713896590402657788194264718603549894361488507629356532718775278399264279359256975688280723740017979438505001819438, 33322989148902718763644384246610630825314206644879155585369541624158380990667828419255828083639294898100922608833810585530801931417726134558845725168047585271855248605561256531342703212030641555260907310067120102069499927711242804407691706542428236208695153618955781372741765233319988193384708525251620506966304554054884590718068210659709406626033891748214407992041364462525367373648910810036622684929049996166651416565651803952838857960054689875755131784246099270581394)
e = 0x10001
def transform(x,y): #使用辗转相除将分数x/y转为连分数的形式
res=[]
while y:
res.append(x//y)
x,y=y,x%y
return res
def continued_fraction(sub_res):
numerator,denominator=1,0
for i in sub_res[::-1]: #从sublist的后面往前循环
denominator,numerator=numerator,i*numerator+denominator
return denominator,numerator #得到渐进分数的分母和分子,并返回
#求解每个渐进分数
def sub_fraction(x,y):
res=transform(x,y)
res=list(map(continued_fraction,(res[0:i] for i in range(1,len(res))))) #将连分数的结果逐一截取以求渐进分数
return res
def wienerAttack(n1,n2):
for (q2,q1) in sub_fraction(n1,n2): #用一个for循环来注意试探n1/n2的连续函数的渐进分数,直到找到一个满足条件的渐进分数
if q1==0: #可能会出现连分数的第一个为0的情况,排除
continue
if n1%q1==0 and q1!=1: #成立条件
return (q1,q2)
print("该方法不适用")
q1,q2 = (wienerAttack(pk[0],pk[1]))
p1 = gmpy2.iroot((pk[0] // q1),4)[0]
p2 = gmpy2.iroot((pk[1] // q2),4)[0]
d1 = gmpy2.invert(e,p1**3*(p1-1)*(q1-1))
d2 = gmpy2.invert(e,p2**3*(p2-1)*(q2-1))
print(long_to_bytes(pow(c1,d1,pk[0]))+long_to_bytes(pow(c2,d2,pk[1])))
[NCTF 2019]Sore
https://www.guballa.de/vigenere-solver
梭出来的大小写有点问题
这题应该也是当时给了第一句话让我们倒推key
vlbeunuozbpycklsjXlfpaq
[LitCTF 2023]e的学问
e φ不互素
[安徽省赛 2021]别忘了往下看
base64->键盘
[红明谷CTF 2022]easy_ya
m = M+kr
(M+kr)**e 同余 c mod n
rom Crypto.Util.number import *
r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473
M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558
n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287
e = 3
c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282
PR.<x> = PolynomialRing(Zmod(n))
f = (M + x*r)^e - c
f = f.monic()
roots = f.small_roots()
k = int(roots[0])
m = (M + k*r)
print(long_to_bytes(m))