from Crypto.Util.number import * defre(p0,n): P.<x> = PolynomialRing(Zmod(n)) pb=p0.nbits() nb=n.nbits() f = p0 + x*2^pb f = f.monic() r = f.small_roots(X=2^(nb//2-pb),beta=0.4) if r:#不一定是p0所以需要爆破一下 x0 = r[0] p = gcd(x0*2^pb + p0, n) return ZZ(p) defre_p0(d0,e,n): X=var('X') for k inrange(1,e+1): res=solve_mod([e*d0*X == k*n*X + k*X + X-k*X**2 - k*n],2^d0.nbits()) for x in res: p0=ZZ(x[0]) p=re(p0,n) if p and p!=1: return p e=49 n= 109414997218017430689750411358870671148755060537823638639312822690278731526747343386131161374178565377568510541067027291819153801268584631898655552531100229691697272740485676268557392576883083322538380985686287633325507643109809662875001865516112341416350089749503409352233344213405771505339817806009334467873 d0= 6589907493136215112152812078061957297077302140846480772722502061060417041525745970773308362109848374417314681016788951311262599036142398830169352909596817 c= 52618099026096173424982985915057984673936322178451784029192431909399153643977616885476290932528093004726036699015260255387007582939696987106414732619027888230272826489001101650428442052309028725473145170506018789419664921530741182296203037987680548988272155176048872109505915948350201120031522636544622010733 p=re_p0(d0,e,n) q=n//p d=inverse_mod(e,(p-1)*(q-1)) m=pow(c,d,n) print(long_to_bytes(m))
’‘’ 一般来说e是素数但是我当时应该是写错了题目脚本但是仍然能跑 ‘’‘
已知d高位
题目
1 2 3 4 5 6 7 8 9 10 11 12 13
from secret import m1 deftask1(): e = 149 p = getPrime(512) q = getPrime(512) n = p * q d = inverse(e,(p-1)*(q-1)) return (pow(m1, e, n), d >> 222 << 222, n) c1, leak1, n1 = task1() print(c1, leak1, n1) # (89623543982221289730635223555830551523170205418976759060541832483843039074358160566735322009158596405712449020903311144480669706226166537602750967447480664875090686428406188847601970724994074417752345460791736191511081890913041143570455636020205647345764692062144226011846336769477026234106683791286490222089, 138474880017294332349992670187778287774153347391371789199005713563195654993662610111557185709277805165708109047494971468100563949333712521647405765501704478862377527360106399421209690341743821320754482338590671565510629203215009008479290995785318405211007685664887994061938667418220613430135743123498167435264, 146331610798417415036517077006943013321623040860385791423062775325646472298267580898028515394910588437521335092742913111680737790430660749825981979147191282007208147041227246620008377726207734522466015971515317594545750944838673018946440525615131606652748549901880641896940968837669894325535750125282351577689)
from Crypto.Util.number import * deffull_p(p_high, n,d_high,bits): PR.<x> = PolynomialRing(Zmod(n)) f = x + p_high f = f.monic() roots = f.small_roots(X=2^(bits + 4), beta=0.4) if roots: x0 = roots[0] p = gcd(x0 + p_high, n) return ZZ(p)
defp_high(d_high, e, n,bits): PR.<X> = PolynomialRing(RealField(1000)) for k in tqdm(range(1, e+1)): f=e * d_high * X - (k*n*X + k*X + X-k*X**2 - k*n) results = f.roots() if results: for x in results: p_high = int(x[0]) p = full_p(p_high, n,d_high,bits) if p and p != 1: return p