ISCTF(CRYPTO)

 easy_rsa

nc连接看看

 脚本

    import gmpy2
    import libnum
    from Crypto.Util.number import *
    from binascii import a2b_hex, b2a_hex
     
    flag = "*****************"
     
    p = 119200765029666197784387168194440488008271046554978178071320725292536006228327796296866542769241933783570801031110681364805743480639130801572624438254742183211656791693078277297564045404697208849742380688272165379647671669045133218596361232770154966336005510750806882773165480699023310507992113404314173256201
    q = 163830856314410818253702809068004810967884179112097940262882062171469492693573849155907754248982348553498300096347913969536110892298049650300096647902574960680966362540118324134020494717232971180740153232527295000823582582474353059809692638543281114291832909903810606318936476193087245673363986827478358445159
    c = 12094066916295513147139754879289037970062075676611598705486890065713177412649257040633140947854379352361090549892387177259087131973498576996451755311640580604641276812612459113125336176915035144183113659086647470448112524044851800879181143844751830220866266779182192653690472693714077457532694681498728568050441803482029782258612429822145031713167497717266549914210990726177208477887323828370817063077452676410034741163657502807001479423219378813729123500155306507624797360656036787835818487639856580338710828004471348394125981072894143517618301154582913270597264800114123207242101025163965622755258217278864794021099
    e = 65537
    n = p * q
    phi = (p - 1) * (q - 1)
    d = gmpy2.invert(e, phi)
    m = pow(c, d, n)
    print(libnum.n2s(int(m)))

 ISCTF(CRYPTO)_第1张图片

 rsa_d

同样nc连接

脚本

    import gmpy2
    p =gmpy2.mpz(74525431)
    q =gmpy2.mpz(14360893)
    e =gmpy2.mpz(65537)
    phi_n= (p - 1) * (q - 1)
    d = gmpy2.invert(e, phi_n)
    print("d is:")
    print (d)

ISCTF(CRYPTO)_第2张图片

先算出d

ISCTF(CRYPTO)_第3张图片

夹里夹气

hint:摩斯密码

先下载附件

ISCTF(CRYPTO)_第4张图片

 结合刚刚的提示

嘤嘤嘤替换为-,嘤嘤?替换为.,然后摩斯密码解一下就好

.. ... -.-. - ..-. ----.-- .... ... -... -.. .... ..--.- ... ..-. .-
-- ..--.- .--- -.. -. ..-. .--- ..--.- -.. .--- -. ..-. .--- -.. --
-----.-

 然后解密也是可以的

也可以直接转

摩斯密码在线加密解密 - Bugku

注意space那里需要一个空格

ISCTF(CRYPTO)_第5张图片

%u7b和%u7d是两个{}

替换一下即可

signin

下载附件

ISCTF(CRYPTO)_第6张图片

jb

import gmpy2
c =29897791365314067508830838449733707533227957127276785142837008063510003132596050393885548439564070678838696563164574990811756434599732001622138564176327233154381380717648392357672642893142367607369679906940371540867456654151408884171467638060523066406441697453971996011548195499549200103123841556085936672833238264876038160712793697159776332101536779874757463509294968879216810485825310481778472384531442206034564488532399171243463881900578407746982324779260941957792455217641883334131366614310644607114128868153897806362954456585661855569432513785225453501792356175649676419772626548071916379318631677869452985829916084336045071072493567871623113923140668031380684940109024609167449291380675124701557542736834722898328082888430566229322840781411336263268594978558564310744076581639469210462567543585251718744340216155557606004995449505782302864725856877289388008819135023371948017425832082773421030256964953984562211638060
N =3231913372897424708803097969843687520868057190788284975066875241636436021279559026753076528399891936983240045179193386905918743759145596242896507856007669217275515235051689758768735530529408948098860529277921046146065473333357110158008648799207873976745048714516868561754202543130629713461365314627535982379718931633528922076268531363809414255082933615667770491818402126891370106045838695484124212397783571579791558324350069782623908757815983802849109451590357380624488436968737140312471089662428308113246310588336044438265822574558816510054763215983649467009345458480077882624118620789015758507736272402998721366662352794082495441303895025585316667229865533166614969641012195668280586477033200418153345241668242651407009849656745509386158276185301334443855737552801531617549980843398648751032649895403939319648954908487619711555700124294191702406981128355348449748466449951568451135718146828444185238617155432417897711198169
d =220908195398117048628110042133057032501548264225985823161565460390793825899523662424732910718579350524590368287207857059670558852106434615134645183432670023784725430385048028248108677670095524205518013647694485975996499747580966911259433184798952372110628624294686853944766950244209186984164963987120416687012811346656498861438432610431705868541829977481875385468143747334359481673214618931159403123892213161430602430294790913847722073762999311674428134241956293914716183107414340330449465142849402354034926378025006749405210014879947411570380433942279355488861684317611066949685697268714760755591128598654573304969
tmp = pow(2,d*N,N) - 2
pq = gmpy2.gcd(tmp,N)
m = pow(c,d,pq)
print(bytes.fromhex(hex(m)[2:]))

ISCTF(CRYPTO)_第7张图片

EasyAES

下载附件

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

该代码段导入了 flagkey 变量,分别用于存储从 secret 文件中读取的flag和key。另外还导入了用于处理数字的 Crypto.Util.number 模块以及用于执行AES加密的 Crypto.Cipher.AESos 模块。

  1. 验证flag和key的长度:
assert(len(flag)==39) 
assert(len(key)==16)

此处使用断言(assert)来检查flag的长度是否为39,key的长度是否为16。如果长度不符合要求,将会抛出异常。

定义填充函数:

def padding(msg):
    tmp = 16 - len(msg)%16
    pad = hex(tmp)[2:].zfill(2)
    return bytes.fromhex(pad*tmp)+msg

padding 函数用于对消息进行填充,使其长度为 AES 加密算法的块大小(16字节)。填充的字节值为补齐所需的字节数。这里使用了 bytes.fromhex 将填充值转换为字节,并将填充值添加到消息之前。

  1. 定义加密函数:
def encrypt(message,key,iv):
    aes = AES.new(key,AES.MODE_CBC,iv=iv)
    enc = aes.encrypt(message)
    return enc

encrypt 函数使用 AES 加密算法和 CBC 模式对消息进行加密。其中,AES.new 用于创建一个 AES 加密对象,传入的参数包括 key、加密模式和初始化向量(IV)。然后使用 aes.encrypt 方法对消息进行加密,并返回加密后的结果。

  1. 生成随机的初始化向量(IV):
iv = os.urandom(16) 使用 os.urandom 生成一个16字节的随机字符串作为初始化向量(IV)。
  1. 对flag进行填充和加密,并输出加密结果和密码提示:
message = padding(flag)
hint = bytes_to_long(key)^bytes_to_long(message[:16])
enc = encrypt(message,key,iv)

print(enc)
print(hex(hint))

首先,对flag进行填充,得到填充后的消息 message。然后,使用 bytes_to_long 函数将key和消息的前16字节转换为长整型数据,并将其进行异或运算,得到密码提示 hint

最后,调用 encrypt 函数对 message 进行加密,使用 key 和随机生成的 IV,得到加密结果 enc

最后打印加密结果和密码提示。

 注意一下

def padding(msg):
    tmp = 16 - len(msg)%16
    pad = hex(tmp)[2:].zfill(2)
    return bytes.fromhex(pad*tmp)+msg
assert(len(flag)==39)
assert(len(key)==16)
message = padding(flag)
hint = bytes_to_long(key)^bytes_to_long(message[:16])

经过这个padding函数之后,message的前16位被填充成了:

爆破key的最后一位和iv即可求解

from Crypto.Cipher import AES
import binascii
from Crypto.Util.number import *
from pwn import xor

fake_flag = b"ISCTF{ffffffffffffffffffffffffffffffff}"
#print(len(fake_flag))
def padding(msg):
    tmp = 16 - len(msg)%16
    pad = hex(tmp)[2:].zfill(2)
    return bytes.fromhex(pad*tmp)+msg

hint = 0x47405a4847405a48470000021a0f2870
_flag = padding(fake_flag)

#print(_flag[:16])
key = long_to_bytes(hint ^ bytes_to_long(_flag[:16]))
#print(key)

key=b'NISANISANISANISA'
_flag = b'ISCTF{1'
c = 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'
message = padding(_flag)
print(message)
aes = AES.new(key,AES.MODE_CBC)
dec_one = aes.decrypt(c[:16])
iv = b''.join(xor(i,j) for i,j in zip(dec_one,message))
print(iv)

cipher = AES.new(key, AES.MODE_CBC, iv)
m = cipher.decrypt(c)
print(m[16:])
print(_flag+m[16:])

ISCTF(CRYPTO)_第8张图片

 1zRSA

from secret import flag
from Crypto.Util.number import *
import gmpy2

e = 65537
def genKey(nbits):
    while 1:
        p1 = getPrime(3*nbits)
        p2 = gmpy2.next_prime(p1)
        q1 = getPrime(nbits)
        q2 = getPrime(nbits)
        print(abs((p1 - p2)*q1*q2 / p2) < 0.5)
        if (abs((p1 - p2)*q1*q2 / p2) < 0.5):
            n1 = p1 * q1
            n2 = p2 * q2
            return n1,n2

def encrypt(message,e,n):
    m = bytes_to_long(message)
    cipher = pow(m,e,n)
    return cipher

e = 65537
nbits = 512
N1,N2 = genKey(nbits)
c = encrypt(flag,e,N1)

print("c =",c)
print("N1 =",N1)
print("N2 =",N2)

"""
c = 10514867898770499427284608506159580569755258729683776720082395249877529851029152305989048383470182992945743997295638334301128554841767619528809377736651238576700664675871769469687466885347209033023021132575700436470105289467423655742323143373578268184141573237433927498143740155552829633601489926767185335051352605346248971754473960051955670785777007641909166041398566067524811394639822575661469340152913706417365065683835945980239268665146900957692685590242386540944646586739158427428484471978559453954674292300496568823382513505511940062159025700312492163454304120916055466108498000990408937265075788135466153131436
N1 = 29306627985861300819651846356448043523015086509329909246911330574896611830331438353458702041787309531570626136669100576501108581024502570212983369979387658041578384466200573362881060761873478590684611265249166591510948597798713864127744488747451815919677861684787135464097885906630772472111899455047125676738720391327331161464894360886214160668909531050207033060523194208723151015702926842472554933849380343375654696115359960495727909221926251630408376527033291123026893207722440649867394971680316008434251667567174806214522621693042164997381729300075394393372808917061813346794422821819494227772694592990703688149467
N2 = 18405525902524887428651801489049128242565457677879715229456940729064725933277139190670749899959483734341103740185991771024797037242681566772189045321838652668819112989587974866361063424698215713773139281840970499871668796770682692589505769008516630604297570518689639885716307469568821629424402742264467677407820449195383921766157185602677665872353099155904715047452319853202981674101731121033360393547940246101864940155160699277417096395998766928213545196492031975135121409309520198853066288180944871441224241681478164494169741263236267316380581883196836731872676312125837497320438964940186318916950049777255612191899
"""

from Crypto.Util.number import *
import gmpy2
c =
10514867898770499427284608506159580569755258729683776720082395249877529851029152
305989048383470182
99294574399729563833430112855484176761952880937773665123857670066467587176946968
746688534720903302
30211325757004364701052894674236557423231433735782681841415732374339274981437401
555528296336014899
26767185335051352605346248971754473960051955670785777007641909166041398566067524
811394639822575661
46934015291370641736506568383594598023926866514690095769268559024238654094464658
673915842742848447
19785594539546742923004965688233825135055119400621590257003124921634543041209160
554661084980009904
08937265075788135466153131436
N1 =
29306627985861300819651846356448043523015086509329909246911330574896611830331438
353458702041787309
53157062613666910057650110858102450257021298336997938765804157838446620057336288
106076187347859068
46112652491665915109485977987138641277444887474518159196778616847871354640978859
066307724721118994
55047125676738720391327331161464894360886214160668909531050207033060523194208723
151015702926842472
55493384938034337565469611535996049572790922192625163040837652703329112302689320
772244064986739497
夹里夹气
出题人:fpclose
下载附件:
16803160084342516675671748062145226216930421649973817293000753943933728089170618
133467944228218194
94227772694592990703688149467
N2 =
18405525902524887428651801489049128242565457677879715229456940729064725933277139
190670749899959483
73434110374018599177102479703724268156677218904532183865266881911298958797486636
106342469821571377
31392818409704998716687967706826925895057690085166306042975705186896398857163074
695688216294244027
42264467677407820449195383921766157185602677665872353099155904715047452319853202
981674101731121033
36039354794024610186494015516069927741709639599876692821354519649203197513512140
930952019885306628
81809448714412242416814781644941697412632362673163805818831968367318726763121258
374973204389649401
86318916950049777255612191899
e = 65537
cf = continued_fraction(Integer(N1) / Integer(N2))
i = 1
while 1:
q1 = cf.numerator(i)
q2 = cf.denominator(i)
if N1 % q1 == 0 and q1 != 1:
print(q1)
p1 = N1 // q1
d = gmpy2.invert(e,(p1-1)*(q1-1))
m = pow(c,d,N1)
flag = long_to_bytes(int(m))
if b"ISCTF" in flag:
print(flag)
break
i += 1

 七七的欧拉

TTX改一下后缀

 

import gmpy2
import libnum
from crypto.Util.number import *

flag=b'ISCTF{*************}'
m=bytes_to_long(flag)

p=libnum.generate_prime(1024)
e=libnum.generate_prime(512)

c=pow(m,e,n)
output = open('output1.txt', 'w')
output.write('e=' + str(e) + '\n')
output.write('n=' + str(n) + '\n')
output.write('c=' + str(c) + '\n')
output.close()

 n 不是两个大素数相乘的形式,而是 p 8 次方

ISCTF(CRYPTO)_第9张图片

 

解欧拉函数后得到: phi= p**k -(p**k-1) 。这里的 k 就是 8 。那么可以计算 phi= p**8 -(p**7)
进而求出私钥 d 和明文 m 代码如下
import gmpy2
from Crypto.Util.number import long_to_bytes
n = 4321524416983780646994834778612486851863709339970595612409550086067211224407144019110798099401660010305645681548980160563216101786447875231976835115531375372678886339587480251211072894186558627897353793098608766868067029578667171419890150599640781594755080391489447462042167529203389236065727274166091741227068469987681083794139925327545810024038937132463518225611578727737940746784891867532498184642892826569777559107609493212332054559366409007685504768163376250281644004067745087899653778023414105973047620041288118404657934689253192043728590231618132716567084621670074256312939305265244486145758609971249077639085204680923108132415216543541472534580414274250979940330459551536830268428508217821060604260805109071534457808355664329902779603050878055690772430842865701249378096775899778255848773171108341331128673249899037133851535556515961699925809139476576825524135111237249709241579903807179252011010794867269715170739895392375920757559721516050680666658719990497863646989338960261844762127142439486275294670858114079687572243312184222126710967744971775585723045524467708387051034760208768956889939050498139189352842087278125173957182804116052402778416216669522309692266036094371308166663738284209615212016564171075874421472070422416318901926525719485991792111414333398004433143751908199358861514725313334333703539239414806773743941986164981642517673117412666430463318509571757766510835600758060976848374353352239044908034501477295696684294816091801944163877509558909040753907584672390823893991672246726026216973013330313971007514064831801564703364591696610900089228302936595848024616691878437618798864186634802647568239526771151323609650598156701595265876736712670677452013054393336294483452480213271032488201259990782289047132105989846972462094302132564809025802421057537091870932014884606863807260521123084423689494401900014232257381801590783735595575258160274248494498550583673688754220860142413631521279464318987425447302135444093663034598455694901199312497459228254746451233078954904159983269585883146959928222698672413648364391121696092287848931565798557217897678221379451042304811449415982434055522599829843482810025780349284547491767219221510351411192251236517341826619338084348136539121415210345488359563985046136632077665460793346345051213014836088333266911684271237227766588616771431226302155269893547077232087387411935345207081799500649921586279416751311277417949192360648342427657867424947189027886922112452681434778850977010752230391327878892161
e = 8401285423075497989963572888601376313375827722858883767564499066473101615084214973041844878664837606157257039358849583049856161628241418012475432529735909
c = 1319666577538961333645698288755316431847498788803191213042970951363587036899021668814931340784440773619019635330248746606532233949080268712626456845590851812018539646705520729734738948568349756255640832936325965096602018372418260009779997764653043892043725224481361578258532294625476542003357969893609762981355267857532927948279737945466285738730414948695579002627741734690862181161919734547857550654813379550806374778412603233570494684223057004866601064851006909940259029023083838730497564657690493780040030061594915385886594845808342023634855913932575150487723897981518504381563064479784253539091893925934095008385592529031453149337783826491324308222762190756839839091742536583068791632135883271750510776330897598323339568926234205068941397524390446254057404779041850572848212437589629794980799894974937730065394307284096622814438575278571743516485062058882794531407454597341604166586040406867868323002258035737328450923576878935675998377134860357842547595516243737449809845708319003744144753130977649201725370898918939022097783844477196723482879094829249203949784703408369396219233552019108990900029123063369670129291960293576115301371071209198455299007327352602249399500334424934488528506773472420414119617828578424633182320749576697196936762283306228974126242434663703609495003656244194067493769815032134577138807799395279843708630774412341952691146906264694889245375545635688534662371202213660012977431598746482601668122679279419039288257069843297770840263002870206849857995148396439717143553611140228607531647245352254251824086797704561756363448681983654454393569932173970943157225527780067126895832370645456372127507057750232257828579628856504832975775855059816283684123444984393171125206440588627925736223222718784319209561804023835238526792966229582251575475514349566824846911411659740321154272534589694497411065971714157409318007179403833025337349924938487211920583780456897879801099476865645416182025930390267064170271613760577949655548949317295792361772032185463678410983568470647837758657058230086368185901572658482084202212103405161775243930901117532775865963215971025744893777631306256061896284125630451368067313753222195227231131526000755922331413457862253392530308284156400411897252674398583100198330007779643967156773216464341590817951828849769679134515304258819218015083183653130972243262400248230445031327719507314015062447355358100770763425336581258193908638241498461735819218673116282476452340137513156421147748432605954889277898079292196216
q=90043967260093945222624152587689121936371930974666442796337497007806436220933640104101224556701782897110707124711581073042785835680900647501045466519201150330902139448582877574558481499349246396434566916237734745291901204887326075328782341527220826176727297933741479223587035887696689567725839887008586221103
phi = q ** 8 - q ** 7
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

 

ezRSA

求解k值

for k in range(800, 1042):
    f = int(factor(k))
    e2s = (leak-k) % int(f)
    tphi = (leak -k - e2s) // f 

    s = GCD(tphi,e2s)
    if e2s.bit_length() == 1280 and isPrime(e2s)==False and s.bit_length()>=255:
        print(k)
        print(s)

 可以得到s、e以及 $\varphi(n)$ 的值

先得到第一部分的

from Crypto.Util.number import *  
from gmpy2 import *  
from sympy import factorial as factor  
  
n=11947241219140615237486309604628973391930339499486798714294498785973885463922548820705069266901903036359254530976927762175262118185159625298369758973935607721381080656199430417818042316007700805008489750740972102287526203064312544340176751751266738219862839022892152635044837041435349904947659346174437695051460882295109851494351994498403791853684239883961766735230202016890875913906900424655711952381425165331389205409282026144667620577946333963601349932905443037145145394667138672752796990411249984169798953060016353748467221154507518574580014882822860853751863757579945329482337792853278715658322366578632817369803  
leak=4825516411405566882589539973300777582630401687252523937619475044718073214792109569356301252345907914527064817796240727881691399437316660502564323688151311441558823720142071322647007043253626474853010585775710666373651910201889816367922377400970334479040370865879692204764210349607801862666059991789964453439198722962928173197103040385999540054988070333338229570681105393323319767364566644771731595597298210924296456293443125736685469259629163687986114207231233692023613120260155832741199446052855856512791809968963821161765216500389495853488545132008219841635172896843241988125093920217328861507191614658581776695350233593334984646128341640512614300048002219790302478025661133721688232990437685571940604588227022076092857294647830142309441330515812342199940466483115991318018705011472671758063610572930560763516803732693572940939851140384123593105367117155740563057395940645038058194280259524467405820813428765139386968927021061208348111646257434870000866555555283176852834141906387086839051793789126474095527358879630274092172435022326207193319806666865704778907868548658370890623182731938070419969709739233504224100413506514936517272134494776127809327563935813198793891897000404156963455000732616317276241867836699641699825594195079194154957636030485909612033254350828892222046169586844737908349421869385194421981553067305581842171364022745759111602699744161574724372962242132415149146766136601016174658042678857388889036814591399168640678928083442174651493660991088328784105160030857387096251561933704301600695757426945716557961698202485226605485682131045560193822624290720243852434254301324766198129736640005205530445739302632191151740246117208267182630330046600955724262084795763080838384593939971523865769318326101179866187596006185138294477350533316908592086441208575935282494961976691089358976722199557082176285926812134290542838960814502829473372780200310674359645482281037654052483716329497333729594792122297988611883754886634452292313599416610842690057657285337854049766320641249317238780428383587602425132767334811708075065922641191109650660427678019567095309270443930385437292172296652003394183918270707887845018685247162812541929998945735270109736669595830167257239265204520272132384023622231518288514767919183916561550558812478144292894132331163501566746036390319663066054892756826660841952717280005731719082266616429646501565960817772663658546555336959754321712751857740551378987853931613973604348308746819562341219749677392565068390386908064199536445684309718116754288299091975226013592388160308117145043236992250577771659408413506586402897189336742792418163003231783947003853396754144599319566763313339145462208172531322682800226151072022731913191728047323245146556315571396082728252085753230639541374982105041248659074695696205654079837224195868428271353983820725017250413714060967825638577327604252122887136259380946072629481202720339169708229866846597577227829317443910036825722430374711816074735238082313198164126791797947010044130222158124667234003098164746100341636238823175289796896896408971518797835906067939914494546110471749352544064300485882179448030898818405400902242119590645639910708635188342567159795613212660990908765619684401061336405049960091659288716162966504703741105477420409053115823924764680153604215949521605456710353305498258615912458036292507652321420277318757146737030628878096962452278346772976364597137682209395761868224382621093921689415088745975049380393255899867417274843474628482169247388041616142896804170033688742622605192409970919836724035274730923747265191248135577704760607590  
c = 4058526944014006069084945174812818814825704864122299028618329411106188952604728150732223145114766938864644072527523082946069975859381918224872075058517683896020489424720005770218969436595364473179601299857281520204212872074837132357469599147175121200219338329188718982224238281009625352190581095607599976922610436817213692622671732783554216636941121695116377777616027462234472833366922829073660312229117800995468022619934881890343086653577149166193139948443894324239522101581089953817527886638425552917578146958961373353776642091545344162923084513872918786615317499139918810812014781753970806739855831453833956364967  
  
for k in range(800, 1042):  
    f = int(factor(k))  
    e2s = (leak-k) % int(f)  
    tphi = (leak -k - e2s) // f  
  
    s = GCD(tphi,e2s)  
    if e2s.bit_length() == 1280 and isPrime(e2s)==False and s.bit_length()>=255:  
        print(k)  
        print(s)  
        break  

e = iroot(e2s //s,2)[0]  
phi = tphi // s  
e = 65537  
d= inverse(e,phi)  
m = pow(c,d,n)  
flag1 = long_to_bytes(m).decode()  
print(flag1)

 ISCTF(CRYPTO)_第10张图片

 求解p值

from Crypto.Util.number import *
from random import randint,getrandbits
from sympy import factorial as factor
from gmpy2 import is_prime as is_strongPrime
from gmpy2 import gcd
from libnum import s2n

from Crypto.Util.number import *
def gcd(a,b): 
    if(b==0): 
        return a 
    else: 
        return gcd(b,a%b) 
s =  [362437850887271063413256292444148642949623196635276044583204094265607936120337004605360832421011, 1932915843524327487337992118762711929552569713433223514001673251237692307587356544615955431611435994003602897830069566867051943572065473955405337889221398, 11222178024143398739150445814520244630341642052876364179793404105841311693968292227072031763726153574031884490677131749512430325919668649359617953965112844, 5408933876805830533113961512210040977462510675785228477646978801328722923647434079128879371684477664804744431834418916837956820965870203842552250165916773, 1447143741705069323823257922715038721270982554690635708441585728089036094805730054505696492295730683300002193478561819037345041940787115528445592303142510, 3707657531268843465369646969917923274507341341483950204025637357600814449263032574496424566705812439915548150679438579110456264431525526309588664326456861, 9263925820149827740182684692442727161206242182976684575667062235695526783971703826794731732152445051579616121306722939129265340347908823003172137299057843, 207494591333501391015462321304802957885928775185602834554977737560856036337667840127810136802887548047878444936730742505483927963807357904024967768148122, 7052936859446617933917872361389151092893299250603966165472023802877016733939957851026719428770748111897050866474067880613419756475700748999497496482278608, 1169538791889404037461397919075674424569430764451305755000680272926397357803359328850780774937432248011264334398346178303234064891680342161511829008635621]
t = []
for i in range(9):
    t.append(s[i]-s[i-1]) 
all_n = []
for i in range(7):
    all_n.append(gcd((t[i+1]*t[i-1]-t[i]*t[i]), (t[i+2]*t[i]-t[i+1]*t[i+1]))) 

MMI = lambda A, n,s=1,t=0,N=0: (n < 2 and t%N or MMI(n, A%n, t, s-A//n*t, N or n),-1)[n<1]
for p in all_n:
    p=abs(p)
    if p==1:
        continue
    a=(s[2]-s[1])*MMI((s[1]-s[0]),p)%p
    ani=MMI(a,p)
    b=(s[1]-a*s[0])%p
    seed = (ani*(s[0]-b))%p
    plaintext=seed
    q = n // p
    if plaintext.bit_length() >= 63 and leak1-p-q==0:
        #continue
        print(a)
        print(b)
        print(p)
        print(seed)

 下面求seed的值

a = 77103936782340200964969557381530979461498267151335748569651214009683718895787
b = 80415964905483336441916158760498483436647287707097172421898625062076211518999
seed = 4700640019334050676
leak2 = []
for i in range(10):
    leak2.append(seed := (seed * a + b) % p)
#print(f"{leak2 = }")
seed = (seed * a + b) % p
print(seed)

 得到

send = 4200187646212318518523978419030779663356898929497560679154263632881543657050959427183966634462102477814580819864753365867968297383142555109096365631733722
p = 11264801007674911194937296213273187573443204642014287324272028337905327910709752151600908437791201988791057475198631585558489141831119442330004018572678099
#leak1 = p + q + k*n
q = n // p
#print('q=',q)
q= 12270258919358717211274873064951570816140677981168716706933794642816826626721009483552713742714041848236510559124226452744136990369859927852323092110060811

 爆破key

for key in trange(60000000+1,10**8 //2+1,-2):
    if is_prime(key) and not is_strongPrime(key):
        print(key)
        break
#key = 56052361

  尝试恢复base

   

key = 56052361
base = key ^ seed
print(base)
e=0x10001
d = inverse(e,(p-1)*(q-1))
final = [2268617516274900905319941795987877533673889507146326516564545408684476960310333170888941124460992562245780101836116975666368936099249664924148379487909122, 1445275952377746701088629016221431744592935398639655895336779954310077866709012082302847692239730041591520169244063854849129773530127510048494782550102381, 7]
c = 0
for i in range(len(final)):
    c += final[i] * (base ** i)

print(c)
m = pow(c,d,n)
flag2 = long_to_bytes(m).decode()
print(flag2)

 

    

你可能感兴趣的:(python,开发语言)