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 国际许可协议