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
| from Crypto.Util.number import * from tqdm import * from gmpy2 import *
x = [147649922240733214931938382533299162852239348315322202024816012220190164990577812905694252095760624439151794000123677274895623809190076928245613944439873573607452325298515467162143645462260131175628858455059408827679537866, 147644772650912060216213753348015513337396934565568307574474899641595228671372662635514128646171206026764270327456729799219586211940162384548230502304807283182736386643239100082734250340169696323090999431454785416052449822, 149269411636750703984577479205935816470190760232375388500570098501093159023749275406514479882987042162341103784724354021794002113424056019424236318901646922511135094047290597218316029950824101156465015382592106764226689366, 196150287310738275233976490100915145314242181250918121143881580393441675718040839096578059550733453877149829142446637258193486806259462575641487682725874844491268829888969640104850204930171839770385340396857083270374650086, 176349489748321571272565603934309732142460694086037582675840150899116324432891582015400827333320599715498609930517259021459948220481490102455623631080293179908366540916891458823890009104176809973215536171814869981029570622, 149605686008934472603553678282301090511189963461227603575425242179942083535824047539877995667786104909758015530206013788550584344630984369586721092949558231023248318500741255737481332399584789444750486399094957601650804226, 167090950560844022360160199561741977922499930289466557020320597983114664988151509771708026839823381777607944610693749808422555004194841221065937445184133790727920860624921174387660725583778620218002895521279169556687637458, 172050836264264531258995087363702968248917626047934042630528415155132231140508644029599127244879051539267358002191035421289125204823940752365920253806252280135208982388638638499493964850701542139656158750314341254497187842, 171940203480163609379955377980802940579133331691907105899695838468763589198624951628796073230487728578449404061809128906749299219776549427144505908935772797140694656690672598481007142599063775428416387593447970673282632558, 103219291391536095878880034390346953422786271761523298742391169540330754898330394255571346430660715071684164206474477771947648781967064107154643784549798248272157384762664350763722568774041179922240639096353451631378825726, 117056923364128416359225652777713478574064992861948997533153939432247506685002462469811749968546913699301322755483896459497141460002559118995887988073505736811451551865962302723189596066237079194160774624115297268028146222, 75988171484629553691726063948676260814799772175458832559939830959325834682356888352022448666576264219187808584376882565208027267132917947746488916430085062850228779315594314788358632633193395144020398274344181485674509442] c = [89211588565232244243020044137513332743269967718877480628261718818351757152813010119069284596895225619225592906209397263094049572230279934266154, 105084158613940886109463172309553111555022087987329070889082019479640792410344881505566965101618478019481030407710176448598323171652419554631833, 106157114923928357578300476119375630224120567854699215551331601909290668630663627567930632807187355693727678752488106832973553103202592938942770, 80557564606220145949033391807467833274034216235778526123196512291405199108579104993671137966232164373337992822860664213094236154838829017972325, 39446948431345684527354210960423038896776791694000880147447072994325975700250899240792675465525991887150481970007736257124244137651624443394152, 119520811258897734242352491410708211023486196867717958794495866712623086226488074898297344260921581145340120126196702495352001228111155023751961, 1342770054334431658111079092718547092324646823520496933189758128906340841380811640267019361812318970025491217723403645803306128707939373166022, 117034748679632935974190191234946643889177466547301929478348628684004040210858236619532197365526820452011678286033898345399811113759206056247927, 142937859112056225912918426292604754870431374511209971957972472983061236076109506454150799842170514956334060919400188570742007461222222639963317, 126864447414128885965807626174194404848334608319577370194369994669518133538013998460358715002795480252978924576799926533593892178036375932388876, 22493364980376274642444643759903756666977805851594216444500605030927010663223507136840503959343412921823289896945796358190298587692628276796010, 115905066506480181865265402577373138871074064300913852519921798659037386902047909009848923352447322605148929915853806888695212542107641045508495]
m = 2 p = 156115360763408463288966087959515407156846780488826750491921450156778549686830192729652167507054847091579757631324431846770595853060183819226167 g = 16112732773996424707 q = (p-1) // 2 fac = [2 , 630764016613 , 636284201767 , 666116332547 , 680344318523 , 684825194551 , 719482804681 , 741454555679 , 761339535743 , 864242985583 , 885840248239 , 925948879099 , 1088296917251] fac = fac[1:]
def my_bsgs(g, Gi, ci): dic = {} K = powmod(Gi, 2^20, q) Ka = K for a in trange(2^20): dic[int(powmod(g, Ka, p))] = a Ka = Ka * K % q for b in trange(2^20): T = powmod(ci, invert(powmod(Gi, b, q), q), p) if(int(T) in dic.keys()): a = dic[int(T)] return 2^20*(a+1) + b
G = 2 k = [] for i in range(len(fac)): Gi = powmod(G, (q-1)//fac[i], q) k.append(my_bsgs(g, Gi, c[i]))
from Crypto.Util.number import *
G = 2
mt = [] t = [] for i in range(len(fac)): Gi = pow(G, (q-1)//fac[i], q) ki = k[i] ti = (q - 1) // fac[i] ai = x[i] // ti assert isPrime(ai) and len(bin(ai)[2:]) == 300 inv_ai = inverse(ai, q-1) mti = pow(Gi, ki*inv_ai, q) mt.append(mti) t.append(ti)
L = block_matrix(ZZ, [ [1, Matrix(ZZ, t).T] ]) KK = 2^36 L[:,-1:] *= KK L = L.LLL()
for i in L: if(i[-1] // KK == 2): E = i[:-1] m2 = 1 for j in range(len(E)): m2 = m2 * pow(int(mt[j]), E[j], q) % q PR.<x> = PolynomialRing(Zmod(q)) F = x^2 - m2 res = F.roots(multiplicities = False) for m in res: print(long_to_bytes(int(m))) break
|