from Crypto.Util.number import * import gmpy2 from secret import flag
p = getPrime(512) q = getPrime(512) n = p**4*q
e = 65537 phi = gmpy2.lcm(p - 1, q - 1) d = gmpy2.invert(e, phi) dp = d % (p - 1) m = bytes_to_long(flag) c = pow(m, e, n) print ("dp = " + str(dp)) print ("c = " + str(c))
y = 449703347709287328982446812318870158230369688625894307953604074502413258045265502496365998383562119915565080518077360839705004058211784369656486678307007348691991136610142919372779782779111507129101110674559235388392082113417306002050124215904803026894400155194275424834577942500150410440057660679460918645357376095613079720172148302097893734034788458122333816759162605888879531594217661921547293164281934920669935417080156833072528358511807757748554348615957977663784762124746554638152693469580761002437793837094101338408017407251986116589240523625340964025531357446706263871843489143068620501020284421781243879675292060268876353250854369189182926055204229002568224846436918153245720514450234433170717311083868591477186061896282790880850797471658321324127334704438430354844770131980049668516350774939625369909869906362174015628078258039638111064842324979997867746404806457329528690722757322373158670827203350590809390932986616805533168714686834174965211242863201076482127152571774960580915318022303418111346406295217571564155573765371519749325922145875128395909112254242027512400564855444101325427710643212690768272048881411988830011985059218048684311349415764441760364762942692722834850287985399559042457470942580456516395188637916303814055777357738894264037988945951468416861647204658893837753361851667573185920779272635885127149348845064478121843462789367112698673780005436144393573832498203659056909233757206537514290993810628872250841862059672570704733990716282248839
# c = 57248258945927387673579467348106118747034381190703777861409527336272914559699490353325906672956273559867941402281438670652710909532261303394045079629146156340801932254839021574139943933451924062888426726353230757284582863993227592703323133265180414382062132580526658205716218046366247653881764658891315592607194355733209493239611216193118424602510964102026998674323685134796018596817393268106583737153516632969041693280725297929277751136040546830230533898514659714717213371619853137272515967067008805521051613107141555788516894223654851277785393355178114230929014037436770678131148140398384394716456450269539065009396311996040422853740049508500540281488171285233445744799680022307180452210793913614131646875949698079917313572873073033804639877699884489290120302696697425
import gmpy2 from Crypto.Util.number import * dp=0x7f1344a0b8d2858492aaf88d692b32c23ef0d2745595bc5fe68de384b61c03e8fd054232f2986f8b279a0105b7bee85f74378c7f5f35c3fd505e214c0738e1d9
n=0x5eee1b4b4f17912274b7427d8dc0c274dc96baa72e43da36ff39d452ff6f2ef0dc6bf7eb9bdab899a6bb718c070687feff517fcf5377435c56c248ad88caddad6a9cefa0ca9182daffcc6e48451d481f37e6520be384bedb221465ec7c95e2434bf76568ef81e988039829a2db43572e2fe57e5be0dc5d94d45361e96e14bd65 e=0x10001 c=0x510fd8c3f6e21dfc0764a352a2c7ff1e604e1681a3867480a070a480f722e2f4a63ca3d7a92b862955ab4be76cde43b51576a128fba49348af7a6e34b335cfdbda8e882925b20503762edf530d6cd765bfa951886e192b1e9aeed61c0ce50d55d11e343c78bb617d8a0adb7b4cf3b913ee85437191f1136e35b94078e68bee8d edp=e*dp - 1 for k inrange(2,10000000): if edp%k==0: p= edp//k + 1 if isPrime(p): print(long_to_bytes(pow(c,dp,p)))
m1 = c^dp mod p m2 = c^dq mod q dp = d mod p-1 -> dp = d + k*(p-1) dq = q mod q-1 #根据 费马可得 c^dp mod p = c^d mod p #同理 c^dq mod q = c^d mod q c^d mod p = m1 c^d mod q = m2
构造 x = k1*m1 + k2*m2
(1)k1 mod p =1 (2)k1 mod q =0
k1 = k*q 带入(1) k = q^(-1) mod p 即 k1 = (q ^(-1) mod p) *q
""" 推广到一般 如果 在剩余定理中 x mod a1 = b1 x mod a2 = b2 x mod a3 = b3 ...
那么构造的数 m = k1*b1 + k2*b2 + ... kn * bn k1 = ((a2 *a3 *..an)^(-1) mod a1) * (a2 *a3 *..an) k2 = ((a1 *a3 *..an)^(-1) mod a1) * (a2 *a3 *..an) ... 如此规律 M=a1*a2*..an Mi = M / ai Mi' = gmpy2.invert(Mi,ai) Mi * Mi' * bi 每一项 综合要%M 一下 """