from Crypto.Util.number import * P = 66302204855869216148926460265779698576660998574555407124043768605865908069722142097621926304390549253688814246272903647124801382742681337653915017783954290069842646020090511605930590064443141710086879668946 n = 24479907029118467064460793139240403258697681144532146836881997837526487637306591893357774423547391867013441147680031968367449693796015901951120514250935018725570026327610524687128709707340727799633444550317834481416507364804274266363478822257132586592232042108076935945436358397787891169163821061005102693505011197453089873909085170776511350713452580692963748763166981047023704528272230392479728897831538235554137129584665886878574314566549330671483636900134584707867654841021494106881794644469229030140144595938886437242375435914268001721437309283611088568191856208951867342004280893021653793820874747638264412653721
p_fake = P << 340 pbits = p_fake.nbits() pbar = p_fake & (2^pbits-2^kbits) PR.<x> = PolynomialRing(Zmod(n)) f = x + pbar x0 = f.small_roots(X=2^340, beta=0.4)[0] p = x0 + pbar print(p) #148500014720728755901835170447203030242113125689825190413979909224639701026120883281188694701625473553602289432755479244507504340127322979884849883842306663453018960250560834067472479033116264539127330613635903666209920113813160301513820286874124210921593865507657148933555053341577090100101684021531775022459
得到p之后就是简单的RSA
1 2 3 4 5 6 7 8 9 10
from Crypto.Util.number import * e=65537 n= 24479907029118467064460793139240403258697681144532146836881997837526487637306591893357774423547391867013441147680031968367449693796015901951120514250935018725570026327610524687128709707340727799633444550317834481416507364804274266363478822257132586592232042108076935945436358397787891169163821061005102693505011197453089873909085170776511350713452580692963748763166981047023704528272230392479728897831538235554137129584665886878574314566549330671483636900134584707867654841021494106881794644469229030140144595938886437242375435914268001721437309283611088568191856208951867342004280893021653793820874747638264412653721 p = 148500014720728755901835170447203030242113125689825190413979909224639701026120883281188694701625473553602289432755479244507504340127322979884849883842306663453018960250560834067472479033116264539127330613635903666209920113813160301513820286874124210921593865507657148933555053341577090100101684021531775022459 c= 6566517934961780069851397787369134601399136324586682773286046135297104713708615112015588908759927424841719937322574766875308296258325687730658550956691921018605724308665345526807393669538103819281108643141723589363068859617542807984954436567078438099854340705208503317269397632214274507740533638883597409138972287275965697689862321166613821995226000320597560745749780942467497435742492468670016480112957715214640939272457886646483560443432985954141177463448896521810457886108311082101521263110578485768091003174683555938678346359150123350656418123918738868598042533211541966786594006129134087145798672161268647536724 q = n // p phi = (p-1) * (q-1) d = inverse(e, phi) m = pow(c, d, n) print(long_to_bytes(m))
from Crypto.Util.number import getPrime, bytes_to_long #from secret import flag flag=b'XXXX'
p = getPrime(1024) q = getPrime(1024) n = p * q e = 65537 hint1 = p >> 721 hint2 = q % (2 ** 266) ct = pow(bytes_to_long(flag), e, n) print(hint1) print(hint2) print(n) print(ct) ''' hint1 = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178 hint2 = 90063199151369157959005663017593053931871580139169245885113098598755909124764417 n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461 ct = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289 '''
这里可以看到p是一个高位q是低位通过计算我们可以得到有455位数的未知数
运用coppersmith来进行求解
$$ n \equiv pq \equiv (p_low)(q_low) \mod 2^{266} $$ $$ x_0*hint2 \equiv n \mod 2^{266} $$ $$ p = (hint1<<721)+x^{266}+X_0 $$ $$ f(x)=p+2^{266}*x \quad (p_0=(hint1<<721)+x_0) $$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#sage hint1 = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178 hint2 = 90063199151369157959005663017593053931871580139169245885113098598755909124764417 n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461 ct = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289 e = 65537 p_high = hint1<<721 q_low = hint2 mod = 1<<266 p_low = n*inverse_mod(q_low,mod) % mod PR.<x> = PolynomialRing(Zmod(n)) f = p_high + x*mod + p_low pp = f.monic().small_roots(X=2^455,beta=0.4) if pp: p=(pp[0]*mod)+p_high+p_low print(p)
得到p的数值然后就是RSA
1 2 3 4 5 6 7 8 9 10 11 12 13
from Crypto.Util.number import * from gmpy2 import *
p = 159283759372043950279417056412033091802265743745598264436861098130148724970544195213191649176146680513963936883226073882981043500266750021458811522117917329282086352568217051323687992730755300271109836959298927976601834111434688928933727743853427947839181032241795612450167686056781516529650558649534989394677 n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461 e = 65537 ct =15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289
q = n // p phi = (p - 1) * (q - 1) d = inverse(e, phi) m = long_to_bytes(pow(ct, d, n)) print(m)
from flag import flag defgen(): e = 3 whileTrue: try: p = getPrime(512) q = getPrime(512) n = p*q phi = (p-1)*(q-1) d = inverse(e,phi) return p,q,d,n,e except: continue return p,q,d,n,e = gen() r = getPrime(512) m = bytes_to_long(flag+os.urandom(32)) M = m%r c = pow(m,e,n) print("r = %d"%r) print("M = %d"%M) print("n = %d"%n) print("e = %d"%e) print("c = %d"%c) ''' r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473 M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558 n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287 e = 3 c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282 '''
已知:
$$ \begin{aligned} m &= k \cdot i + r \ c &\equiv m^e \pmod{n} \ c &\equiv (k \cdot i + r)^e \pmod{n} \end{aligned} $$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from Crypto.Util.number import *
r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473 M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558 n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287 e = 3 c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282 PR.<k> = PolynomialRing(Zmod(n)) f = (M + k*r)^e - c f=f.monic() x0 = f.small_roots(k=2^100, beta=1)[0] print (x0) m = x0*r+M print (m) #6485097232194198437755667993910287898649267551843383452848230535806020694959067046832721252854563061586676627325202840257402325662599788040642551541918619720183975021007170350613
p = getPrime(512) q = getPrime(512) n = p*q e=65537 flag = "flag{"+str(uuid.uuid4())[:20]+"}" m = bytes_to_long(flag.encode()) assert(m<n) c=pow(m,e,n)
print(f"h = {((p>>128)<<128)}") print(f"e = 65537") print(f"c = {c}") print(f"n = {n}") """ h = 9605964225476901441398365225327926616880072280289780777971846998748464126891804587377933727304510424852546683782576240573278202121547956666293242671661056 e = 65537 c = 2226099021169425534206121605501718994593261953280046899345810118356590881389142531649792348146129153474985003929407172972982275439970723778495455838452638879586163957468972518078320159354264971816842073874550773309020013613432004074760802192607651584906352686468143648939740004838208640531785439362344039075 n = 96928253979490973984593903132811649229014718994486532280648145898877952846656019305217095845257550421730063527538581223570539203247068060192535543753763017716750817560470547219370972835770943358384150269303529653434434525449357699107332781898776312692702549420939758722366794431784782973884379040574148608179 """
import gmpy2 from Crypto.Util.number import long_to_bytes
p = 9605964225476901441398365225327926616880072280289780777971846998748464126891804587377933727304510424852546683782576502313782852920367078761087206532330667 h = 9605964225476901441398365225327926616880072280289780777971846998748464126891804587377933727304510424852546683782576240573278202121547956666293242671661056 e = 65537 c = 2226099021169425534206121605501718994593261953280046899345810118356590881389142531649792348146129153474985003929407172972982275439970723778495455838452638879586163957468972518078320159354264971816842073874550773309020013613432004074760802192607651584906352686468143648939740004838208640531785439362344039075 n = 96928253979490973984593903132811649229014718994486532280648145898877952846656019305217095845257550421730063527538581223570539203247068060192535543753763017716750817560470547219370972835770943358384150269303529653434434525449357699107332781898776312692702549420939758722366794431784782973884379040574148608179 q = n//p n = p*q phi = (p-1)*(q-1) d = gmpy2.invert(e, phi) m = pow(c,d,n) print(long_to_bytes(m))
for i inrange(getPrime(16)): lcg.generate() print(lcg.generate()) print(lcg.generate()) print(lcg.generate()) print(lcg.generate()) print(lcg.generate())
n = gcd(T1, T2) print(n) for i inrange(1,100): if isPrime(n//i): print(i) n//=i break p1=outputs[3]-outputs[2] p2=outputs[2]-outputs[1] a = (p1)*gmpy2.invert(p2,n) % n print(a) b = (outputs[2]-a*outputs[1]) % n print(b)
a_1=gmpy2.invert(a,n) print(a_1) for i inrange(2**16): outputs[1] = a_1 * (outputs[1]-b) % n flag = long_to_bytes(outputs[1])
from secrets import flag, get_random_emojiiiiii from Crypto.Util.number import *
defgenarate_emojiiiiii_prime(nbits, base=0): whileTrue: p = getPrime(base // 32 * 32) if base >= 3else0 for i inrange(nbits // 8 // 4 - base // 32): p = (p << 32) + get_random_emojiiiiii() # 猜一猜 if isPrime(p): return p
m = bytes_to_long(flag.encode()+ "".join([long_to_bytes(get_random_emojiiiiii()).decode() for _ inrange(5)]).encode()) p = genarate_emojiiiiii_prime(512, 224) q = genarate_emojiiiiii_prime(512)
n = p * q e = "💯" c = pow(m, bytes_to_long(e.encode()), n)
print("p0 =", long_to_bytes(p % 2 ** 256).decode()) print("n =", n) print("c =", c) # p0 = 😘😾😂😋😶😾😳😷 # n = 156583691355552921614631145152732482393176197132995684056861057354110068341462353935267384379058316405283253737394317838367413343764593681931500132616527754658531492837010737718142600521325345568856010357221012237243808583944390972551218281979735678709596942275013178851539514928075449007568871314257800372579 # c = 47047259652272336203165844654641527951135794808396961300275905227499051240355966018762052339199047708940870407974724853429554168419302817757183570945811400049095628907115694231183403596602759249583523605700220530849961163557032168735648835975899744556626132330921576826526953069435718888223260480397802737401
import gmpy2 from Crypto.Util.number import * import libnum e=4036989615 c = 47047259652272336203165844654641527951135794808396961300275905227499051240355966018762052339199047708940870407974724853429554168419302817757183570945811400049095628907115694231183403596602759249583523605700220530849961163557032168735648835975899744556626132330921576826526953069435718888223260480397802737401 p = 12424840247075830662687097292458444573014198016321428995092662043898159667123240573630892907827505266982898641483333170032514244713840745287869771915696311 q = 12602471198163266643743702664647336358595911975665358584258749238146841559843060594842063473155049870396568542257767865369797827796765830093256146584311989 n = 156583691355552921614631145152732482393176197132995684056861057354110068341462353935267384379058316405283253737394317838367413343764593681931500132616527754658531492837010737718142600521325345568856010357221012237243808583944390972551218281979735678709596942275013178851539514928075449007568871314257800372579
phi=(p-1)*(q-1)
assert p*q == n d = inverse(e//15,phi) m = pow(c,d,n)
R.< x > = Zmod(p)[] f = x ^ 15 - m f = f.monic() res1 = f.roots() R.< x > = Zmod(q)[] f = x ^ 15 - m f = f.monic() res2 = f.roots()
for rp, _ in res1: for rq, _ in res2: mm = crt([int(rp), int(rq)], [p, q]) try: res = long_to_bytes(mm) ifb'TGCTF'in res: print(res.decode()) except: pass
TGCTF{🙇🏮🤟_🫡🫡🫡_🚩🚩🚩}😃😖😘😨😢
但是这道题其实并没有完全搞明白
语法题
1 2 3 4 5 6 7 8 9
n=int(input()) if n<=2: print(-1) else: ans='1 ' for i inrange(n,1,-1): ans+=str(i)+' ' print(ans)
m = int(input()) a="a" b="_" s="w" d="c" p="y" for i inrange(m-1): if(i%2==0): s+=a if i inrange(m-1): s+=s if i inrange(m-1): s+=d if i inrange(m-1): s+=p else: s+=b s+=a s+=p s+=d print(s)
n,m=map(int,input().split()) for i inrange(1,n+1): a=input() if'#'in a: x=i y=a.find('#')+1 if x==1or y==m: print('S'*(n-1)+'D'*(m-1)) else: print('D'*(m-1)+'S'*(n-1))
from gmssl import sm3 from random import SystemRandom from ast import literal_eval import os flag = os.environ["FLAG"] defSM3(data): d = [i for i in data] h = sm3.sm3_hash(d) return h defSM3_n(data, n=1, bits=256): for _ inrange(n): data = bytes.fromhex(SM3(data)) return data.hex()[:bits // 4]
# 处理错误响应 if sig_line == "You can't do that": continue try: qq_list = ast.literal_eval(sig_line) except: continue
# 计算目标签名片段 for i in useful_indices: if done_mask[i]: continue delta = step_target[i] - step_i[i] qq_i_bytes = bytes.fromhex(qq_list[i]) qq_target[i] = SM3_n(qq_i_bytes, delta, 256) done_mask[i] = True count_done += 1 print(f"Position {i} done: {count_done}/48")
# 提交伪造签名获取flag conn.sendline(b'2') conn.recvuntil(b'give me a qq: ') conn.sendline(str(qq_target).encode()) flag = conn.recvline().decode() print("FLAG:", flag) conn.close()