from Crypto import Random from Crypto.PublicKey import RSA from gmpy2 import * from Crypto.Util.number import * import bas64 withopen("public.pem") as f: key=RSA.import_key(f.read()) n=key.n e=key.e
n = 3454083680130687060405946528826790951695785465926614724373 p = 11761833764528579549 q = 17100682436035561357 r = 17172929050033177661 e=3 c = 1347530713288996422676156069761604101177635382955634367208 phi=(p-1)*(q-1)*(r-1) d=gmpy2.invert(e,phi) m=pow(c,d,n) print(binascii.unhexlify(hex(m)[2:]))
from Crypto.Util.number import * from flag import *
n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061 n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073 e = 65537 m = bytes_to_long(flag) c = pow(m, e, n1) c = pow(c, e, n2)
print("c = %d" % c)
# output # c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264
#b"hahaha, you've got the flag didn't you !the front part is :flag{G00d_w4" #b"hahaha, you've got the flag didn't you !the middle part is :y_tO_cR" #b"hahaha, you've got the flag didn't you !the last part is :4ck_RS4}"
e = 0x1337 p = 199138677823743837339927520157607820029746574557746549094921488292877226509198315016018919385259781238148402833316033634968163276198999279327827901879426429664674358844084491830543271625147280950273934405879341438429171453002453838897458102128836690385604150324972907981960626767679153125735677417397078196059 q = 112213695905472142415221444515326532320352429478341683352811183503269676555434601229013679319423878238944956830244386653674413411658696751173844443394608246716053086226910581400528167848306119179879115809778793093611381764939789057524575349501163689452810148280625226541609383166347879832134495444706697124741 n = p * q
assert(flag.startswith('NCTF')) m = int.from_bytes(flag.encode(), 'big') assert(m.bit_length() > 1337)
c = pow(m, e, n) print(c) # 10562302690541901187975815594605242014385201583329309191736952454310803387032252007244962585846519762051885640856082157060593829013572592812958261432327975138581784360302599265408134332094134880789013207382277849503344042487389850373487656200657856862096900860792273206447552132458430989534820256156021128891296387414689693952047302604774923411425863612316726417214819110981605912408620996068520823370069362751149060142640529571400977787330956486849449005402750224992048562898004309319577192693315658275912449198365737965570035264841782399978307388920681068646219895287752359564029778568376881425070363592696751183359
# -*- coding:utf8 -*- from gmpy2 import * from Crypto.Util.number import * import random import math
defonemod(e, q): p = random.randint(1, q-1) while(powmod(p, (q-1)//e, q) == 1): # (r,s)=1 p = random.randint(1, q) return p
defAMM_rth(o, r, q): # r|(q-1 assert((q-1) % r == 0) p = onemod(r, q)
t = 0 s = q-1 while(s % r == 0): s = s//r t += 1 k = 1 while((s*k+1) % r != 0): k += 1 alp = (s*k+1)//r
a = powmod(p, r**(t-1)*s, q) b = powmod(o, r*a-1, q) c = powmod(p, s, q) h = 1
for i inrange(1, t-1): d = powmod(int(b), r**(t-1-i), q) if d == 1: j = 0 else: j = (-math.log(d, a)) % r b = (b*(c**(r*j))) % q h = (h*c**j) % q c = (c*r) % q result = (powmod(o, alp, q)*h) return result
defALL_Solution(m, q, rt, cq, e): mp = [] for pr in rt: r = (pr*m) % q # assert(pow(r, e, q) == cq) mp.append(r) return mp
defcalc(mp, mq, e, p, q): i = 1 j = 1 t1 = invert(q, p) t2 = invert(p, q) for mp1 in mp: for mq1 in mq: j += 1 if j % 1000000 == 0: print(j) ans = (mp1*t1*q+mq1*t2*p) % (p*q) if check(ans): return return
defALL_ROOT2(r, q): # use function set() and .add() ensure that the generated elements are not repeated li = set() while(len(li) < r): p = powmod(random.randint(1, q-1), (q-1)//r, q) li.add(p) return li
if __name__ == '__main__': c = 10562302690541901187975815594605242014385201583329309191736952454310803387032252007244962585846519762051885640856082157060593829013572592812958261432327975138581784360302599265408134332094134880789013207382277849503344042487389850373487656200657856862096900860792273206447552132458430989534820256156021128891296387414689693952047302604774923411425863612316726417214819110981605912408620996068520823370069362751149060142640529571400977787330956486849449005402750224992048562898004309319577192693315658275912449198365737965570035264841782399978307388920681068646219895287752359564029778568376881425070363592696751183359 p = 199138677823743837339927520157607820029746574557746549094921488292877226509198315016018919385259781238148402833316033634968163276198999279327827901879426429664674358844084491830543271625147280950273934405879341438429171453002453838897458102128836690385604150324972907981960626767679153125735677417397078196059 q = 112213695905472142415221444515326532320352429478341683352811183503269676555434601229013679319423878238944956830244386653674413411658696751173844443394608246716053086226910581400528167848306119179879115809778793093611381764939789057524575349501163689452810148280625226541609383166347879832134495444706697124741 e = 0x1337 cp = c % p cq = c % q
e = 1801 p = 49610229352589717245227429186510630298995334563536199979797365135356894947505595171590737127611751124743823204969291853243936699113293137172961540731655194113111189561603261168928406442577570919901769348742992633428864861175880441682752947688509869668929473479230018031647980097396415380123118521799468844841 q = 21081926656979729045764441706195868361643779935106260715219328461497406780587336009385210898093496090213306812904410650499587043699660339207567766840318127296396962037273317168795761421233687815992929975284592353117739413561939283754964442896468496199833988666060155459156116345763999855126020972915904618043 c = 601596145172542477058917394071994325109856881057412872218601643742101914635753765731910337249806643258952637146341530783703613931109366648847232809553067941206928974141651198815184695746636818122414926015513095322872645068410957200062317958684872682628646759817233433643987003499153702624673493727886566639667597997520471371146056861227114668317633291934130573158877960548655006208725827943739971068608175370661619328559766977175575896437656636083179668805135271793023165492681941002853661303072959879197775224449456951125268328000206540965011249895216257583247180682482954741912101069920760903900864428405997751199 n = p * q
# -*- coding:utf8 -*- from gmpy2 import * from Crypto.Util.number import * import random import math
defonemod(e, q): p = random.randint(1, q-1) while(powmod(p, (q-1)//e, q) == 1): # (r,s)=1 p = random.randint(1, q) return p
defAMM_rth(o, r, q): # r|(q-1 assert((q-1) % r == 0) p = onemod(r, q)
t = 0 s = q-1 while(s % r == 0): s = s//r t += 1 k = 1 while((s*k+1) % r != 0): k += 1 alp = (s*k+1)//r
a = powmod(p, r**(t-1)*s, q) b = powmod(o, r*a-1, q) c = powmod(p, s, q) h = 1
for i inrange(1, t-1): d = powmod(int(b), r**(t-1-i), q) if d == 1: j = 0 else: j = (-math.log(d, a)) % r b = (b*(c**(r*j))) % q h = (h*c**j) % q c = (c*r) % q result = (powmod(o, alp, q)*h) return result
defALL_Solution(m, q, rt, cq, e): mp = [] for pr in rt: r = (pr*m) % q # assert(pow(r, e, q) == cq) mp.append(r) return mp
defcalc(mp, mq, e, p, q): i = 1 j = 1 t1 = invert(q, p) t2 = invert(p, q) for mp1 in mp: for mq1 in mq: j += 1 if j % 1000000 == 0: print(j) ans = (mp1*t1*q+mq1*t2*p) % (p*q) if check(ans): return return
defALL_ROOT2(r, q): # use function set() and .add() ensure that the generated elements are not repeated li = set() while(len(li) < r): p = powmod(random.randint(1, q-1), (q-1)//r, q) li.add(p) return li
if __name__ == '__main__': e = 1801 p = 49610229352589717245227429186510630298995334563536199979797365135356894947505595171590737127611751124743823204969291853243936699113293137172961540731655194113111189561603261168928406442577570919901769348742992633428864861175880441682752947688509869668929473479230018031647980097396415380123118521799468844841 q = 21081926656979729045764441706195868361643779935106260715219328461497406780587336009385210898093496090213306812904410650499587043699660339207567766840318127296396962037273317168795761421233687815992929975284592353117739413561939283754964442896468496199833988666060155459156116345763999855126020972915904618043 c = 601596145172542477058917394071994325109856881057412872218601643742101914635753765731910337249806643258952637146341530783703613931109366648847232809553067941206928974141651198815184695746636818122414926015513095322872645068410957200062317958684872682628646759817233433643987003499153702624673493727886566639667597997520471371146056861227114668317633291934130573158877960548655006208725827943739971068608175370661619328559766977175575896437656636083179668805135271793023165492681941002853661303072959879197775224449456951125268328000206540965011249895216257583247180682482954741912101069920760903900864428405997751199 n = p * q cp = c % p cq = c % q
from Crypto.Util.number import * from secret import flag p = getPrime(1024) q = getPrime(16) n = p*q m = bytes_to_long(flag) for i inrange(1,p-q): m = m*i%n e = 1049 print(pow(2,e,n)) print(pow(m,e,n)) #4513855932190587780512692251070948513905472536079140708186519998265613363916408288602023081671609336332823271976169443708346965729874135535872958782973382975364993581165018591335971709648749814573285241290480406050308656233944927823668976933579733318618949138978777831374262042028072274386196484449175052332019377 #3303523331971096467930886326777599963627226774247658707743111351666869650815726173155008595010291772118253071226982001526457616278548388482820628617705073304972902604395335278436888382882457685710065067829657299760804647364231959804889954665450340608878490911738748836150745677968305248021749608323124958372559270
p=170229264879724117919007372149468684565431232721075153274808454126426741324966131188484635914814926870341378228417496808202497615585946352638507704855332363766887139815236730403246238633855524068161116748612090155595549964229654262432946553891601975628848891407847198187453488358420350203927771308228162321231 q=34211 n = p*q phi=(p-1)*(q-1) e = 1049 c = 3303523331971096467930886326777599963627226774247658707743111351666869650815726173155008595010291772118253071226982001526457616278548388482820628617705073304972902604395335278436888382882457685710065067829657299760804647364231959804889954665450340608878490911738748836150745677968305248021749608323124958372559270 d=invert(e,phi) m=pow(c,d,n)
from sympy.solvers import solve from sympy.abc import h,l from gmpy2 import * from Crypto.Util.number import *
c = 182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090 n = 438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437 e = 0x10001
s = solve([h*l-pq, tmp*h*h + tmp*l*l - n], [h, l]) for i in s: h,l = int(i[0]), int(i[1]) p = h*tmp + l q = l*tmp + h if p > 0and q > 0and is_prime(p) and is_prime(q): break
n = PP * QQ m = bytes_to_long(flag.encode()) c = pow(m, 65537, n) print('n =', n) print('c =', c)
n = 177269125756508652546242326065138402971542751112423326033880862868822164234452280738170245589798474033047460920552550018968571267978283756742722231922451193 c = 47718022601324543399078395957095083753201631332808949406927091589044837556469300807728484035581447960954603540348152501053100067139486887367207461593404096
''' c = 86415476382906786465939442398992406348852252355326334785583474583480585659663836032856765037225261433532613020730103955916772373674295180495452293421279237222544308971840820110279355118064931506637793547489441433938707518241461449059717326341918746156620038847745542794560335988858156929013492541794032580255 e = 65537 n = 166337085427556441543394334802135957169988266794453522153008810336368247289697353242192853337017363111987395194428553050681210209730724596529629525357502302165396675392000087988956194589350195512264427901330860811469484473725396354231555692283910488095918243519370430703255279433498479943391876108577325840381 x = 2509898544460604898497702985357222191225421344430742181152035006910161802193623236888758239071502008180363546424715261788 '''
from sage.all_cmdline import * from Crypto.Util.number import *
c = 86415476382906786465939442398992406348852252355326334785583474583480585659663836032856765037225261433532613020730103955916772373674295180495452293421279237222544308971840820110279355118064931506637793547489441433938707518241461449059717326341918746156620038847745542794560335988858156929013492541794032580255 e = 65537 n = 166337085427556441543394334802135957169988266794453522153008810336368247289697353242192853337017363111987395194428553050681210209730724596529629525357502302165396675392000087988956194589350195512264427901330860811469484473725396354231555692283910488095918243519370430703255279433498479943391876108577325840381 x = 2509898544460604898497702985357222191225421344430742181152035006910161802193623236888758239071502008180363546424715261788
plist = [0] qlist = [0]
''' 0^0 = 0 0^1 = 1 1^0 = 1 1^1 = 0 '''
mask = 0 for i inrange(400): tmpp, tmpq = [],[] for p,q in [(0,0),(0,1),(1,0),(1,1)]: if p^q == ((x>>mask)&1): for j inrange(len(plist)): if ((p<<mask) + plist[j]) * ((q<<mask) + qlist[j]) % (2<<mask) == n % (2<<mask): tmpp.append((p<<mask) + plist[j]) tmpq.append((q<<mask) + qlist[j]) plist,qlist = tmpp, tmpq mask += 1
for pbar in plist: PR = PolynomialRing(Zmod(n), 'x') x = PR('x') ZmodN = Zmod(n) f = x*ZmodN(2**400) + pbar f = f.monic() r = f.small_roots(X=2**112, beta=0.4) if r: p = int(pbar+r[0]* 2**400) if n%p == 0: break
q = n // p d = inverse_mod(e, (p-1)*(q-1)) print(long_to_bytes(power_mod(c, d, n)))
#b"n's being,\nThou, from whose unseen presence the leaves dead\nAre driven, like ghosts from an enchanter fleeing,\nYellow, a"
第三段
from gmpy2 import * from Crypto.Util.number import *
n = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147 p = 7117286695925472918001071846973900342640107770214858928188419765628151478620236042882657992902 c = 59213696442373765895948702611659756779813897653022080905635545636905434038306468935283962686059037461940227618715695875589055593696352594630107082714757036815875497138523738695066811985036315624927897081153190329636864005133757096991035607918106529151451834369442313673849563635248465014289409374291381429646
p = p<<200
PR.<x> = PolynomialRing(Zmod(n))
f = p+x res = f.small_roots(X=2^200, beta=0.4)
p = int(res[0]) + p q = n // p print(q) d = inverse_mod(65537, (p-1)*(q-1)) m = power_mod(c, d, n) print(long_to_bytes(m)) #b'nd black, and pale, and hectic red,\nPestilence-stricken multitudes: O thou,\nWho chariotest to their dark wintry bed\n'
贴一个好用的脚本
n = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147 p4 = 7117286695925472918001071846973900342640107770214858928188419765628151478620236042882657992902 e = 65537 pbits = 512 kbits = pbits - p4.nbits() print(p4.nbits()) p4 = p4 << kbits PR.<x> = PolynomialRing(Zmod(n)) f = x + p4 roots = f.small_roots(X=2^kbits, beta=0.4) if roots: p = p4+int(roots[0]) print("n: "+str(n)) print("p: "+str(p)) print("q: "+str(n//p))
import gmpy2 from Crypto.Util.number import * import random from secret import flag
m1 = flag[0:12] m2 = flag[12:24] m3 = flag[24:]
defencrypt1(m): while1: e = random.randint(100, 1000) p = getPrime(1024) q = getPrime(1024) phi_n = (p - 1) * (q - 1) t = gmpy2.gcd(e, phi_n) if gmpy2.invert(e // t, phi_n) and t != 1: break n = p * q c = pow(m, e, n) print({'c': format(c, 'x'), 'p': format(p, 'x'), 'q': format(q, 'x'), 'e': format(e, 'x')})
defencrypt2(m): p = getPrime(1024) q = getPrime(1024) n = p * q e = 65537 c = gmpy2.powmod(m, e, n) print({'c': format(c, 'x'), 'p': format((p >> 60) << 60, 'x'), 'e': format(e, 'x'), 'n': format(n, 'x')})
defencrypt3(m): p = getPrime(1024) q = getPrime(1024) n = p * q e = 65537 M = 2022 * m * 1011 * p c = pow(M, e, n) print({'c': format(c, 'x'), 'n': format(n, 'x'),'e':format(e, 'x')})
if __name__ == '__main__': encrypt1(bytes_to_long(m1)) encrypt2(bytes_to_long(m2)) encrypt3(bytes_to_long(m3))