from hashlib import sha512 , md5, sha1 from ecdsa import SigningKey, VerifyingKey, NIST521p from Crypto.Util.number import long_to_bytes import binascii
# 解析16进制的签名 拆分为前后 defparse(sig_hex): sig = binascii.unhexlify(sig_hex) r = int.from_bytes(sig[:66], "big") s = int.from_bytes(sig[66:], "big") return r, s
deffib(n): if n == 0: return0, 1 a, b = fib(n>>1) c = (a*((b*2 - a)%mod)) %mod d = (a*a+b*b)%mod if n&1: return d, (c+d)%mod return c, d
state = 1 out = [] for i inrange(32): fn = fib(state)[0] out.append(charset[fn]) if i in (7, 12, 17, 22): out.append("-") state = (state*8 + 64 + i)&mask64 # c中64位int溢出处理 print("flag{" + "".join(out) + "}") # flag{10632674-1d219-09f29-14769-f60219a24}
from Crypto.Util.number import * import random n1 = 16141229822582999941795528434053604024130834376743380417543848154510567941426284503974843508505293632858944676904777719167211264225017879544879766461905421764911145115313698529148118556481569662427943129906246669392285465962009760415398277861235401144473728421924300182818519451863668543279964773812681294700932779276119980976088388578080667457572761731749115242478798767995746571783659904107470270861418250270529189065684265364754871076595202944616294213418165898411332609375456093386942710433731450591144173543437880652898520275020008888364820928962186107055633582315448537508963579549702813766809204496344017389879 n = 484831124108275939341366810506193994531550055695853253298115538101629337644848848341479419438032232339003236906071864005366050185096955712484824249228197577223248353640366078747360090084446361275032026781246854700074896711976487694783856878403247312312487197243272330518861346981470353394149785086635163868023866817552387681890963052199983782800993485245670437818180617561464964987316161927118605512017355921555464359512280368738197370963036482455976503266489446554327046948670215814974461717020804892983665655107351050779151227099827044949961517305345415735355361979690945791766389892262659146088374064423340675969505766640604405056526597458482705651442368165084488267428304515239897907407899916127394598273176618290300112450670040922567688605072749116061905175316975711341960774150260004939250949738836358264952590189482518415728072191137713935386026127881564386427069721229262845412925923228235712893710368875996153516581760868562584742909664286792076869106489090142359608727406720798822550560161176676501888507397207863998129261472631954482761264406483807145805232317147769145985955267206369675711834485845321043623959730914679051434102698588945009836642922614296598336035078421463808774940679339890140690147375340294139027290793 e = 65537 c = 657984921229942454933933403447729006306657607710326864301226455143743298424203173231485254106370042482797921667656700155904329772383820736458855765136793243316671212869426397954684784861721375098512569633961083815312918123032774700110069081262242921985864796328969423527821139281310369981972743866271594590344539579191695406770264993187783060116166611986577690957583312376226071223036478908520539670631359415937784254986105845218988574365136837803183282535335170744088822352494742132919629693849729766426397683869482842748401000853783134170305075124230522253670782186531697976487673160305610021244587265868919495629
# 求0 ~ 1<<20所有素数 defsieve_prime(limit): limit = int(limit) sieve = bytearray(b"\x01") * (limit + 1) sieve[0:2] = b"\x00\x00" for i inrange(2, int(limit**0.5) + 1): if sieve[i]: step = i start = i * i sieve[start:limit + 1:step] = b"\x00" * (((limit - start) // step) + 1) return [p for p inrange(2, limit + 1) if sieve[p]]
# 求phi的倍数 deffind_phi(mod, k_odd, two_pow): for _ inrange(80): a = random.randrange(2, mod - 1) g = GCD(a, mod) if1 < g < mod: return g x = pow(a, k_odd, mod) if x == 1or x == mod - 1: continue for _ inrange(two_pow): y = pow(x, 2, mod) if y == 1: g = GCD(x-1, mod) if1 < g < mod: return g break if y == mod - 1: break x = y returnNone
# 分解n deffactor_n(mod, n1, bits): limit = 1 << bits primes = sieve_prime(limit) l_odd = 1 for p in primes: if p != 2: l_odd *= p
k_odd = n1 * l_odd two_pow = 4 factors = [] stack = [mod] while stack: m = stack.pop() if m == 1: continue for p in (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37): if m % p == 0: factors.append(p) stack.append(m//p) break else: if isPrime(m): factors.append(m) continue f = find_phi(m, k_odd, two_pow) if f isNone: break stack.append(f) stack.append(m//f) returnsorted(factors)
outer = factor_n(n, n1, 20)
inner = [GCD(p-1, n1) for p in outer]
phi = 1 for p in inner: phi *= p-1
d = pow(e, -1, phi) print(long_to_bytes(pow(c,d,n1))) # flag{fak3_r5a_0f_euler_ph1_of_RSA_040a2d35}