# sage from Crypto.Util.number import * from gmpy2 import invert, iroot
n = 13390709926509813526471364597371124446888078365567927211781799241724742352679484983709219580483800891886832613684875066109177882219522305348565532970795023 v = (5404548088049249951619519701935576492239293254135836357417714329205323074367876875480850741613547220698045360461761929952847796420174204143917852624050110, 2110372753170830610718226848526649992911771424441223687775304654852191999130502986109306355582366065947895295520226816523397652918227241733632791793362785) a = 1762039418842677123086894939949574689744108610561557889235294034870342076452734215004689409493802437034960516295735815195656138656970901855976802991519141 D = (a*a)%n e = 65537
p = 115718235064789220654263009993128325569382592506655305434488398268608329541037 q = 115718235064789220654263009993128324769382192706654302434478391267607309966379 assert p*q==n
deffastPow(M, x, n): if x==0: return identity_matrix(len(M.columns())) res = fastPow(M, x//2, n) if x%2 == 1: return res*res*M % n else: return res*res % n
phi = (p-1)*(q-1) d = e.inverse_mod(phi)
M = matrix([[v[0], v[1]], [v[1]*D, v[0]]]) #m = M^d%n m = fastPow(M, d, n) Y = m[0][1] print('Y = %s' % Y)
# original n = 84236796025318186855187782611491334781897277899439717384242559751095347166978304126358295609924321812851255222430530001043539925782811895605398187299748256080526691975084042025794113521587064616352833904856626744098904922117855866813505228134381046907659080078950018430266048447119221001098505107823645953039 gamma = 0.48
# gamma == 0.49 n = 25876225522890846556694449833494254540262333611158337123604777179863694236498355670851480908852313896681043771428258385755840617295126898560098248525302865459336697905788090823970968293147657498562477274750658646012858288861287729533422138185695389851242485849321943069495999658596606801403724051868563060097 gamma = 0.49
lbound = 2**(int(1024*(0.5-gamma))-1) ubound = 2**int(1024*(0.5-gamma)) print(lbound, ubound) for a inrange(lbound, ubound): print(a) for b inrange(lbound, ubound): g = int(iroot((n-1)//(4*a*b), 2)[0]) p = 2*g*a+1 q = 2*g*b+1 if p*q==n: print('p = %s' % p) print('q = %s' % q) exit(0)
/* g = 4935307733735729994278290975792000228775286930114042366725719878267551012927493448259270817917227756849322072959458794406806580920723349325531114469 a = 854851 b = 1011400 p = 8437905502983445042677582637893534375137565614989838462475696727313788501904161403475771835934720130340799646782932619714906025013322551788559197469878239 q = 9983140483800634632426126985832058062766650402234684899412786169759602188949733747138853010482968306554808689182393249326088351886439191015684338347893201 */
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
from gmpy2 import invert, lcm import libnum
n = 84236796025318186855187782611491334781897277899439717384242559751095347166978304126358295609924321812851255222430530001043539925782811895605398187299748256080526691975084042025794113521587064616352833904856626744098904922117855866813505228134381046907659080078950018430266048447119221001098505107823645953039 e = 58337 c = 13646200911032594651110040891135783560995665642049282201695300382255436792102048169200570930229947213493204600006876822744757042959653203573780257603577712302687497959686258542388622714078571068849217323703865310256200818493894194213812410547780002879351619924848073893321472704218227047519748394961963394668
p = 8437905502983445042677582637893534375137565614989838462475696727313788501904161403475771835934720130340799646782932619714906025013322551788559197469878239 q = 9983140483800634632426126985832058062766650402234684899412786169759602188949733747138853010482968306554808689182393249326088351886439191015684338347893201 assert p*q == n
phi = lcm(p-1, q-1) d = invert(e, phi) m = int(pow(c, d, n)) print(libnum.n2s(m)) # SangFor{0a8c2220-4c1b-32c8-e8c1-adf92ec7678b}