import random
from Crypto.Util.number import GCD
from Crypto.Hash import SHA3_512
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
def get_one_factor(n, e, d):
m = e * d - 1
t = m
while t % 2 == 0:
t //= 2
for _ in range(10):
a = random.randint(2, n - 2)
v = pow(a, t, n)
if v == 1 or v == n - 1:
continue
v_prev = v
while v != 1:
v_prev = v
v = pow(v, 2, n)
if v == n - 1:
break
if v == 1:
factor = GCD(v_prev - 1, n)
if factor != 1 and factor != n:
return factor
else:
break
return None
def find_all_factors(n, e, d):
factors_found = []
def solve(num):
if num == 1:
return
f = get_one_factor(num, e, d)
if f is None:
factors_found.append(num)
return
solve(f)
solve(num // f)
solve(n)
return factors_found
ns = [729626364576206469704240917876675932841677846807662743683194531189219993605123671836962855605283722577718230552963049472251011326675202612492908848548419883361685662678347011887752523869081347313358470192291106167923273619672010347904232948623232956703976722596246251219832472749781700661621717970912452690860710243752051416797956410009096107757901714990018414837758557784033898837218196380413347278999394220278929595840196278059116531409774355756772349502091527, 1905432596115201099512716986634374621489368222604315919606798930577721863294916275385323430940054377575273762764157350871093106918016952598143825002497857813393515175754983371150373414986745909170502391681896252141058196242286758315439213464335711981585004206505072743627148478873299089587473670712150938286701206231734068594554186483978059254161949801153805752489828395472590106405761648181381945795038085612905557546907903561767813822101495476457137965288880829, 1364349980724204783960363890369037262456777329397270902364257972605993939460160766530889520645888701966401869980072151818996346007664249855901114579605632358191242379651843548926065735575249122023543206153088606751338328933651430885645444839242513718915066302971957689904414300766000572990594260836480347717506097403302570129593533017205416936506156113683938133811098995666977893386015199252455279325252257306124895958614122639652100229863446635612470942945471629, 801368910415539931617837996119032301790585643652894417707002521182569449104238101253556548156062846942011258499343192564944616333555000780965111384091131074358231330717413121484815002612991437436336271715078003900216545055505405363415778086330672269759661284535787363323398929120499505051378299467980018690275341014026390376705451595348674549031968858607633947674244014656615045639930798213161815130251215148286379903187335369475976106390101774566278602818405563, 966507016385573035667733231340091844033410158675175976938028218854439065352997895173668326599042719776214706325758565722305289931861889759808022284179479582700755314576250841330755684569639628012527976286442288571350327307582007959428925460653350857512795573323486273071975979456828134582982048746188934676698845075430701350305713747666370252912970653968385390246217234899448990236850880873105998296512557366752267827688836849041157572772272378435636367162425013]
es = [271264973728317298627822473902975461834475616151421882685140849409171660245987005602120200976835072966082573357282000859946014645129524701781302678299643424924092704444611429422064341444927220441684375194952864825982915148126084102832224731498348832396834993134927447743362540828447462072582023959357845229307404791804881057335208287771899121154533179273274029972648764343120454360366227609296867085751393693129946684282269737380796082741762647814800935844443493, 1003585299728442138241618739786172474341836074346983356412903232651178484164007865852681323340512406956827176253325249434459143223478630158795320316445722303141000749369087588146876087005139101967705654538148200848735795226715484701026716263131990473014248826031226350016169675911701420383849573743077161936130739955632072650333006768068396767746102320645544271946493533626477749495460960365939362830334782483616521427745117179433129272929291131199903349977861093, 528794486797786998573050589647661205854628331390578568482905276781799068613879068393786314280307765489986817827366340249545226369795434498075653554440390174127680889163962386407937584138342055553885382937486807537913781141805602397908008361192107987266566035872632130183102501118938531330140154852996630732644530954025739132771439783366022539476194754352734861357158197716623228211860189868592877935421689151152269864018399507621324672725433395533000425391708101, 63082374875671578481986217433413118060930080658278695174993640397998104913203950822096713822227514918774669078130439943184022889683633824002111416144422250644695809731240622289790840695469043596475009958463780096705571401137513331089894183226911665633164170027318352120002851940432163291498705806239158684141492080194438572549164494596965748695244152843943149994989589419519395650481254722496058552304954140980743159877918387972030837603120258130045817858729621, 120373323462979513980656435521004077312964483601298713849302793507801996545855844801219890178210569842943901523332883574699699439655256681068585396438543716728771762620808023696864023456625376138578749985774885652016790204471223404504866831356254849552890279653807176865165230965065842479979722094076544915080001416276324550993965426099480075249719779502220020343237480355441663501565965298776708377675024327374331823503627493136287447543537154779812201209689733]
ct = b'J\x08\x0c\xfe\x0eC\n\x96!\xb3\x05\xa9\x9b\xf9\n\xe3-\xf2m\xdb&.\xb5h\xe1\x0e\xd6\x89\x14\x87Z\x0b0p\xbb\xd9\x93\xd7\x1cT\xa2\xf36\x02\x8e:\\\x92'
total_sum_of_primes = 0
all_ps_tuples = []
if not ns or ns[0] == ...:
print("错误:请在脚本中填入 ns, es, ct 和 d 的实际值。")
else:
# 遍历每一对 (n, e)
for i in range(len(ns)):
n = ns[i]
e = es[i]
print(f"正在分解 n{i}: {n} ...")
factors = find_all_factors(n, e, d)
# 你的代码显示 n = p*q*r
if len(set(factors)) == 3: # 使用 set 来处理分解出相同因子的情况
p, q, r = factors
print(f"找到因子: {p}, {q}, {r}")
all_ps_tuples.append((p, q, r))
total_sum_of_primes += (p + q + r)
print(f"所有素因子的总和: {total_sum_of_primes}")
key = SHA3_512.new(str(total_sum_of_primes).encode()).digest()[:16]
print(f"计算得到的 AES 密钥 (hex): {key.hex()}")
cipher = AES.new(key, AES.MODE_ECB)
flag_padded = cipher.decrypt(ct)
flag = unpad(flag_padded, 16)
print("\n===================================")
print(f"解密成功! Flag: {flag.decode()}")
print("===================================")
#flag{9b31dd3e-aa6a-4c4d-b796-bff4e4dfe0cc}
版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://www.palpitate.site/wiki/subject/article/CRYPTO/
许可协议:署名-非商业性使用 4.0 国际许可协议