1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| from Crypto.Util.number import * from gmpy2 import iroot from tqdm import tqdm import itertools from sympy.ntheory import factorint
def u(d): if d == 1: return 1 factors = factorint(d) primes = list(factors.keys()) index = list(factors.values()) for i in index: if i >= 2: return 0 return pow(-1, len(primes) % 2)
def f(d): factors = factorint(d) primes = list(factors.keys()) index = list(factors.values()) base = 1 for i in range(len(primes)): base *= pow(primes[i], index[i]-1) base *= (primes[i] - 1) return base
def combine_check(primes): base = 1 for i in range(len(primes)): base *= (1-f(primes[i])) return base
def rational_to_quotients(x, y): a = x // y quotients = [a] while a * y != x: x, y = y, x - a * y a = x // y quotients.append(a) return quotients
def convergents_from_quotients(quotients): convergents = [(quotients[0], 1)] for i in range(2, len(quotients) + 1): quotients_partion = quotients[0:i] denom = quotients_partion[-1] num = 1 for _ in range(-2, -len(quotients_partion), -1): num, denom = denom, quotients_partion[_] * denom + num num += denom * quotients_partion[0] convergents.append((num, denom)) return convergents
def Blomer_May_attack(e, n): quotients = rational_to_quotients(e, n) convergents = convergents_from_quotients(quotients) for (_x, _y) in convergents: if _x != 0: T = n + 1 - (e * _y) // _x if T ** 2 - 4 * n > 0: tmp_p = (T + int(iroot(T ** 2 - 4 * n, 2)[0])) // 2 for i in range(-2**5, 2**5): _p = tmp_p + i if n > _p > 1 and n % _p == 0: print('Got solution!') _q = n//_p return _p, _q
print('No solution') return None
def all_ascii(s): for i in s: if i in range(0x20, 0x7f): continue else: return False return True
primes = [6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503118559, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503126443, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503193349, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503562289, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503734189, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503760301, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503782813, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503951191, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824504074953, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824504107911, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824504191461, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824504448729, 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824504539989] c = 84010209207136400037674900630630399007540527378939350615722225527845587559010102178617103738600464258190430641037546648203366413208680794400023737381999928100638870193135477985407368386033167118399673001236960699550393986712868487827560601610546135335952667201927052409197291462799539018091792246183307678928298241645258411316936304167124933556606198943248215284393941957893610109127025761289673484220381931928088574316265497075872825588843686573267223321714224535003053507039588501110165036609252972283465620670619170664971316238808580562960566239652372002792893860381585262550998380705474210656337505369024906108022045918104803080765059727578165530772500933465284347893453376016683018177839155666453880461050298815103588796089076127048997409337740340488597725920421812209214132626919132717242722587461710190518049279845280531076833361229586237230905386909567570882397978261647980071794688572393137428928552335623610968045342130104152766075095859252589558838654095036476181115093298573203118822557283958028992348972004110923680696213759378910314691270631431638964147123334674 index = [17, 4, 10, 5, 22, 23, 3] _e = 372077403420031165815439199213704344304928202869941592969972103002464355333911024937074871410825817568355544126574173758702600945390438495248751733573391345292294888885607465578329781858741122278411513362633310583564023669185613282939355138576537165757775740881908805743008022348524049466231348651228609449357106436669219 _n = 470335762637936005588762180827192207993663594416060284974932410896705386687847439702920143090437462997342000428130417147164245577372958674672171462397851600930104979198327224831772288314005311036009419876584852939180439595289349509330868790367408195151323961061772542485151690708678904080061050887466315542337191307236199 _c = 333271281173306446630548720678701979402616631681988817880871964537046235416970583988475783551455814258102380169630603934095599959443467742430556704688855518165068592402751863811686579302153371106333344752494076921552527417915731880831363624299780159503812111855009880750695443491602523883753510968162389168190126033304497
_p, _q = Blomer_May_attack(_e, _n) _phi = (_p-1) * (_q-1) _d = inverse(_e, _phi) e = pow(_c, _d, _n)
tmp = list(itertools.combinations(primes, 7)) for l in tqdm(tmp): phi = 1 for j in l: phi *= j-3 n = -combine_check(l) d = inverse(e, phi) flag = long_to_bytes(pow(c, d, n)) if all_ascii(flag): print(flag) break
|