defdecrypt(c,key): result = "" for char in c: if'a' <= char <= 'z': result += chr((ord(char) - ord('a') - key)%26 + ord('a')) elif'A' <= char <= 'z': result += chr((ord(char) - ord('A') - key)%26 + ord('A')) else: result += char key += 2 return result
c = 'ksjr{EcxvpdErSvcDgdgEzxqjql}' Key = 5
flag =decrypt(c,Key) print(flag)
xor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#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
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)
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 '''
exp
1 2 3 4 5 6 7 8 9 10 11
hint = 12578819356802034679792891975754306960297043516674290901441811200649679289740456805726985390445432800908006773857670255951581884098015799603908242531673390 e = 65537 from Crypto.Util.number import * p = hint^e+10086 n=124455847177872829086850368685666872009698526875425204001499218854100257535484730033567552600005229013042351828575037023159889870271253559515001300645102569745482135768148755333759957370341658601268473878114399708702841974488367343570414404038862892863275173656133199924484523427712604601606674219929087411261 q=n//p phi=(p-1)*(q-1) d=inverse(e,phi) c = 36513006092776816463005807690891878445084897511693065366878424579653926750135820835708001956534802873403195178517427725389634058598049226914694122804888321427912070308432512908833529417531492965615348806470164107231108504308584954154513331333004804817854315094324454847081460199485733298227480134551273155762 m=pow(c,d,n) print(long_to_bytes(m))
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)
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))
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
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 """
defGCD(a, b): # print(a.degree(), b.degree()) 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 GCD(d, r)
sys.setrecursionlimit(500000)
R.<x> = PolynomialRing(Zmod(N)) for i in trange(1, 256): b=-delta*i f = x^e - c1 g = (x+b)^e - c2 res = GCD(f,g) m1=(int(-res.monic().coefficients()[0])) for j inrange(1, 256): flag=(m1-j*delta)%N flag=long_to_bytes(int(flag)) ifb'flag'in flag: print(flag) exit() #神必多项式板子好多毛病(雾
''' n = 141425071303405369267688583480971314815032581405819618511016190023245950842423565456025578726768996255928405749476366742320062773129810617755239412667111588691998380868379955660483185372558973059599254495581547016729479937763213364591413126146102483671385285672028642742654014426993054793378204517214486744679 c = 104575090683421063990494118954150936075812576661759942057772865980855195301985579098801745928083817885393369435101522784385677092942324668770336932487623099755265641877712097977929937088259347596039326198580193524065645826424819334664869152049049342316256537440449958526473368110002271943046726966122355888321 All_in_my_name = 217574365691698773158073738993996550494156171844278669077189161825491226238745356969468902038533922854535578070710976002278064001201980326028443347187697136216041235312192490502479015081704814370278142850634739391445817028960623318683701439854891399013393469200033510113406165952272497324443526299141544564964545937461632903355647411273477731555390580525472533399606416576667193890128726061970653201509841276177937053500663438053151477018183074107182442711656306515049473061426018576304621373895497210927151796054531814746265988174146635716820986208719319296233956243559891444122410388128465897348458862921336261068868678669349968117097659195490792407141240846445006330031546721426459458395606505793093432806236790060342049066284307119546018491926250151057087562126580602631912562103705681810139118673506298916800665912859765635644796622382867334481599049728329203920912683317422430015635091565073203588723830512169316991557606976424732212785533550238950903858852917097354055547392337744369560947616517041907362337902584102983344969307971888314998036201926257375424706901999793914432814775462333942995267009264203787170147555384279151485485660683109778282239772043598128219664150933315760352868905799949049880756509591090387073778041 '''
关键地方
1 2 3 4 5 6
defAll_in_my_name(p, q): #开启三技能<俱以我之名>后,维娜立即在周围八格可部署地面召唤“黄金盟誓(Golden_Oath)”;对RSA造成真实伤害。 Golden_Oath = (p-114)*(p-514)*(p+114)*(p+514)*(q-1919)*(q-810)*(q+1919)*(q+810) x = bytes_to_long(pad(gift, random.randint(bytes_to_long(gift).bit_length(), 512))) y = inverse(x, Golden_Oath) return y
,并且,也就是满足,那么我们就可以用连分数逼近的方式
1 2 3 4 5 6 7 8
N = n ^ 4 gift = (All_in_my_name/N).continued_fraction() for i in trange(1,len(gift)): k = gift.numerator(i) x = gift.denominator(i) ifb'end'in (long_to_bytes(x)): Golden_Oath = (x * All_in_my_name -1)//k #print(Golden_Oath)
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 '''
独特的生成方式
1 2 3 4 5 6 7
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
q = x + i,p = 2512 − x − 1∴ p + q = 2512 + i − 1∴ phi = p ⋅ q − p − q + 2∴ phi = n − 2512 − i + 2
因此即可求得逆元
1 2 3 4 5 6 7 8 9 10
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 * # 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]
p = 64408890408990977312449920805352688472706861581336743385477748208693864804529 a = 111430905433526442875199303277188510507615671079377406541731212384727808735043 b = 89198454229925288228295769729512965517404638795380570071386449796440992672131 k = 86388708736702446338970388622357740462258632504448854088010402300997950626097 E = EllipticCurve(GF(p),[a,b])
s = 5461514893126669960233658468203682813465911805334274462134892270260355037191167357098405392972668890146716863374229152116784218921275571185229135409696720018765930919309887205786492284716906060670649040459662723215737124829497658722113929054827469554157634284671989682162929417551313954916635460603628116503 e = 65537 n = 139458221347981983099030378716991183653410063401398496859351212711302933950230621243347114295539950275542983665063430931475751013491128583801570410029527087462464558398730501041018349125941967135719526654701663270142483830687281477000567117071676521061576952568958398421029292366101543468414270793284704549051
from Crypto.Util.number import * from gmpy2 import * import hashlib
R = PolynomialRing(Zmod(n), 'x, y')#模N下关于x,y的二元多项式环 x,y = R.gens() #返回对应的x和y f1 = x**3 - c1 f2 = y**3 - c2 f3 = (x + y + bytes_to_long(gift))**3 - c3
gcd = Ideal(f1,f2,f3)#定义一个理想基 for i in gcd.groebner_basis():#调用groebner——basis()计算grobner基 if i.degree() == 1:#寻找一次多项式 if i.coefficients()[0] == 1:#获取首一多项式 flag = -i.coefficients()[1]#取反(输出一下测试即可 else: flag = -i.coefficients()[0] print(long_to_bytes(int(flag))) #flag{W1Sh_you_Bec0me_an_ #excelL3nt_crypt0G2@pher}