from Crypto.Util.number import * from gmpy2 import * from serct import flag p = getPrime(512) q = getPrime(512) n = p*q m = bytes_to_long(flag) e = 65537 c = powmod(m, e, n) print(n) print(c)
import gmpy2 from Crypto.Util.number import long_to_bytes
n = 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153 c = 48757373363225981717076130816529380470563968650367175499612268073517990636849798038662283440350470812898424299904371831068541394247432423751879457624606194334196130444478878533092854342610288522236409554286954091860638388043037601371807379269588474814290382239910358697485110591812060488786552463208464541069 p = 7221289171488727827673517139597844534869368289455419695964957239047692699919030405800116133805855968123601433247022090070114331842771417566928809956044421 q = 7221289171488727827673517139597844534869368289455419695964957239047692699919030405800116133805855968123601433247022090070114331842771417566928809956045093 e = 65537 phi=(p-1)*(q-1) d=gmpy2.invert(e, phi) m=pow(c,d,n) print(long_to_bytes(m))
#As a freshman starting in 2024, you should know something about XOR, so this task is for you to sign in.
from pwn import xor #The Python pwntools library has a convenient xor() function that can XOR together data of different types and lengths from Crypto.Util.number import bytes_to_long
flag = b'flag{*****}' p = getPrime(512) q = getPrime(512) n = p*q e = 65537
m = bytes_to_long(flag) c = pow(m, e, n)
hint = p^e + 10086
print("c =", c) print("[n, e] =", [n, e]) print("hint =", hint) ''' c = 36513006092776816463005807690891878445084897511693065366878424579653926750135820835708001956534802873403195178517427725389634058598049226914694122804888321427912070308432512908833529417531492965615348806470164107231108504308584954154513331333004804817854315094324454847081460199485733298227480134551273155762 [n, e] = [124455847177872829086850368685666872009698526875425204001499218854100257535484730033567552600005229013042351828575037023159889870271253559515001300645102569745482135768148755333759957370341658601268473878114399708702841974488367343570414404038862892863275173656133199924484523427712604601606674219929087411261, 65537] hint = 12578819356802034679792891975754306960297043516674290901441811200649679289740456805726985390445432800908006773857670255951581884098015799603908242531673390 '''
解题代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13
from Crypto.Util.number import inverse, long_to_bytes
c = 36513006092776816463005807690891878445084897511693065366878424579653926750135820835708001956534802873403195178517427725389634058598049226914694122804888321427912070308432512908833529417531492965615348806470164107231108504308584954154513331333004804817854315094324454847081460199485733298227480134551273155762 n = 124455847177872829086850368685666872009698526875425204001499218854100257535484730033567552600005229013042351828575037023159889870271253559515001300645102569745482135768148755333759957370341658601268473878114399708702841974488367343570414404038862892863275173656133199924484523427712604601606674219929087411261 e = 65537 hint = 12578819356802034679792891975754306960297043516674290901441811200649679289740456805726985390445432800908006773857670255951581884098015799603908242531673390
p = hint^e+10086 q=n//p phi=(p-1)*(q-1) d=pow(e, -1,phi) m=pow(c,d,n) print(long_to_bytes(m))
2、Since you konw something
题目如下
1 2 3 4 5 6 7 8 9 10 11 12 13
from pwn import xor #The Python pwntools library has a convenient xor() function that can XOR together data of different types and lengths from Crypto.Util.number import bytes_to_long
key = ?? #extremely short FLAG = 'flag{????????}' c = bytes_to_long(xor(FLAG,key))
flag = b'flag{?????}' m1 = bytes_to_long(flag[:len(flag)//2]) m2 = bytes_to_long(flag[len(flag)//2:]) e = 65537 p, q, r= (getPrime(512) for _ in range(3)) N=p*q*r c1 = pow(m1, e, p) c2 = pow(m2, e, N)
a = "" for i in flag: a += hex(ord(i))[2:] l = int(a,16).bit_length() print("l =" , l )
v0 = int(a,16)>>(l//2) v1 = int(a,16)-(v0<<(l//2)) p = getPrime(l//2+10)
v2 = 0 derta = 462861781278454071588539315363 v3 = 489552116384728571199414424951 v4 = 469728069391226765421086670817 v5 = 564098252372959621721124077407 v6 = 335640247620454039831329381071 assert v1 < p and v0 < p and derta < p and v3 < p and v4 < p and v5 < p and v6 < p
for i in range(32): v1 += (v0+v2) ^ ( 8*v0 + v3 ) ^ ( (v0>>7) + v4 ) ; v1 %= p v0 += (v1+v2) ^ ( 8*v1 + v5 ) ^ ( (v1>>7) + v6 ) ; v0 %= p v2 += derta ; v2 %= p
def related_message_attack(a, b): q, r = a.quo_rem(b) if r == 0: return b R00, R01, R10, R11 = HGCD(a, b) c = R00 * a + R01 * b d = R10 * a + R11 * b if d == 0: return c.monic() q, r = c.quo_rem(d) if r == 0: return d return related_message_attack(d, r)
e = 683 c1 = 56853945083742777151835031127085909289912817644412648006229138906930565421892378967519263900695394136817683446007470305162870097813202468748688129362479266925957012681301414819970269973650684451738803658589294058625694805490606063729675884839653992735321514315629212636876171499519363523608999887425726764249 c2 = 89525609620932397106566856236086132400485172135214174799072934348236088959961943962724231813882442035846313820099772671290019212756417758068415966039157070499263567121772463544541730483766001321510822285099385342314147217002453558227066228845624286511538065701168003387942898754314450759220468473833228762416 N = 147146340154745985154200417058618375509429599847435251644724920667387711123859666574574555771448231548273485628643446732044692508506300681049465249342648733075298434604272203349484744618070620447136333438842371753842299030085718481197229655334445095544366125552367692411589662686093931538970765914004878579967 delta = 93400488537789082145777768934799642730988732687780405889371778084733689728835104694467426911976028935748405411688535952655119354582508139665395171450775071909328192306339433470956958987928467659858731316115874663323404280639312245482055741486933758398266423824044429533774224701791874211606968507262504865993
is_flag = False
for delt in range(-255, 255, 8):
PR.<x> = PolynomialRing(Zmod(N)) f = x ^ e - c1 g1 = ((x + (delt + 0) * delta) ^ e - c2) * ((x + (delt + 1) * delta) ^ e - c2) g2 = ((x + (delt + 2) * delta) ^ e - c2) * ((x + (delt + 3) * delta) ^ e - c2) g3 = ((x + (delt + 4) * delta) ^ e - c2) * ((x + (delt + 5) * delta) ^ e - c2) g4 = ((x + (delt + 6) * delta) ^ e - c2) * ((x + (delt + 7) * delta) ^ e - c2) if delt == -7: g4 = ((x + (delt + 6) * delta) ^ e - c2) g = g1 * g2 * g3 * g4 res = related_message_attack(f, g) m1 = int(-res.monic().coefficients()[0]) for t1 in range(256): m = (m1 % N - t1 * delta) % N if m > 0: flag = long_to_bytes(m) if flag[:4] ==b'flag': print(flag) is_flag = True break
m = "f9899749fec184d81afecd35da430bc394686e847d72141b3a955a4f6e920e7d91cb599d92ba2a6ba51860bb5b32f23b" c = "f2040fe3063a5b6c65f66e1d2bf47b4cddb206e4ddcf7524932d25e92d57d3468398730b59df851cbac6d65073f9e138"
e = getPrime(64) a_big_prime = getPrime( 512 ) hint = pow(a_big_prime,e,2**512) print( "big_prime is: " , a_big_prime ) print( "hint is: " , hint )
n = p*q*r c = pow( m , e , n ) print( "c=" , c )
""" hint_of_pqr= 31142735238530997044538008977536563192992446755282526163704097825748037157617958329370018716097695151853567914689441893020256819531959835133410539308633497 83244528500940968089139246591338465098116598400576450028712055615289379610182828415628469144649133540240957232351546273836449824638227295064400834828714760 248913032538718194100308575844236838621741774207751338576000867909773931464854644505429950530402814602955352740032796855486666128271187734043696395254816172 big_prime is: 10340528340717085562564282159472606844701680435801531596688324657589080212070472855731542530063656135954245247693866580524183340161718349111409099098622379 hint is: 1117823254118009923270987314972815939020676918543320218102525712576467969401820234222225849595448982263008967497960941694470967789623418862506421153355571 c= 999238457633695875390868312148578206874085180328729864031502769160746939370358067645058746087858200698064715590068454781908941878234704745231616472500544299489072907525181954130042610756999951629214871917553371147513692253221476798612645630242018686268404850587754814930425513225710788525640827779311258012457828152843350882248473911459816471101547263923065978812349463656784597759143314955463199850172786928389414560476327593199154879575312027425152329247656310 """
def get_prime(bits): while True: p = getPrime(bits) x = (1 << bits) - 1 ^ p for i in range(-10, 11): if isPrime(x + i): return p, x + i, i
p, q, i = get_prime(512) n = p * q e = 65537 c = pow(m, e, n)
print("c =", c) print("n =", n) print("i =", i) ''' c = 14859652090105683079145454585893160422247900801288656111826569181159038438427898859238993694117308678150258749913747829849091269373672489350727536945889312021893859587868138786640133976196803958879602927438349289325983895357127086714561807181967380062187404628829595784290171905916316214021661729616120643997 n = 18104347461003907895610914021247683508445228187648940019610703551961828343286923443588324205257353157349226965840638901792059481287140055747874675375786201782262247550663098932351593199099796736521757473187142907551498526346132033381442243277945568526912391580431142769526917165011590824127172120180838162091 i = -3 '''
(1 << bits) - 1是一个位掩码,它的二进制表现形式是 bites 个 1 。这个位掩码与 p 进行异或(^)操作,得到结果 x。则 p + x = 2⁵¹² - 1 ,推导得 p + q = 2⁵¹² + i - 1
from Crypto.Util.number import * c = 14859652090105683079145454585893160422247900801288656111826569181159038438427898859238993694117308678150258749913747829849091269373672489350727536945889312021893859587868138786640133976196803958879602927438349289325983895357127086714561807181967380062187404628829595784290171905916316214021661729616120643997 n = 18104347461003907895610914021247683508445228187648940019610703551961828343286923443588324205257353157349226965840638901792059481287140055747874675375786201782262247550663098932351593199099796736521757473187142907551498526346132033381442243277945568526912391580431142769526917165011590824127172120180838162091 i = -3 e = 65537
phi = n - 2**512 + 2 - i d = inverse(e, phi) m = pow(c, d, n) print(long_to_bytes(m))
from Crypto.Util.number import * from gmpy2 import * import random
n = 141425071303405369267688583480971314815032581405819618511016190023245950842423565456025578726768996255928405749476366742320062773129810617755239412667111588691998380868379955660483185372558973059599254495581547016729479937763213364591413126146102483671385285672028642742654014426993054793378204517214486744679 c = 104575090683421063990494118954150936075812576661759942057772865980855195301985579098801745928083817885393369435101522784385677092942324668770336932487623099755265641877712097977929937088259347596039326198580193524065645826424819334664869152049049342316256537440449958526473368110002271943046726966122355888321 y = 217574365691698773158073738993996550494156171844278669077189161825491226238745356969468902038533922854535578070710976002278064001201980326028443347187697136216041235312192490502479015081704814370278142850634739391445817028960623318683701439854891399013393469200033510113406165952272497324443526299141544564964545937461632903355647411273477731555390580525472533399606416576667193890128726061970653201509841276177937053500663438053151477018183074107182442711656306515049473061426018576304621373895497210927151796054531814746265988174146635716820986208719319296233956243559891444122410388128465897348458862921336261068868678669349968117097659195490792407141240846445006330031546721426459458395606505793093432806236790060342049066284307119546018491926250151057087562126580602631912562103705681810139118673506298916800665912859765635644796622382867334481599049728329203920912683317422430015635091565073203588723830512169316991557606976424732212785533550238950903858852917097354055547392337744369560947616517041907362337902584102983344969307971888314998036201926257375424706901999793914432814775462333942995267009264203787170147555384279151485485660683109778282239772043598128219664150933315760352868905799949049880756509591090387073778041 e = 65537
c=312026920216195772014255984174463085443866592575942633449581804171108045852080517840578408476885673600123673447592477875543106559822653280458539889975125069364584140981069913341705738633426978886491359036285144974311751490792757751756044409664421663980721578870582548395096887840688928684149014816557276765747135567714257184475027270111822159712532338590457693333403200971556224662094381891648467959054115723744963414673861964744567056823925630723343002325605154661959863849738333074326769879861280895388423162444746726568892877802824353858845944856881876742211956986853244518521508714633279380808950337611574412909 p=108043725609186781791705090463399988837848128384507136697546885182257613493145758848215714322999196482303958182639388180063206708575175264502030010971971799850889123915580518613554382722069874295016841596099030496486069157061211091761273568631799006187376088457421848367280401857536410610375012371577177832001 q=121590551121540247114817509966135120751936084528211093275386628666641298457070126234836053337681325952068673362753408092990553364818851439157868686131416391201519794244659155411228907897025948436021990520853498462677797392855335364006924106615008646396883330251028071418465977013680888333091554558623089051503 d = inverse(65537,(p-1)*(q-1)) n = p*q m = pow(c,d,n) print(long_to_bytes(m)) # b'flag{No_course_e_can_play}'
p = getPrime(512) q = getPrime(512) r = random.randint(2**8, 2**9) assert ((p+2*r) * 3*a + q) % b < 70
c = pow(m, 0x10001, p*q)
print(f'c =', c) print(f'a =', a) print(f'b =', b)
''' c = 75671328500214475056134178451562126288749723392201857886683373274067151096013132141603734799638338446362190819013087028001291030248155587072037662295281180020447012070607162188511029753418358484745755426924178896079516327814868477319474776976247356213687362358286132623490797882893844885783660230132191533753 a = 99829685822966835958276444400403912618712610766908190376329921929407293564120124118477505585269077089315008380226830398574538050051718929826764449053677947419802792746249036134153510802052121734874555372027104653797402194532536147269634489642315951326590902954822775489385580372064589623985262480894316345817 b = 2384473327543107262477269141248562917518395867365960655318142892515553817531439357316940290934095375085624218120779709239118821966188906173260307431682367028597612973683887401344727494920856592020970209197406324257478251502340099862501536622889923455273016634520507179507645734423860654584092233709560055803703801064153206431244982586989154685048854436858839309457140702847482240801158808592615931654823643778920270174913454238149949865979522520566288822366419746 '''
from Crypto.Util.number import * import sympy c = 75671328500214475056134178451562126288749723392201857886683373274067151096013132141603734799638338446362190819013087028001291030248155587072037662295281180020447012070607162188511029753418358484745755426924178896079516327814868477319474776976247356213687362358286132623490797882893844885783660230132191533753 a = 99829685822966835958276444400403912618712610766908190376329921929407293564120124118477505585269077089315008380226830398574538050051718929826764449053677947419802792746249036134153510802052121734874555372027104653797402194532536147269634489642315951326590902954822775489385580372064589623985262480894316345817 b = 2384473327543107262477269141248562917518395867365960655318142892515553817531439357316940290934095375085624218120779709239118821966188906173260307431682367028597612973683887401344727494920856592020970209197406324257478251502340099862501536622889923455273016634520507179507645734423860654584092233709560055803703801064153206431244982586989154685048854436858839309457140702847482240801158808592615931654823643778920270174913454238149949865979522520566288822366419746
""" # sage B = matrix(ZZ,[[b,0],[3*a,1]]) L = B.LLL() qq, pp = L[0] print(qq) # x - q print(pp) # p + 2*r """ qq = 12553079242047273200410744010920686742714472539778118466643782351818207654054816235539817026967922181500347097851997373426957983731540358100874779586363161 pp = -7961804506966720608961911712423186156751023218208634880812696209250224567983435028132223624549972986085731566218918056301880603380822282526191335173035835
pp = -pp # 注1 for i in range(2**8, 2**9): for j in range(70): p = pp - 2*i # 注2 q = qq + j # 注3 phi = (p-1)*(q-1) if sympy.gcd(phi, 65537) != 1: continue d = inverse(65537, phi) n = p*q m = pow(c, d, n) flag = long_to_bytes(m) if b'flag{' in flag: print(flag) break # b'flag{u_are_@_master_of_latt1ce_Crypt0gr@phy}'
注1:为什么要进行pp = -pp呢?因为 LLL 算法仅仅是在格上找到符合条件的短向量,并不保证矢量的方向,pp代表的是 p + 2 * r 的近似值,而 p 是一个大素数,所以 pp 应该是正数。
注2:因为 pp ≈ p + 2 * r,所以有p = pp - 2*i
注3:同理,qq ≈ x - q,这意味着 qq 是 x 和 q 之间的差,又因为 q 是一个大素数,x < 70,所以 q = qq + j
from Crypto.Util.number import * c = 119084320846787611587774426118526847905825678869032529318497425064970463356147909835330423466179802531093233559613714033492951177656433798856482195873924140269461792479008703758436687940228268475598134411304167494814557384094637387369282900460926092035234233538644197114822992825439656673482850515654334379332 s = 5461514893126669960233658468203682813465911805334274462134892270260355037191167357098405392972668890146716863374229152116784218921275571185229135409696720018765930919309887205786492284716906060670649040459662723215737124829497658722113929054827469554157634284671989682162929417551313954916635460603628116503 n = 139458221347981983099030378716991183653410063401398496859351212711302933950230621243347114295539950275542983665063430931475751013491128583801570410029527087462464558398730501041018349125941967135719526654701663270142483830687281477000567117071676521061576952568958398421029292366101543468414270793284704549051 e = 65537
from Crypto.Util.number import * # type: ignore from secret import flag
p = 64408890408990977312449920805352688472706861581336743385477748208693864804529 a = 111430905433526442875199303277188510507615671079377406541731212384727808735043 b = 89198454229925288228295769729512965517404638795380570071386449796440992672131 E = EllipticCurve(GF(p),[a,b]) m = E.random_point() G = E.random_point() k = 86388708736702446338970388622357740462258632504448854088010402300997950626097 K = k * G r = getPrime(256) c1 = m + r * K c2 = r * G c_left =bytes_to_long(flag[:len(flag)//2]) * m[0] c_right = bytes_to_long(flag[len(flag)//2:]) * m[1]
from Crypto.Util.number import * """ # sage p = 64408890408990977312449920805352688472706861581336743385477748208693864804529 a = 111430905433526442875199303277188510507615671079377406541731212384727808735043 b = 89198454229925288228295769729512965517404638795380570071386449796440992672131 k = 86388708736702446338970388622357740462258632504448854088010402300997950626097 E = EllipticCurve(GF(p),[a,b])