"""短除法-1 从i为2开始枚举,一直枚举到, 一旦n % i == 0成立,则i为n的因子, 然后进行n //= i使运行速度加快并使i为质数才可能有n % i == 0。 复杂度:0(n^1/2) 适用范围:n: 2-10^16 """ deffactorization(n): i = 2 ret = [] while i * i <= n: while n % i == 0: ret.append(i) n //= i i += 1 if n > 1: ret.append(n) return (ret) if __name__ == '__main__': print(factorization(int(input())))
"""短除法2 我们可以打表出2到n^1/2之间的质数再进行试除,这样在解决多个数的质因数分解时才会免除大部分合数的影响。 用素数筛进行打表复杂度为O(n),我们也只需要从2到n^1/2打表到即可。 复杂度:0(n^1/2) 适用范围:n 2-10^12 """ pri = [] MX = int(1e6) isprime = [True] * MX definit(): global a, MX for i inrange(2, MX): if isprime[i]: pri.append(i) for j inrange(i + i, MX, i): isprime[j] = False deffactorization(n): global pri ret = [] for i in pri: if i * i > n: break while n % i == 0: ret.append(i) n //= i ret.append(n) return (ret) if __name__ == '__main__': init() print(factorization(int(input())))
""" 用Miller-Rabin素性测试和离散对数Pollard_rho算法进行大数因数分解: 复杂度:0(n^1/4) 适用范围:n 2-10^33 """ import random from math import log, log10 from collections import Counter defgcd(x, y): return x if y == 0else gcd(y, x % y) deffpow(a, x, n): ans = 1 while x > 0: if x & 1: ans = ans * a % n a = a * a % n x >>= 1 return ans # there change the times of Rabin-Miller TIMES = 10 defis_prime(n): defcheck(a, n, x, t): ret = fpow(a, x, n) last = ret for i inrange(0, t): ret = ret * ret % n if ret == 1and last != 1and last != n - 1: returnTrue last = ret if ret != 1: returnTrue returnFalse ifnotisinstance(n, int): raise TypeError(str(n) + ' is not an integer!') if n <= 0: raise ValueError('%d <= 0' % n) if n in {2, 3, 5, 7, 11}: returnTrue for i in {2, 3, 5, 7, 11}: if n % i == 0: returnFalse x = n - 1 t = 0 whilenot x & 1: x >>= 1 t += 1 for i inrange(0, TIMES): a = random.randint(1, n - 2) if check(a, n, x, t): returnFalse returnTrue defpollard_rho_2(n, c): x = random.randint(0, n) i, k, y = 1, 2, x whileTrue: i += 1 x = (x * x) % n + c d = gcd(y - x, n) if d != 1and d != n: return d if y == x: return n if i == k: y = x k <<= 1 defpollard_rho_1(n): ifnotisinstance(n, int): raise TypeError(str(n) + ' is not an integer!') if n == 1: returnNone if is_prime(n): return [n] ans = [] p = n while p >= n: p = pollard_rho_2(p, random.randint(1, n - 1)) ans.extend(pollard_rho_1(p)) ans.extend(pollard_rho_1(n // p)) return ans deffactorization(n): return Counter(pollard_rho_1(n)) if __name__ == '__main__': n = int(input()) print('len:', len(str(n))) print(factorization(n))
defhack_RSA(e,n): ''' Finds d knowing (e,n) applying the Wiener continued fraction attack ''' frac = ContinuedFractions.rational_to_contfrac(e, n) convergents = ContinuedFractions.convergents_from_contfrac(frac) for (k,d) in convergents: #check if d is actually the key if k!=0and (e*d-1)%k == 0: phi = (e*d-1)//k s = n - phi + 1 # check if the equation x^2 - s*x + n = 0 # has integer roots discr = s*s - 4*n if(discr>=0): t = Arithmetic.is_perfect_square(discr) if t!=-1and (s+t)%2==0: print("Hacked!") return d
原理: 首先我们证明 M^(k(p-1)(q-1)(r-1)+1) mod p=M mod p [ 1 ] 1.如果 M 、 p 不互质,那么p 能整除 M, 明显 p也能整除 M^(k(p-1)(q-1)(r-1)+1), 那么: M^(k(p-1)(q-1)(r-1)+1) mod p=M mod p=0 2.若 p 、 q 互质, 根据欧拉定理 M^Φ (p) mod p=1 ,有 M^(k(p-1)(q-1)(r-1)+1) mod p =((M)M^k(p-1)(q-1)(r-1)) mod p =((M)(M^(p-1))^k(q-1)(r-1)) mod p =((M)(M^Φ(p))^k(q-1)(r-1)) mod p =(M mod p)*[(M ^Φ(p)) mod p]^k(q-1)(r-1) =(M mod p)*(1)^k(q-1)(r-1) (根据欧拉定理) =M mod p 根据[ 1 ] , 有 [M^(k(p-1)(q-1)(r-1)+1)-M] mod p=0 (2), 同理,可证明 [M^(k(p-1)(q-1)(r-1)+1)-M] mod q=0(3) [M^(k(p-1)(q-1)(r-1)+1)-M] mod r=0 (4) 根据[ 2 ][ 3 ][ 4 ]知,存在一整数 x 使 [M^(k(p-1)(q-1)(r-1)+1)-M]=(pqr)x=nx 所以 n 能整除 [M^(k(p-1)(q-1)(r-1)+1)-M] 故 M^(k(p-1)(q-1)(r-1)+1) mod n=M^(k准(n)+1) mod n=M 根据 ed=k准(n)+1 (逆元关系) 得 M=^ed mod n=M
2.低加密指数攻击(e很小)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import gmpy2 from Crypto.Util.number import * defde(c, e, n): k = 0 whileTrue: m = c + n*k result, flag = gmpy2.iroot(m, e) ifTrue == flag: return result k += 1 e= 3 n= 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793 c= 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365 m=de(c,e,n) print(long_to_bytes(m))
#脚本2 ''' 题目: from Crypto.Util.number import getPrime,bytes_to_long p,q = getPrime(2048),getPrime(2048) e = 7 n = p*q m = bytes_to_long(open('flag.txt','rb').read().strip()) c = pow(m,e,n) print("c = ",c) print("n = ",n) # c = 147693154873835354725007152781732424355869776162377337823960431913672366269917723916891506269449726723757821517328874729037838600793748824028829185409932536014732765063216715033843955453706710187792772702199448156372644163429786386035008302836467605094954587157232829525150652611067567669525072625329634860065850520051628272535479197120008981979404760445193750864902244921407742155742716289495581989134730376783828846663464819337418977287363028738701414486788851136608957124505485242331701209645216580641917007780811842757125048746184068597664780265422321550909392419865169775282217442331295071069272774722564587602419768461231775480847018941840911357926330143045826277813722919121117172763493242590521245640828462665947672485094793188432098216701511715232654611338293295459889814699850788048985878279440740712956248569068077253790198036918598519191892836075254345518967666166925163908185663991353344555402397055977817370082929420443034626201745027965444069777059760865359310439815816749939498993014457995041394803598825093836045546578310632172636478575946653375857640993393714607308326474003446154152048840071034349831168612740218034679021240949747357214453636633636662650940968576792518622437627529244515229173 # n = 553409369582823237678532685244026647155180191225879439432235077135813123637186465008813830373646133388592395760175777499266561095087891764348044063111935877931069321764391883899483374576303169645488542398590564148654412004383012178107972880058460460806768779452529433458826925606225797078653905380530651390617109384086518728626571028089036812787671647095695947167204428442727185744172445701874820612799168887428075695751162763647868386879374037826876671079326544820609721731078985096813307183878793033824330869698508952853770794414757655681370862323768018291030331209143189638496644361618184164228294031490537429556439588954274708598530042700988138862000054458742762198052079867259365645914383561162796796952346445529346145323567650621600171442575319262718389389870407629339714751583360252884338116164466349449862781112019462555743429653595045695696967783338371470032332852204294900011651434678829104876529439166176589508898757122660322523937330848536715937381297551894198974459004139082562228022412335520195652419375915216074658463954339332593244483927157329404652516225481116614815221154229491846087288087715884363786672244655901308480290011237244562251084095684531716327141154558809471185132979704992609461470501119328696999713829 低加密指数攻击: 假设e=3, 公钥中的加密指数e很小,但是模数n很大 有RSA加密公式: C=M^e % n (C密文,M明文) 则: 当M^e < n 时, C = M^e ,所以对C开方就能得到M 当M^e > n 时,此时用爆破的方法 假设我们 M^e / n 的商为 k 余数为C, 则M^e = kn + C,对K进行爆破,只要k满足 kn + C能够开e次方就可以得明文 ''' ''' #解题 #python3 ## -*- coding: utf-8 -*-# from gmpy2 import iroot import libnum e = 7 n = 553409369582823237678532685244026647155180191225879439432235077135813123637186465008813830373646133388592395760175777499266561095087891764348044063111935877931069321764391883899483374576303169645488542398590564148654412004383012178107972880058460460806768779452529433458826925606225797078653905380530651390617109384086518728626571028089036812787671647095695947167204428442727185744172445701874820612799168887428075695751162763647868386879374037826876671079326544820609721731078985096813307183878793033824330869698508952853770794414757655681370862323768018291030331209143189638496644361618184164228294031490537429556439588954274708598530042700988138862000054458742762198052079867259365645914383561162796796952346445529346145323567650621600171442575319262718389389870407629339714751583360252884338116164466349449862781112019462555743429653595045695696967783338371470032332852204294900011651434678829104876529439166176589508898757122660322523937330848536715937381297551894198974459004139082562228022412335520195652419375915216074658463954339332593244483927157329404652516225481116614815221154229491846087288087715884363786672244655901308480290011237244562251084095684531716327141154558809471185132979704992609461470501119328696999713829 c = 147693154873835354725007152781732424355869776162377337823960431913672366269917723916891506269449726723757821517328874729037838600793748824028829185409932536014732765063216715033843955453706710187792772702199448156372644163429786386035008302836467605094954587157232829525150652611067567669525072625329634860065850520051628272535479197120008981979404760445193750864902244921407742155742716289495581989134730376783828846663464819337418977287363028738701414486788851136608957124505485242331701209645216580641917007780811842757125048746184068597664780265422321550909392419865169775282217442331295071069272774722564587602419768461231775480847018941840911357926330143045826277813722919121117172763493242590521245640828462665947672485094793188432098216701511715232654611338293295459889814699850788048985878279440740712956248569068077253790198036918598519191892836075254345518967666166925163908185663991353344555402397055977817370082929420443034626201745027965444069777059760865359310439815816749939498993014457995041394803598825093836045546578310632172636478575946653375857640993393714607308326474003446154152048840071034349831168612740218034679021240949747357214453636633636662650940968576792518622437627529244515229173 k = 0 while 1: res = iroot(c+k*n,e) #c+k*n #print(res) #res = (mpz(13040004482819713819817340524563023159919305047824600478799740488797710355579494486728991357), True) if(res[1] == True): print(libnum.n2s(int(res[0]))) #转为字符串 break k=k+1 #b'moectf{SMaLL_3xPon3nt_Mak3_rSa_w3ak!_!lP0iYlJf!M3rux9G9Vf!JoxiMl903lllA}' ''' from gmpy2 import iroot import libnum e = 5 n = 18049146130359556157811138499355569967231668855528566823643376144155931993553424757354835027829037263429007310779886281743425186527415596058004878860570474866413182148724803537036078612785180550377667299555519230603647447077725080756322343538156406080031959768393145744701092093127752647143419553963316375696232038952573236311522683541862835602321038621904842874356522524316864553501304106884213097353522958546518042728628006318129608745487662533959888992223736595503203451378533217004433230837006796341055201266431153548000348148960250455415972226546646460918890401484239320725539304914347952245606818833495867312063
c = 377041108412334062897923100149371833160065752130578483588828849399791858197434981428466047315212724764223394695011882740933537996983126187094472520344493047769519118482187945467176598341785927269390299847888131061799861412055502165865052720513992259109503509827127768615772091500352075827289290029872935215672798059068944088543667111296361405639896493856695176145088430237388172420390881291650155157688737470414069130558367036786376549227175617218017578125
k = 0 while1: res = iroot(c+k*n,e) #c+k*n #print(res) #res = (mpz(13040004482819713819817340524563023159919305047824600478799740488797710355579494486728991357), True) if(res[1] == True): print(libnum.n2s(int(res[0]))) #转为字符串 break k=k+1
''' https://blog.csdn.net/shuaicenglou3032/article/details/119930783 with open("flag.txt","rb") as f: flag = f.read().strip() m = int.from_bytes(flag, "big") e = 65537 from Crypto.Util.number import getPrime for x in range(10): p = getPrime(1024) q = getPrime(1024) n = p * q c = pow(m, e, n) print("n =", n) print("c =", c) ''' ''' n = 17524722204224696445172535263975543817720644608816706978363749891469511686943372362091928951563219068859089058278944528021615923888948698587206920445508493551162845371086030869059282352535451058203615402089133135136481314666971507135484450966505425514285114192275051972496161810571035753943880190780759479521486741046704043699838021850105638224212696697865987677760179564370167062037563913329993433080123575434871852732981112883423565015771421868680113407260917902892944119552200927337996135278491046562185003012971570532979090484837684759828977460570826320870379601193678304983534424368152743368343335213808684523217 c = 6870605439714128574950893771863182370595667973241984289208050776870220326525943524507319708560433091378319367164606150977103661770065561661544375425887970907060665421562712515902428061727268441585629591525591001533188276465911918724808701356962871139957343861919730086334623932624184172272488406793955068827527130338853980609365042071290967556159598511667974987218999253443575482949258292953639729393456515185185102248985930422080581185292420347510600574229080211050520146551505605537486989306457793451086767402197128573781597156939709237045132856159368959981648969874765462190363842275826077556314448408825308218451 n = 24974121071274650888046048586598797033399902532613815354986756278905133499432183463847175542164798764762683121930786715931063152122056911933710481566265603626437742951648885379847799327315791800670175616973945640322985175516271373004547752061826574576722667907302681961850865961386200909397231865804894418194711076667760169256682834206788730947602211228930301853348503098156592000286467190760378847541148772869356389938999094673945092387627113807899212568399028514283219850734634544982646070106811651490010946670117927664594365986238107951837041859682547029079035013475238052160645871718246031144694712586073789250183 c = 10324627733161143472233272675096997859064721978612320424254305978486200326061730105384511258706433940176741256952824288120499229240005823611541292676234913505775165761543820764046537413943393325463602612485849366939102550336256797820440347815027443410399157963547486098366749815425187247171697678576246606105486928212486117878157055321965270364583625270716186820068538749425299073309429589410882809098930213978117176627031795312102177342499674234163614021182116065492884880492891668658240362567156235958605768725892407536211503981819707919444725863397622629226309480836486427388484176463279384813974310500625102568341 n = 14215826065753265334521416948225868542990756976323308408298887797364519400310818641526401662106853573185085731682502059761982246604277475488691297554851873224516934619888327644352138127883043558424300092247604877819821625587944308487310522092440517150600171819145803937177931473336108429889165189521078678397694303305705260759351843006130968234071638035667854938070597400634242396852782331461576526836227336952718230741560369621645218729592233657856104560425642219241082727756696967324334634822771842625681505869025740662258929200756109704988223034840699133778958569054445520305361142302393767439478256174414187983763 c = 415916446053083522663299405080903121619846594209033663622616979372099135281363175464579440520262612010099820951944229484417996994283898028928384268216113118778734726335389504987546718739928112684600918108591759061734340607527889972020273454098314620790710425294297542021830654957828983606433731988998097351888879368160881316237557097381718444193741788664735559392675419489952796677690968481917700683813252460912749931286739585465657312416977086336732056497161860235343155953578618273940135486362350057858779130960380833359506761436212727289297656191243565734621757889931250689354508999144817518599291078968866323093 n = 12221355905532691305226996552124162033756814028292708728711809229588190407700199452617060657420166395065565154239801465361510672853972152857415394695376825120759202857555325904640144375262531345320714166285999668052224661520834318497234299585219832943519644095197479639328120838919035625832361810964127485907587199925564724081163804724975965691571850962714258888527902920462746795712011579424322515292865504642938090200503979483095345893697972170153990274670257331483858538617460680462369680572833191232126527727222302641204529110948993583190295067970240051042000918629138767209918572311469915774910003970381965123241 c = 2248834602646305164283014556051672824689884721514190813323189875541899566338153534858709617544459297836048770439230174669883719627734394673012731609952869246171300132019334542245094425654362711870373095782083791160029789553806741967408922001051006100049326921742208757147339981269528740944842177729701945606827918253016001436218891580980192743564642120923356793292885805519110411357830040053435569937296612987581482128241218218550319154933831743819546558930918761162723110000328532730751591375727881221199739397698390594797621758011191224528339478784930214820615602510460640307707682865125229937141010351138099874025 n = 18152103454920389919231636321286527841833809319334215885641536161086810144890443857211776387914779781628740172079478910188540146498426564211851629962338413488555121865779016981727229209606498886170396500155102635962395243364899026418106378234307821492609778555173516000309435730752571818439328803899462791834490025768785383592935046996428331508608555503567191807692523852530836008436655164751054189301721070209363416058642811329040202582026786024825518381761299547703962502636888833428457116986351812252188468878701301184044948733274488264320930936362549028124581962244201377136969591119942276742760215403738913067567 c = 2797812094994121597295362327809389195134238119144547570610194659000554967367804835006774413888965325870488368112707535584687083342412367127561646136089638402907513075405746055834487062923240856950047936297155455745928810738711368950139327254040579266046642851362228893522740216519732851152162928545416236075387903789535000820423985522550638100049857678600662008021574841083416323980817348573062083159710189689337626277009675683473560325178417766400002763719953723259300977655801234386662217462862844994462505601804422871991694828697337752697234180117437785537788728412520613916334045368736691714704501962513954509705 n = 22877887459293720334652698748191453972019668578065068224653972884599636421200068659750242304040301306798039254241668648594556654589309801728248683586229288074709849246660525799452637187132633064172425677552176203292787732404537215347782229753837476655088638984496409603054524994383358547132112778403912563916886533181616856401929346567686400616307916690806467019665390260267596320840786982457521423178851498130935577260638269429250197050326097193841333205073650802709022947551398142692735680419453533128176592587955634333425401930362881423044363132586170013458300714163531162544301477356808388416864173949089028317961 c = 12271947322974809255127222556723394446467844330408506340843897575503534175121932185624776713618037572593449207329510171212097269297133492090526270770286000839978630002819714376964416081198925899119135271459404333829811516667576167576916805217016117373027245648473458331936273975110163065432285322832123169216976420362833557809289561705091817949915218278430834098156335989014645979633658818904753942786129126233956314517292746008579152368541316795082120147520597254020266752859205131887527661767589367756335766220841483940854397440079467053684289006956034944336788288196391829411432383541473132962783883758561108297747 n = 19844333358004073542783728196775487079202832688982038135532362073659058674903791697765527614270399097276261983744620537925712167578187109058145015032736796457938148615396547198728652435169126585595701228287449135664667959433491335769206692390262797325133960778920452511673878233190120432257482339068405290918739453464061987163074129048150451046315248186376609350095502130018696275764450248681787926130463463923862832714969425813770847493135627599129546112143050369344208092649256659330284904392961574494907186727388685504929586018639846040474616307662546605623294842316524163106100888851228858194942825157286544846177 c = 9531264751315473345056673937611382755236533664089452852716992791452558274873158812669513178040971923528201631609089069182049526587423864397527252061341857426422965190913745048414029690931254119437249218321954899956104589066479231204536856131403590472063496956452030342299863907499976917750846369802185896519725837163530049157920978007252920334447236842959033879772444475877613295594785710745889554296655932909212643500877218304116451889820444820534937901427158918411546484157737612926382420354101675658160847653151539420222526999426483473829341628599881460824765758346670633385844187252696874025582747177333702736465 n = 16956880944655068255446705024149899655327230949463546092744762226005904114738078692036960935391303255804754787864713189658290361949509917704853428701870609882427423574672772606814823959758208695540116440342488334213300943604780971422918744381486937517952553797134323570131582724393100092308466968491068503301604506186521656059375518680612292667310641047190088814753025794048591445267711939066523165042651430468971452726568222388482323097260496415484997546126185688914792795834046855221759289007609518312601640548469651358391745947588643697900883634533872314566389446271647587564348026861264979727062157272541149018781 c = 16110326928338602237561005337578085623028116490564329920738844771341250444164294693848130674347672763073995755532723894042946521372321947507527854966013459795492930736187058535665041545095683801386814190612817128504426590828954205050425979880047802547011117626354405687170961272200066258220699329112978151044633994329352673342582175349200008181837211288847301836681860817044391028992501763375849046751094019224570802498414368189170656992427042010362385494565216988561215657424755648213390551881450141899860811844684546992754530755092358644968088017107313907435586729574798046187046145596726569637758312033849476689378 n = 16472195897077185060734002588086375750797253422014472876266294484788862733424113898147596402056889527985731623940969291811284437034420929030659419753779530635563455664549165618528767491631867637613948406196511848103083967995689432928779805192695209899686072900265108597626632371718430059561807147486376536203800038054012500244392964187780217667805308512187849789773573138494622201856638931435423778275004491853486855300574479177472267767506041000072575623287557610576406578525902565241580838652860552046216587141709709405062150243990097835181557208274750462554811004137033087430556692966525170882625891516050207318491 c = 11867731823522211833301190385669833752050387304375114576570892885641949969365352586215693183003550684262313893105989683214739695968039039944442567581277252581988489020834299896625977474857889570528169919064941042132119301236852358823696947330423679033138054012027878783478922023431469564210485180679933264749281963405243082505688901662659030897104957499953192201440290084373968716271056483463909282407034181891901928790601973222643210525000717355062752079302291729448234374709852429885984987094307177760741403086538949190424454337896501402430653783597070178968921411867485584517214777073301007918941216316241784521708 n = 13890749889361612188368868998653029697326614782260719535555306236512452110708495623964530174188871342332417484996749651846510646453983388637377706674890018646246874688969342600780781646175634455109757266442675502522791531161284420286435654971819525519296719668701529481662071464145515727217108362496784024871976015116522898184301395037566514980846499856316532479656908169681719288258287756566886281183699239684997698487409138330229321935477734921670373632304542254938831218652340699024011371979519574576890581492623709896310465567043899767342676912434857372520308852745792360420376574037705943820090308501053778144141 c = 6250115196713939477947942995075509357173312813431601073354390451609559579925704891503987992181988654989477525811826607070378476102616752398280691012244301950194800995432882828020405062344160270290542566163969692748126314259624623341922057435728127596172871894887055305291345372720594481096374310285437492746765510292863238933163142677773310305789984897974266961231555124787205980411992251387207335655129551950825339766848166539671565212408741432649813058363660321480995187545006718837863674527475323414266732366507905974800565463011676462244368010182725161416783875646259625352308599198614681446394427674340328493047 n = 21457499145521259498911107987303777576783467581104197687610588208126845121702391694574491025398113729462454256070437978257494064504146718372095872819969887408622112906108590961892923178192792218161103488204912792358327748493857104191029765218471874759376809136402361582721860433355338373725980783308091544879562698835405262108188595630215081260699112737457564998798692048522706388318528370551365364702529068656665853097899157141017378975007689790000067275142731212069030175682911154288533716549782283859340452266837760560153014200605378914071410125895494331253564598702942990036163269043699029806343766286247742865671 c = 6269656777204332618433779865483197625538144405832409880710764183039800286008967127279281167109250083159801218370191973055663058165456565194979210256278526713608759141588082614531352489547674696723140599892318118960648862531538435596775798128845789504910467783731144808685373807716609662688064728614003904579841055786083326311313295311152563668422289435606771091246147867715987583149743032723028324394173498623642539175178996531881058274717907066845565199058931743481410454382746158558886667761300257488769795092777021292335562818583719708133179974425584610403335487082478848975656282384575767178925517257692365828720 ''' import gmpy2 import libnum
import gmpy2 from Crypto.Util.number import getPrime,long_to_bytes e1 = 2767 e2 = 3659 n = 21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111 c1 = 20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599 c2 = 11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227 _,s1, s2 = gmpy2.gcdext(e1, e2) m = pow(c1, s1, n) * pow(c2, s2, n) % n print(long_to_bytes(m))
6.dp泄露(提供dp,e,n,c)
dp=d%(p-1)通过爆破k的方式来求出p
1 2 3 4 5 6 7
d = dp + k1 * (p-1) d * e = 1 + k2(p-1)(q-1) 把第二个式子的d代换掉: e * (dp + k1(p-1)) = 1 + k2(p-1)(q-1) 两边同时对(p-1)取模,消去k e * dp % (p - 1) = 1 e * dp = 1 + k(p - 1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import gmpy2 from Crypto.Util.number import long_to_bytes e = 65537 n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657 c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751 for i inrange(1, e): if (dp * e - 1) % i == 0: if n % (((dp * e - 1) // i) + 1) == 0: p = ((dp * e - 1) // i) + 1 q = n // (((dp * e - 1) // i) + 1) d = gmpy2.invert(e, (p-1)*(q-1)) m = pow(c, d, n) print(m) print(long_to_bytes(m))
import gmpy2 import libnum n = c = e = 2 # 在线 分解 n p = q = inv_p = gmpy2.invert(p, q) inv_q = gmpy2.invert(q, p) mp = pow(c, (p + 1) // 4, p) mq = pow(c, (q + 1) // 4, q) a = (inv_p * p * mq + inv_q * q * mp) % n b = n - int(a) c = (inv_p * p * mq - inv_q * q * mp) % n d = n - int(c) # rabin 加密有四种结果 aa = [a, b, c, d] for i in aa: ifb'flag'in libnum.n2s(int(i)): print(libnum.n2s(int(i)))
10.e特别大
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import getPrime
withopen("flag.txt","rb") as fs: flag = fs.read().strip()
p = getPrime(1024) q = getPrime(1024) n = p * q e = 0x609778981bfbb26bb93398cb6d96984616a6ab08ade090c1c0d4fedb00f44f0552a1555efec5cc66e7960b61e94e80e7483b9f906a6c8155a91cdc3e4917fa5347c58a2bc85bb160fcf7fe98e3645cfea8458ea209e565e4eb72ee7cbb232331a862d8a84d91a0ff6d74aa3c779b2b129c3d8148b090c4193234764f2e5d9b2170a9b4859501d07c0601cdd18616a0ab2cf713a7c785fd06f27d68dff24446d884644e08f31bd37ecf48750e4324f959a8d37c5bef25e1580851646d57b3d4f525bc04c7ddafdf146539a84703df2161a0da7a368675f473065d2cb661907d990ba4a8451b15e054bfc4dd73e134f3bf7d8fa4716125d8e21f946d16b7b0fc43 m = int.from_bytes(flag,"big") c = pow(m,e,n)
defhack_RSA(e,n): ''' Finds d knowing (e,n) applying the Wiener continued fraction attack ''' frac = ContinuedFractions.rational_to_contfrac(e, n) convergents = ContinuedFractions.convergents_from_contfrac(frac) for (k,d) in convergents: #check if d is actually the key if k!=0and (e*d-1)%k == 0: phi = (e*d-1)//k s = n - phi + 1 # check if the equation x^2 - s*x + n = 0 # has integer roots discr = s*s - 4*n if(discr>=0): t = Arithmetic.is_perfect_square(discr) if t!=-1and (s+t)%2==0: print("Hacked!") return d
# TEST functions
deftest_hack_RSA(): # print("Testing Wiener Attack") # times = 5 # while(times>0): # e,n,d = RSAvulnerableKeyGenerator.generateKeys(1024) # print("(e,n) is (", e, ", ", n, ")") # print("d = ", d) n= e =
hacked_d = hack_RSA(e, n) ''' if d == hacked_d: print("Hack WORKED!") else: print("Hack FAILED") ''' print("hacked_d = ", hacked_d) print("-------------------------") #times -= 1 if __name__ == "__main__": #test_is_perfect_square() #print("-------------------------") test_hack_RSA()
from Crypto.Util.number import * from random import * from sage.allimport *
flag = b'--hidden_message--' data1 = getPrime(256) data2 = getPrime(256) m = bytes_to_long(flag)+data2 prec = 600 ring = RealField(prec) data3 = ring(data1) / ring(data2) print(data3)
whileTrue: p = randint(2**255, data1) q = randint(2**255, data2) if isPrime(p) and isPrime(q) and p!=q: break
n = p*q e = 65537 leak = pow(p-q, data1, data1*data2) c = pow(m, e, n) print(c) print(n) print(leak) ''' 1.42870767357206600351348423521722279489230609801270854618388981989800006431663026299563973511233193052826781891445323183272867949279044062899046090636843802841647378505716932999588 1046004343125860480395943301139616023280829254329678654725863063418699889673392326217271296276757045957276728032702540618505554297509654550216963442542837 2793178738709511429126579729911044441751735205348276931463015018726535495726108249975831474632698367036712812378242422538856745788208640706670735195762517 1788304673303043190942544050868817075702755835824147546758319150900404422381464556691646064734057970741082481134856415792519944511689269134494804602878628 '''
①连分数修复num1/num2
求解data1和data2想到的是应用连分数攻击,找到分子分母256bit的渐进分数逼近data3
1 2 3 4 5 6 7 8 9
#sage data3=
c = continued_fraction(data3) alist = c.convergents() for i in alist: a = str(i).split('/') iflen(a)>1and gcd(int(a[0]),int(a[1])) == 1and is_prime(int(a[0])) and is_prime(int(a[1])) andint(a[0]).bit_length()==256andint(a[1]).bit_length()==256: print(a