m^e=c mod n 所以有 m^e=k*n + c k为整数 m = (k*n+c)^(1/e)
同时因为e足够小所以k足够小,可以通过穷举k来获得明文m
exp:
1 2 3 4 5 6
for e inrange(1,5):#遍历e,已知e可以不用遍历 for k inrange(2000):#遍历k import Crypto.Util.number if__import__("gmpy2").iroot((k*n+flag),e)[1]: ifb"NSSCTF"in Crypto.Util.number.long_to_bytes(__import__("gmpy2").iroot((k*n+flag),e)[0]):#条件判断 print(Crypto.Util.number.long_to_bytes(__import__("gmpy2").iroot((k*n+flag),e)[0]))
from gmpy2 import * from Crypto.Util.number import * import sympy import math flag= 25166751653530941364839663846806543387720865339263370907985655775152187319464715737116599171477207047430065345882626259880756839094179627032623895330242655333 n= 134109481482703713214838023035418052567000870587160796935708584694132507394211363652420160931185332280406437290210512090663977634730864032370977407179731940068634536079284528020739988665713200815021342700369922518406968356455736393738946128013973643235228327971170711979683931964854563904980669850660628561419 for k inrange(2000): import Crypto.Util.number for e inrange(1,5): if__import__("gmpy2").iroot((k*n+flag),e)[1]: ifb"NSSCTF"in Crypto.Util.number.long_to_bytes(__import__("gmpy2").iroot((k*n+flag),e)[0]): print(Crypto.Util.number.long_to_bytes(__import__("gmpy2").iroot((k*n+flag),e)[0]))