a = 1185431345934512 b = 1989628969125971 N = 54692260436051338814890781701826055707958209029414126894070449935683071253184867947357262267840171428710181955973010913204514025135188192484651672240708141692701667242130748316666406528479191422804307020656050201187035928715833163999813216597718706449260040885862566373392398826670863398295350419792842640631 P.<g> = ZZ[] f = 4 * a * b * g ^ 2 + 2 * (a + b) * g - N + 1 g = f.roots() if g: g = g[0][0] p = 2 * g * a + 1 q = 2 * g * b + 1 assert p * q == N
g = 2056971706333850947354991471886113601423457483931388832864204860321308350537317091564919029078296379733989138742162694786565228112885684303 N = 67324909911911622626246005558967775211455024820506932698435813321567574468019013664789401988015894964099052816176029553245881317276340043887466584645914352982274378611180595397686920214079479901514703963131435008906250160656759300390805929849374653321934393399433471228218819498373221757779799476717494079667 M = (N - 1) // (2 * g) c = M % g P.<a> = ZZ[] f = 2 * g * a ^ 2 - 2 * g * c * a + M - c a = f.roots() if a: a, b = a[0][0], a[1][0] p = 2 * g * a + 1 q = 2 * g * b + 1 assert p * q == N
②如果$g=a+b$,将方程$N=2g(2gab+a+b)+1$变换,得到:
替换$g=a+b$,同样得到二次方程:
可以求解$a,b$。
1 2 3 4 5 6 7 8 9 10 11
g = 2855372645569408464444580237486670388029956719716115953907612135874419892154982850222965560661211729647325085879529571229774148545656169021 N = 159549169988238873893531105042878385551537587717347282632324748268846735710748763722602882823022008548774298858161130258369850715542192739582830583643642436399008902770027668038725347353393047833875066622910131525247842517372845617227325882916166114361718015983671803859502931814932543107911548450229250776542101141849788751722460468073974316977656001286989710480324512919121409123619799426221232443036698458643438020098037548757403 M = (N - 1) // (2 * g) P.<a> = ZZ[] f = 2 * a ^ 2 - 2 * g * a + (N - 1) // (2 * g ^ 2) - 1 a = f.roots() if a: a, b = a[0][0], a[1][0] p = 2 * g * a + 1 q = 2 * g * b + 1 assert p * q == N
n = 151913753330829779363367789673597253978048533620182497747132604072824540323836504426239804081241567027736270622449855295828160124814438423488754623643933533204599629980943193643551097211543531050709295786991507076525522113596966181359611779370941657496310723772521162794885147507996772774824707716432570452403 c = 81337035006499494768796081417947319039576994033747417935302379695580101083380316241731843797604372408639889020709527188720865744673275465620672796534287478878369491626837235522013863942055110385349674739290041899890532139474221925394370465243005480529009377659505930236007519685951328899152586367092905739547 e = 65537
for k inrange(e,1,-1): tmp=1+4*e*n*k r,s=gmpy2.iroot(tmp,2) if s: print(k) p=(r-1)//(2*k) break q=n//p phi=(p-1)*(q-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) print(long_to_bytes(int(m)))
p = sympy.symbols('p') q = sympy.symbols('q') f1 = p1 * p + q1 * q - 1 +p * q f2 = (p - 1) * (q - 1) - phi pq = sympy.solve([f1, f2], [p, q]) p = (pq[1][0]) q = (pq[1][1]) n = p * q d = gmpy2.invert(e, phi) m = pow(c, int(d), int(n)) print(libnum.n2s(int(m)))
$c\equiv m\pmod p$类型
从小鸡块大佬那里发现的几个题,简单复现一下。
这里同余的前提是$m>>p$,所以无法爆破求解。
easy_mod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from Crypto.Util.number import * from random import *
table = "01234567" p = getPrime(328) flag = b"NSSCTF{" + "".join([choice(table) for i inrange(70)]).encode() + b"}" c = bytes_to_long(flag) % p
print("p =",p) print("c =",c)
''' p = 501785758961383005891491265699612686883993041794260611346802080899615437298977076093878384543577171 c = 327005346153237517234971706274055111857447948791422192829214537757745905845319188257204611848165263 '''
p = 501785758961383005891491265699612686883993041794260611346802080899615437298977076093878384543577171 c = 327005346153237517234971706274055111857447948791422192829214537757745905845319188257204611848165263 prefix = b"NSSCTF{" suffix = b"}" length = 78 - len(prefix) - len(suffix)
c -= 256^(len(suffix) + length) * bytes_to_long(prefix) c -= bytes_to_long(suffix) c = c * inverse(256,p) % p
L = Matrix(ZZ,length+2,length+2) for i inrange(length): L[i,i] = 1 L[i,-1] = 256^i c -= 256^i*48
L[-2,-2] = 4 L[-2,-1] = -c L[-1,-1] = p L[:,-1:] *= p res = L.BKZ() flag = "" for i in res[:-1]: if(abs(i[-2]) == 4andall(abs(j) < 8for j in i[:-2])): for j in i[:-2][::-1]: flag += chr(48 + abs(j)) print(flag)