RSA例题一
首先看题目:
e=3 n=22885480907469109159947272333565375109310485067211461543881386718201442106967914852474989176175269612229966461160065872310916096148216253429849921988412342732706875998100337754561586600637594798877898552625378551427864501926224989873772743227733285336042475675299391051376624685754547818835551263597996620383338263448888107691240136257201191331617560711786674975909597833383395574686942099700631002290836152972352041024137872983284691831292216787307841877839674258086005814225532597955826353796634417780156185485054141684249037538570742860026295194559710972266059844824388916869414355952432189722465103299013237588737 c=15685364647213619014219110070569189770745535885901269792039052046431067708991036961644224230125219358149236447900927116989931929305133870392430610563331490276096858863490412102016758082433435355613099047001069687409209484751075897343335693872741
题目很直接,直接给了e,n,c,求m;
首先看到e=3,而且n很大,如果明文很小,导致明文的三次方依旧小于n,那么对密文c直接开三次方就可以得到密文。
即
如果e=3,,
那么:,e=3,
另外还有一种情况:
就是m的三次方比n大,但是并没有足够大,
则我们可以设这样一个k满足:
所以爆破k,如果c-kn能开三次式,那么就可以得到明文。
代码:
1 import gmpy2 2 e = 3 3 n= 22885480907469109159947272333565375109310485067211461543881386718201442106967914852474989176175269612229966461160065872310916096148216253429849921988412342732706875998100337754561586600637594798877898552625378551427864501926224989873772743227733285336042475675299391051376624685754547818835551263597996620383338263448888107691240136257201191331617560711786674975909597833383395574686942099700631002290836152972352041024137872983284691831292216787307841877839674258086005814225532597955826353796634417780156185485054141684249037538570742860026295194559710972266059844824388916869414355952432189722465103299013237588737 4 c= 15685364647213619014219110070569189770745535885901269792039052046431067708991036961644224230125219358149236447900927116989931929305133870392430610563331490276096858863490412102016758082433435355613099047001069687409209484751075897343335693872741 5 print ('n=', n) 6 print ('c=', c) 7 print ('[+]Detecting m...') 8 result = gmpy2.iroot(c, 3) 9 print (' [-]The c has cubic root?', result[1]) 10 if result[1]: 11 print (' [-]The m is:', '{:x}'.format(result[0])) 12 print ('[!]All Done!') 13 # 低加密指数广播攻击
这时明文m就被我们爆破出来:
接着用工具将16进制转为ASCII字符就可以得到flag了:
flag到手,大功告成!