import random from sympy import nextprime defpart1(): p = random_prime(2^512, 2^513) a = random.randint(0, p-1) b = random.randint(0, p-1) while (4 * a**3 + 27 * b**2) % p == 0: a = random.randint(0, p-1) b = random.randint(0, p-1)
E = EllipticCurve(GF(p), [a, b])
P=E.random_point()
n = [random.randint(1, 2**20) for _ inrange(3)] assert part1=''.join([hex(i)[2:] for i in n]) cipher = [n[i] * P for i inrange(3)]
print(f"N = {p}") print(f"a = {a}, b = {b}") print(f"P = {P}") for i inrange(3): print(f"cipher{i} = {cipher[i]}") defpart2(): p = 839252355769732556552066312852886325703283133710701931092148932185749211043 a = 166868889451291853349533652847942310373752202024350091562181659031084638450 b = 168504858955716283284333002385667234985259576554000582655928538041193311381 P = E.random_point() Q = key*P print("p = ",p) print("a = ",a) print("b = ",b) print("P = ",P) print("Q = ",Q) assert part2=key part1() print("-------------------------------------------") part2() assert flag="flag{"+str(part1)+"-"+str(part2)+"}"
output
1 2 3 4 5 6 7 8 9 10 11 12 13
N = 8186762541745429544201163537921168767557829030115874801599552603320381728161132002130533050721684554609459754424458805702284922582219134865036743485620797 a = 1495420997701481377470828570661032998514190598989197201754979317255564287604311958150666812378959018880028977121896929545639701195491870774156958755735447, b = 5991466901412408757938889677965118882508317970919705053385317474407117921506012065861844241307270755999163280442524251782766457119443496954015171881396147 P = (6053058761132539206566092359337778642106843252217768817197593657660613775577674830119685211727923302909194735842939382758409841779476679807381619373546323 : 7059796954840479182074296506322819844555365317950589431690683736872390418673951275875742138479119268529134101923865062199776716582160225918885119415223226 : 1) cipher0 = (4408587937721811766304285221308758024881057826193901720202053016482471785595442728924925855745045433966244594468163087104593409425316538804577603801023861 : 5036207336371623412617556622231677184152618465739959524167001889273208946091746905245078901669335908442289383798546066844566618503786766455892065155724816 : 1) cipher1 = (2656427748146837510897512086140712942840881743356863380855689945832188909581954790770797146584513962618190767634822273749569907212145053676352384889228875 : 4010263650619965046904980178893999473955022015118149348183137418914551275841596653682626506158128955577872592363930977349664669161585732323838763793957500 : 1) cipher2 = (1836350123050832793309451054411760401335561429787905037706697802971381859410503854213212757333551949694177845513529651742217132039482986693213175074097638 : 1647556471109115097539227566131273446643532340029032358996281388864842086424490493200350147689138143951529796293632149050896423880108194903604646084656434 : 1)
------------------------------------------- p = 839252355769732556552066312852886325703283133710701931092148932185749211043 a = 166868889451291853349533652847942310373752202024350091562181659031084638450 b = 168504858955716283284333002385667234985259576554000582655928538041193311381 P = (547842233959736088159936218561804098153493246314301816190854370687622130932 : 259351987899983557442340376413545600148150183183773375317113786808135411950 : 1) Q = (52509027983019069214323702207915994504051708473855890224511139305828303028 : 520507172059483331872189759719244369795616990414416040196069632909579234481 : 1)
p = 839252355769732556552066312852886325703283133710701931092148932185749211043 a = 166868889451291853349533652847942310373752202024350091562181659031084638450 b = 168504858955716283284333002385667234985259576554000582655928538041193311381 E = EllipticCurve(GF(p),[a,b]) P = E(547842233959736088159936218561804098153493246314301816190854370687622130932, 259351987899983557442340376413545600148150183183773375317113786808135411950, 1) Q = E(52509027983019069214323702207915994504051708473855890224511139305828303028, 520507172059483331872189759719244369795616990414416040196069632909579234481, 1)
defSmartAttack(P,Q,p): E = P.curve() Eqp = EllipticCurve(Qp(p, 2), [ ZZ(t) + randint(0,p)*p for t in E.a_invariants() ])
P_Qps = Eqp.lift_x(ZZ(P.xy()[0]), all=True) for P_Qp in P_Qps: if GF(p)(P_Qp.xy()[1]) == P.xy()[1]: break
Q_Qps = Eqp.lift_x(ZZ(Q.xy()[0]), all=True) for Q_Qp in Q_Qps: if GF(p)(Q_Qp.xy()[1]) == Q.xy()[1]: break
k = SmartAttack(P, Q, p) print(k) # 7895892011 print(k*P==Q)
1 2 3 4 5 6
n = [1008061, 651602, 943532] part1=''.join([hex(i)[2:] for i in n]) part2=7895892011 flag="flag{"+str(part1)+"-"+str(part2)+"}" print(flag) # flag{f61bd9f152e65ac-7895892011}
N = 20163906788220322201451577848491140709934459544530540491496316478863216041602438391240885798072944983762763612154204258364582429930908603435291338810293235475910630277814171079127000082991765275778402968190793371421104016122994314171387648385459262396767639666659583363742368765758097301899441819527512879933947
# low = 1 # high = 2**512 # result = binary_search(N, low, high) # if result != -1: # print(result)
# a = 7876724580534791771835430594434627088013471560469412207736963203935537053220379418645369259714178145931522503674390087394035229717461111762112820042426112 # p = sympy.nextprime(13 * a) # q = sympy.prevprime(25 * a) # print(f"p = {p}") # print(f"q = {q}") # assert N == p * q
defpart_roots(n, c, e, p): # 将e约简到可逆,g为余下的因数 defdiv_e(e, p): g = GCD(e, (p - 1)) while GCD(e, (p - 1)) != 1: e //= GCD(e, (p - 1)) g *= GCD(e, (p - 1)) return e, g # 约简e,便于开根 e, g = div_e(e, p) d = inverse(e, p - 1) M = pow(c, d, p) # 在有限域内开根 R.<x> = Zmod(p)[] f = x ^ g - M return [int(i[0]) for i in f.monic().roots()]
c = 204384474875628990804496315735508023717499220909413449050868658084284187670628949761107184746708810539920536825856744947995442111688188562682921193868294477052992835394998910706435735040133361347697720913541458302074252626700854595868437809272878960638744881154520946183933043843588964174947340240510756356766
p = 102397419546952293033860597727650152144175130286102358700580521651161981691864932442389800376284315897109792547767071136122457986326994452907466660551539601 q = 196918114513369794295885764860865677200336789011735305193424080098388426330509485466134231492854453648288062591859752184850880742936527794052820501060652747 n = p*q e = 0xE18E
res1 = part_roots(n, c, e, p) res2 = part_roots(n, c, e, q)
for i in res1: for j in res2: m = crt([i, j], [p, q]) # print(long_to_bytes(m)) try: print(long_to_bytes(m).decode()) except: pass
defbackpack_encrypt_flag(flag_bytes, M, group_len): bits = [] for byte in flag_bytes: bits.extend([int(b) for b informat(byte, "08b")])
whilelen(bits) % group_len != 0: bits.append(0)
S_list = [] for i inrange(0, len(bits), group_len): group = bits[i:i + group_len] S = sum(bit * m for bit, m inzip(group, M)) S_list.append(S) return S_list
defbackpack(flag_bytes): R = [10] whilelen(R) < 8: next_val = randint(2 * R[-1], 3 * R[-1]) R.append(next_val) B = randint(2 * R[-1] + 1, 3 * R[-1]) A = getPrime(100) M = [A * ri % B for ri in R] S_list = backpack_encrypt_flag(flag_bytes, M, len(M)) return R, A, B, M, S_list
p = getPrime(512) q = getPrime(512) n = p*q e = 0x10000 m = bytes_to_long(flag1) k = randint(1, 999) problem1 = (pow(p,e,n)-pow(q,e,n)) % n problem2 = pow(p-q,e,n)*pow(e,k,n) c = pow(m,e,n)
R, A, B, M, S_list = backpack(flag2)
withopen(r"C:\Users\Rebirth\Desktop\data.txt", "w") as f: f.write(f"problem1 = {problem1}\n") f.write(f"problem2 = {problem2}\n") f.write(f"n = {n}\n") f.write(f"c = {c}\n") f.write("-------------------------\n") f.write(f"R = {R}\n") f.write(f"A = {A}\n") f.write(f"B = {B}\n") f.write(f"M = {M}\n") f.write(f"S_list = {S_list}\n") f.write("-------------------------\n") f.write(f"What you need to submit is Flags!\n")
data.txt
1 2 3 4 5 6 7 8 9 10 11 12 13
problem1 = 24819077530766367166035941051823834496451802693325219476153953490742162231345380863781267094224914358021972805811737102184859249919313532073566493054398702269142565372985584818560322911207851760003915310535736092154713396343146403645986926080307669092998175883480679019195392639696872929250699367519967334248 problem2 = 20047847761237831029338089120460407946040166929398007572321747488189673799484690384806832406317298893135216999267808940360773991216254295946086409441877930687132524014042802810607804699235064733393301861594858928571425025486900981252230771735969897010173299098677357738890813870488373321839371734457780977243838253195895485537023584305192701526016 n = 86262122894918669428795269753754618836562727502569381672630582848166228286806362453183099819771689423205156909662196526762880078792845161061353312693752568577607175166060900619163231849790003982326663277243409696279313372337685740601191870965951317590823292785776887874472943335746122798330609540525922467021 c = 74962027356320017542746842438347279031419999636985213695851878703229715143667648659071242394028952959096683055640906478244974899784491598741415530787571499313545501736858104610426804890565497123850685161829628373760791083545457573498600656412030353579510452843445377415943924958414311373173951242344875240776 ------------------------- R = [10, 29, 83, 227, 506, 1372, 3042, 6163] A = 1253412688290469788410859162653 B = 16036 M = [10294, 12213, 10071, 4359, 1310, 4376, 7622, 14783] S_list = [13523, 32682, 38977, 44663, 43353, 31372, 17899, 17899, 44663, 16589, 40304, 25521, 31372] ------------------------- What you need to submit is Flags!
problem1 = 24819077530766367166035941051823834496451802693325219476153953490742162231345380863781267094224914358021972805811737102184859249919313532073566493054398702269142565372985584818560322911207851760003915310535736092154713396343146403645986926080307669092998175883480679019195392639696872929250699367519967334248 problem2 = 20047847761237831029338089120460407946040166929398007572321747488189673799484690384806832406317298893135216999267808940360773991216254295946086409441877930687132524014042802810607804699235064733393301861594858928571425025486900981252230771735969897010173299098677357738890813870488373321839371734457780977243838253195895485537023584305192701526016 n = 86262122894918669428795269753754618836562727502569381672630582848166228286806362453183099819771689423205156909662196526762880078792845161061353312693752568577607175166060900619163231849790003982326663277243409696279313372337685740601191870965951317590823292785776887874472943335746122798330609540525922467021 c = 74962027356320017542746842438347279031419999636985213695851878703229715143667648659071242394028952959096683055640906478244974899784491598741415530787571499313545501736858104610426804890565497123850685161829628373760791083545457573498600656412030353579510452843445377415943924958414311373173951242344875240776
e = 0x10000
for k inrange(1000): try: x = inverse(pow(e, k, n), n) except: continue p = GCD((problem1 + problem2 * x) % n, n) # print(p) if p == 1: continue q = n // p print(f"p = {p}") print(f"q = {q}") break
p = 9586253455468582613875015189854230646329578628731744411408644831684238720919107792959420247980417763684885397749546095133107188260274536708721056484419031 q = 8998523072192453101232205847855618180700579235012899613083663121402246420191771909612939404791268078655630846054784775118256720627970477420936836352759291 # CRYPTO_ALGORIT
defquick_rooting(n: int, r: int, p: int, all: bool = False): """ 在特定条件下,快速求解有限域下的n次方根 参数: delta (int): 待开根数 r (int): 开根的次数,要满足r能整除q q (int): 模数,为质数 all (int): 是否返回所有解,默认为False,返回一个根。 """ ifpow(n, (p - 1) // gcd(p - 1, r), p) != 1: raise Exception(f"{n}不是{r}次剩余") if (p + r - 1) % (r ** 2) != 0: raise Exception("快速开根需要满足r^2整除p+r-1") root = pow(n, (p+r-1)//(r**2), p) ifnotall: return root roots = [int(root)] whilelen(roots) < r: a = randint(2, p - 1) res = pow(a, (p - 1) // r, p) * root % p if res notin roots: roots.append(int(res)) return roots
defrooting(c, e, p): # 将e约简到可逆,e_为余下的因数。 e_ = 1 while GCD(e, (p - 1)) != 1: e_ *= GCD(e, (p - 1)) e //= GCD(e, (p - 1)) d = inverse(e, p-1) c = pow(c, d, p) # 分解e_,简化计算 expanded_factors = [] for prime, exponent in factor(e_): expanded_factors.extend([prime] * exponent) cs = [c] ms = [] for r in expanded_factors: ms = [] for c in cs: # 检查c是否为r次剩余 ifpow(c, (p - 1) // gcd(p - 1, r), p) == 1: if (p+r-1)%(r**2) == 0: ms += quick_rooting(c, r, p, True) else: ms += AMM(c, r, p, True) cs = ms returnsorted(ms)
p = 9586253455468582613875015189854230646329578628731744411408644831684238720919107792959420247980417763684885397749546095133107188260274536708721056484419031 q = 8998523072192453101232205847855618180700579235012899613083663121402246420191771909612939404791268078655630846054784775118256720627970477420936836352759291 n = 86262122894918669428795269753754618836562727502569381672630582848166228286806362453183099819771689423205156909662196526762880078792845161061353312693752568577607175166060900619163231849790003982326663277243409696279313372337685740601191870965951317590823292785776887874472943335746122798330609540525922467021 c = 74962027356320017542746842438347279031419999636985213695851878703229715143667648659071242394028952959096683055640906478244974899784491598741415530787571499313545501736858104610426804890565497123850685161829628373760791083545457573498600656412030353579510452843445377415943924958414311373173951242344875240776 e = 0x10000
res1 = rooting(c, e, p) res2 = rooting(c, e, q) for i in res1: for j in res2: m = crt([i, j], [p, q]) try: print(long_to_bytes(m).decode()) except: pass # CRYPTO_ALGORIT
defdecrypt(c): byte = 0 bit_array = [] for r inreversed(R): if c >= r: bit_array.append(1) c -= r else: bit_array.append(0) bit_array = bit_array[::-1] num = int("".join(str(bit) for bit in bit_array), 2)
returnbytes([num])
A_ = inverse(A, B) m = b"" for s in S_list: m += decrypt((A_ * s) % B)
p = 1461501637330902918203684832716283019655932542983 A=Matrix(GF(p),A) part3=randint(1,p-1) enc=A ^ part3 print(enc) print('-------')
All = part1 + part2 + part3 key = md5(str(All).encode()).hexdigest()[:16] cipher = AES.new(key.encode(),AES.MODE_ECB) CiperText = cipher.encrypt(pad(message,16)) print("CiperText =",CiperText) print('What you need to submit is flag!')
message = b'xxxxxx' flag = 'flag{' + sha256(message).hexdigest()[32:][::-1] + '}'
All = part1 + part2 + part3 key = md5(str(All).encode()).hexdigest()[:16] cipher = AES.new(key.encode(),AES.MODE_ECB) CiperText = cipher.encrypt(pad(message,16)) print("CiperText =",CiperText) print('What you need to submit is flag!') ''' CiperText = b"~\x8f\x8b>u\x94\x89F\x93\xf1x\x97\x8cp\x02\xfc\x99C\xc6\x0e\xf1L\xff#GM'^1\xca\xa3\x1a" What you need to submit is flag! '''
defbrute_dlp(gi, ci, n, lim): bi = gi for i inrange(1, lim+1): if bi == ci: return i bi = (bi * gi) % n print("[-] NOT in the range") print("[-] Something's Wrong, you gotta check the range", lim)
defpohlig_hellman(g, c, s, n, factors): res = [] modulus = [] for q in factors: assertpow(g, s//q, n) != 1 gi = pow(g, s//q, n) ci = pow(c, s//q, n) dlogi = brute_dlp(gi, ci, n, q) print("[+] dlog modulo {0} == {1}".format(q, dlogi)) res.append(dlogi) modulus.append(q) print("\n[*] res = ", res) print("[*] modulus = ", modulus) dlog = CRT(res, modulus) print("\n[+] dlog modulo {0} == {1}".format(prod(modulus), dlog)) return dlog
qe = [1249, 2281, 3121, 7489, 7937, 8009, 57809] x = pohlig_hellman(g, c, s, n, qe) print(x) print(pow(g, x, n) == c)
from gmpy2 import * from hashlib import md5 from Crypto.Util.number import * from sympy import *
message= xxxxxx flag = 'flag{'+md5(message).hexdigest()+'}' p = getPrime(250) q = getPrime(250) assert p > q n = p * q e = 65537 phi = (p - 1) * (q - 1) m = bytes_to_long(message)
Rod = getPrime(5) I = Rod + len(str(Rod)) k = pow(p, Rod) N = pow(p, I) * q d1 = getPrime(2000) d2 = nextprime(d1 + getPrime(1000)) e_1 = inverse(d1, (k * phi)) e_2 = inverse(d2, (k * phi)) c = pow(m,e,n)
x = ... factor(gcd(e1*e2*x-(e1-e2), N)) p = 1236684400644913665223349603970861082164187774906247864790683861970484371887 q = N // pow(p, 21) assert N == pow(p, 21) * q e = 65537 d = inverse(e, (p-1)*(q-1)) n = p*q m = pow(c, d, n) print(m)
message= long_to_bytes(int(m)) print(message) from hashlib import md5 flag = 'flag{'+md5(message).hexdigest()+'}' print(flag)