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,long_to_bytes
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)
from Crypto.Utill.number import * import gmpy2 c = 36513006092776816463005807690891878445084897511693065366878424579653926750135820835708001956534802873403195178517427725389634058598049226914694122804888321427912070308432512908833529417531492965615348806470164107231108504308584954154513331333004804817854315094324454847081460199485733298227480134551273155762 n = 124455847177872829086850368685666872009698526875425204001499218854100257535484730033567552600005229013042351828575037023159889870271253559515001300645102569745482135768148755333759957370341658601268473878114399708702841974488367343570414404038862892863275173656133199924484523427712604601606674219929087411261 hint = 12578819356802034679792891975754306960297043516674290901441811200649679289740456805726985390445432800908006773857670255951581884098015799603908242531673390 e = 65537 p = hint ^ 10086 + e q= n//p phi = (q-1)*(p-1) d = gmpy2.invert(e,phi) m = pow(c,d,n) print(long_to_bytes(m)) # flag{yihuo_yuan_lai_xian_ji_suan_liang_bian_de2333}
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))
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,long_to_bytes
c=218950457292639210021937048771508243745941011391746420225459726647571 FLAG = b'flag{????????}' print(long_to_bytes(c)) c = long_to_bytes(c) print(xor(c,FLAG)) key = 'ns' print(xor(c,key)) # flag{Y0u_kn0w_th3_X0r_b3tt3r}
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 inrange(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
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 _ inrange(3)) N=p*q*r c1 = pow(m1, e, p) c2 = pow(m2, e, N)
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 """
p = 3 * h1 - h2 r = (9 * h1 - h3)//3 q = h1 - p - r
n = p*q*r phi = (p-1)*(q-1)*(r-1) e = sympy.discrete_log(2**512,hint,big_prime) d = gmpy2.invert(e,phi) m = pow(c,d,n) print(long_to_bytes(m)) # flag{th1s_2s_A_rea119_f34ggg}
from Crypto.Util.number import long_to_bytes as l2b , bytes_to_long as b2l
c = 0xf2040fe3063a5b6c65f66e1d2bf47b4cddb206e4ddcf7524932d25e92d57d3468398730b59df851cbac6d65073f9e138 d = 0xf9899749fec184d81afecd35da430bc394686e847d72141b3a955a4f6e920e7d91cb599d92ba2a6ba51860bb5b32f23b
defrelated_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 inrange(-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 inrange(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
defget_prime(bits): whileTrue: p = getPrime(bits) x = (1 << bits) - 1 ^ p for i inrange(-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 '''
考点:二进制加法,间接求欧拉函数
我们有以下式子
$ x = (1 << bits) - 1 \text{^} p $
那么就要了解一下二进制加法
1 2 3
a = 0b1001 b = a ^ 0b1111 = 0b0110 a + b = 1111
所有我们有$ x + p= (1 << bits) - 1 $
然后1<<512是$ 2^{512} $
所以$ x + p= 2^{512} - 1 $
所以$ p+q = p+x+i=2^{512}-1+i $
$ phi(n)=(p-1)(q-1)=pq-(p+q)+1=n-2^{512}+2-i $
后面就没有难度了,求出d正常求解就行
1 2 3 4 5 6 7 8 9 10 11 12
from Crypto.Util.number import * import gmpy2
e = 65537 c = 14859652090105683079145454585893160422247900801288656111826569181159038438427898859238993694117308678150258749913747829849091269373672489350727536945889312021893859587868138786640133976196803958879602927438349289325983895357127086714561807181967380062187404628829595784290171905916316214021661729616120643997 n = 18104347461003907895610914021247683508445228187648940019610703551961828343286923443588324205257353157349226965840638901792059481287140055747874675375786201782262247550663098932351593199099796736521757473187142907551498526346132033381442243277945568526912391580431142769526917165011590824127172120180838162091 i = -3 phi = n - 2**512 + 2 - i d = gmpy2.invert(e,phi) m = pow(c,d,n) print(long_to_bytes(m)) # flag{y0u_really_kn0w_the_phi}
from Crypto.Util.number import * from gmpy2 import * import random
n = 141425071303405369267688583480971314815032581405819618511016190023245950842423565456025578726768996255928405749476366742320062773129810617755239412667111588691998380868379955660483185372558973059599254495581547016729479937763213364591413126146102483671385285672028642742654014426993054793378204517214486744679 c = 104575090683421063990494118954150936075812576661759942057772865980855195301985579098801745928083817885393369435101522784385677092942324668770336932487623099755265641877712097977929937088259347596039326198580193524065645826424819334664869152049049342316256537440449958526473368110002271943046726966122355888321 y = 217574365691698773158073738993996550494156171844278669077189161825491226238745356969468902038533922854535578070710976002278064001201980326028443347187697136216041235312192490502479015081704814370278142850634739391445817028960623318683701439854891399013393469200033510113406165952272497324443526299141544564964545937461632903355647411273477731555390580525472533399606416576667193890128726061970653201509841276177937053500663438053151477018183074107182442711656306515049473061426018576304621373895497210927151796054531814746265988174146635716820986208719319296233956243559891444122410388128465897348458862921336261068868678669349968117097659195490792407141240846445006330031546721426459458395606505793093432806236790060342049066284307119546018491926250151057087562126580602631912562103705681810139118673506298916800665912859765635644796622382867334481599049728329203920912683317422430015635091565073203588723830512169316991557606976424732212785533550238950903858852917097354055547392337744369560947616517041907362337902584102983344969307971888314998036201926257375424706901999793914432814775462333942995267009264203787170147555384279151485485660683109778282239772043598128219664150933315760352868905799949049880756509591090387073778041 e = 65537
from Crypto.Util.number import * from gmpy2 import *
s = 7270513885194445005322518350289419893608325839878215682947885852347014936106128407554345668066935779849573932055239642406851308417046145495939362638652861562381316163080735160853285303356461796079298817982074998651099375222398758502559657988024308504098238446594559605603104540325738607539729848183025647146 e = 65537 n = 118167767283404647838357773955032661171703847685597271116789633496884884504237966404005641401909577369476550625894333528860763752286157264860218284704704444830864099870199623580368198306940575628872723737071517733553706154898255520538220530675603850372384339470410704813339357637359108745206967929184573003377
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]
# 运行环境sagemath from Crypto.Util.number import * p = 64408890408990977312449920805352688472706861581336743385477748208693864804529 a = 111430905433526442875199303277188510507615671079377406541731212384727808735043 b = 89198454229925288228295769729512965517404638795380570071386449796440992672131 k = 86388708736702446338970388622357740462258632504448854088010402300997950626097
m = c1 - k * c2 left = cipher_left//m[0] right = cipher_right//m[1] # 不能转int或Integer型,不然结果为0,不知道为什么,很奇怪 print(long_to_bytes(int(left))+long_to_bytes(int(right)))
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 '''
# sage from gmpy2 import * from Crypto.Util.number import * #from tqdm import * c = 63970090307730335877809721304200883550049640814796584855311919788444862517887223732986595675409088426370045912297203884697715744287109423956446588104144896948474600924252971426757693149049788176140093762669257572818136268391076675502412382985137721246839664247241033867414491199483652292036165169353341736721 a = 169095591032842107903100075180638676605851796444162152675549552436872904263319011471312171874748357621716550291723406808357475877569622382251716493461335948233920131882151228308789748286370580144669281233868187101339909767205887609164975015547772498904502805235278789412044800177551190013789791754504529931231 b = 6064645365981235887306179215270851271718801644429108711725310294864007556801445216060166346337708059041073442260127725535139356989204300545757168654885686344461282796094266688090445897296901297377920786192865778222921548386038058555872765953356732109313734205459623312689902913019046944089470201948948652890006944620407534229412159275346491001935499731177063675134035072472112134333424000794637616785944210359606751334132126595044554089452160862222153579096125950 mat = [[b,0],[3*a,1]] M = Matrix(ZZ,mat) qq,pp= M.LLL()[0] # pp=p+2r,qq=x-q print(pp) print(qq)
c = 63970090307730335877809721304200883550049640814796584855311919788444862517887223732986595675409088426370045912297203884697715744287109423956446588104144896948474600924252971426757693149049788176140093762669257572818136268391076675502412382985137721246839664247241033867414491199483652292036165169353341736721
for i inrange(2 ** 8, 2 ** 9): for j inrange(70): p = pp - 2 * i q = qq + j phi = (p - 1) * (q - 1) if gmpy2.gcd(phi, 65537) != 1: continue d = gmpy2.invert(65537, phi) n = p * q m = pow(c, d, n) flag = libnum.n2s(int(m)) ifb'flag'in flag: print(flag) break