defextended_gcd(a, b): """扩展欧几里得算法,用于计算最大公约数和贝祖系数""" if a == 0: return (b, 0, 1) else: g, y, x = extended_gcd(b % a, a) return (g, x - (b // a) * y, y)
defmodinv(a, m): """计算 a 的模 m 逆元""" g, x, y = extended_gcd(a, m) if g != 1: raise Exception('模逆元不存在') else: return x % m
defcalculate_private_key(e, phi_n): """计算 RSA 私钥 d""" d = modinv(e, phi_n) return d
# 示例使用 if __name__ == "__main__": # 假设我们已知 e 和 phi_n e = 19# 公钥指数 phi_n = 20# 欧拉函数值
# 计算私钥 d d = calculate_private_key(e, phi_n) print(f"RSA 私钥 d 是: {d}")
import gmpy2 import binascii from Crypto.Util.number import isPrime, sieve_base as primes
e = 3 n = 15911581555796798614711625288508309704791837516232122410440958830726078821069050404012820896260071751380436992710638364294658173571101596931605797509712839622479368850251206419748090059752427303611760004621378226431226983665746837779056271530181865648115862947527212787824629516204832313026456390047768174765687040950636530480549014401279054346098030395100387004111574278813749630986724706263655166289586230453975953773791945408589484679371854113457758157492241225180907090235116325034822993748409011554673180494306003272836905082473475046277554085737627846557240367696214081276345071055578169299060706794192776825039 c = 13908468332333567158469136439932325992349696889129103935400760239319454409539725389747059213835238373047899198211128689374049729578146875309231962936554403287882999967840346216695208424582739777034261079550395918048421086843927009452479936045850799096750074359160775182238980989229190157551197830879877097703347301072427149474991803868325769967332356950863518504965486565464059770451458557744949735282131727956056279292800694203866167270268988437389945703117070604488999247750139568614939965885211276821987586882908159585863514561191905040244967655444219603287214405014887994238259270716355378069726760953320025828158 #primes为前10000个素数的列表 #计算prd = ∏ primes prd = 1 for i in primes: prd *= i #p为(2^prd-1)和n的公约数 p = gmpy2.gcd(gmpy2.powmod(2,prd,n)-1,n) q = n // p d = gmpy2.invert(e,(p-1)*(q-1)) #计算私钥d m = gmpy2.powmod(c, d, n) #解密 print(m) flag = binascii.unhexlify(hex(m)[2:]) print(flag)
2.pqec型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import gmpy2 import libnum from Crypto.Util.number import * from binascii import a2b_hex, b2a_hex flag = "*****************" p=109935857933867829728985398563235455481120300859311421762540858762721955038310117609456763338082237907005937380873151279351831600225270995344096532750271070807051984097524900957809427861441436796934012393707770012556604479065826879107677002380580866325868240270494148512743861326447181476633546419262340100453 q=127587319253436643569312142058559706815497211661083866592534217079310497260365307426095661281103710042392775453866174657404985539066741684196020137840472950102380232067786400322600902938984916355631714439668326671310160916766472897536055371474076089779472372913037040153356437528808922911484049460342088834871 e=15218928658178 c=262739975753930281690942784321252339035906196846340713237510382364557685379543498765074448825799342194332681181129770046075018122033421983227887719610112028230603166527303021036386350781414447347150383783816869784006598225583375458609586450854602862569022571672049158809874763812834044257419199631217527367046624888837755311215081173386523806086783266198390289097231168172692326653657393522561741947951887577156666663584249108899327053951891486355179939770150550995812478327735917006194574412518819299303783243886962455399783601229227718787081785391010424030509937403600351414176138124705168002288620664809270046124 n = p * q phi = (p - 1) * (q - 1) d = gmpy2.invert(e, phi) m = pow(c, d, n) print(libnum.n2s(int(m)))
3.dp,dq泄露
dp,dq如何反导推出
推导过程太过于繁琐,我们只要清楚一件事,那就是
dp=d%(p-1)= e*dp=1+k(p-1)
dq=d%(q-1) e*dp=1+k(q-1)
根据上述的公式,对k进行爆破就可以得到p和q的值
1 2 3 4 5 6 7 8 9 10 11 12
import gmpy2 from Crypto.Util.number import long_to_bytes p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852 I = gmpy2.invert(q,p) m1 = pow(c,dp,p) m2 = pow(c,dq,q) m = (((m1-m2)*I)%p)*q+m2 print(long_to_bytes(m))
import gmpy2 from Crypto.Util.number import * e = 0x3 n = 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793 c = 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365 defde(c, e, n): k = 0 whileTrue: m = c + n*k result, flag = gmpy2.iroot(m, e) ifTrue == flag: return result k += 1 m=de(c,e,n) print(long_to_bytes(m))
import gmpy2 import binascii #利用中国剩余定理求解同余方程,aList:余数,mList:模数 defCRT(aList, mList): M = 1 for i in mList: M = M * i #计算M = ∏ mi #print(M) x = 0 for i inrange(len(mList)): Mi = M // mList[i] #计算Mi Mi_inverse = gmpy2.invert(Mi, mList[i]) #计算Mi的逆元 x += aList[i] * Mi * Mi_inverse #构造x各项 x = x % M return x if __name__ == "__main__": #========== n c ========== n1 = "636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163" c1 = "310020004234033304244200421414413320341301002123030311202340222410301423440312412440240244110200112141140201224032402232131204213012303204422003300004011434102141321223311243242010014140422411342304322201241112402132203101131221223004022003120002110230023341143201404311340311134230140231412201333333142402423134333211302102413111111424430032440123340034044314223400401224111323000242234420441240411021023100222003123214343030122032301042243" n2 = "302240000040421410144422133334143140011011044322223144412002220243001141141114123223331331304421113021231204322233120121444434210041232214144413244434424302311222143224402302432102242132244032010020113224011121043232143221203424243134044314022212024343100042342002432331144300214212414033414120004344211330224020301223033334324244031204240122301242232011303211220044222411134403012132420311110302442344021122101224411230002203344140143044114" c2 = "112200203404013430330214124004404423210041321043000303233141423344144222343401042200334033203124030011440014210112103234440312134032123400444344144233020130110134042102220302002413321102022414130443041144240310121020100310104334204234412411424420321211112232031121330310333414423433343322024400121200333330432223421433344122023012440013041401423202210124024431040013414313121123433424113113414422043330422002314144111134142044333404112240344" n3 = "332200324410041111434222123043121331442103233332422341041340412034230003314420311333101344231212130200312041044324431141033004333110021013020140020011222012300020041342040004002220210223122111314112124333211132230332124022423141214031303144444134403024420111423244424030030003340213032121303213343020401304243330001314023030121034113334404440421242240113103203013341231330004332040302440011324004130324034323430143102401440130242321424020323" c3 = "10013444120141130322433204124002242224332334011124210012440241402342100410331131441303242011002101323040403311120421304422222200324402244243322422444414043342130111111330022213203030324422101133032212042042243101434342203204121042113212104212423330331134311311114143200011240002111312122234340003403312040401043021433112031334324322123304112340014030132021432101130211241134422413442312013042141212003102211300321404043012124332013240431242" cList = [int(c1,5), int(c2,5), int(c3,5)] nList = [int(n1,5), int(n2,5), int(n3,5)] m_e = CRT(cList, nList) #计算m^e for e inrange(1, 10): #遍历e求解 m, f = gmpy2.iroot(m_e, e) #m_e开e次根 print("加密指数e = %d:"%e) m = hex(m)[2:] iflen(m)%2 == 1: m = m + '0'#binascii.unhexlify()参数长度必须为偶数,因此做一下处理 flag = binascii.unhexlify(m) print(flag)
from sympy import nextprime from Crypto.Util.number import * from gmpy2 import invert defget_p_q(A,B): tmp = 1 # calculate remain value (mod A) of (A−1)(A−2)(A−3)...(B+1) for i inrange(B+1,A-1): tmp *= i tmp %= A tmp_inv = invert(tmp,A) result = nextprime(tmp_inv) return result A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407 B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596 A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927 B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026 n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733 e=0x1001 c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428 p = get_p_q(A1,B1) q = get_p_q(A2,B2) print(p) print(q) # p = 1276519424397216455160791032620569392845781005616561979809403385593761615670426423039762716291920053306063214548359656555809123127361539475238435285654851 # q = 13242175493583584108411324143773780862426183382017753129633978933213674770487765387985282956574197274056162861584407275172775868763712231230219112670015751 r = n // p // q print(r) # r = 5057572094237208127867754008134739503717927865750318894982404287656747895573075881186030840558129423864679886646066477437020450654848839861455661385205433 phn = (p - 1) * (q - 1) * (r - 1) d = invert(e, phn) print(d) # d = 23245991568931089935575398139533179902151911325504278186895368123724684132878362590745372016987963378102056924287587028702166372731411906405181410326380814220943063812165970658883369631308421395770179828382024820676516261188276456737434776404340381374859304944884947772697915445301641449023374627214573292539161320959779418043275889202421521069705878414823578781441160766914068377017428380775625886023385019623499784980822629415795884228504498888092721097658433 m = pow(c,d,n) print(m) # 49562188096458630410563044417358818341913265571373725266976612126526106528404944745044614126232074073813936259453 print(long_to_bytes(m))
import gmpy2 from Crypto.Util.number import long_to_bytes import sympy base = 65537 P_p=206027926847308612719677572554991143421 P_factor=213671742765908980787116579976289600595864704574134469173111790965233629909513884704158446946409910475727584342641848597858942209151114627306286393390259700239698869487469080881267182803062488043469138252786381822646126962323295676431679988602406971858136496624861228526070581338082202663895710929460596143281673761666804565161435963957655012011051936180536581488499059517946308650135300428672486819645279969693519039407892941672784362868653243632727928279698588177694171797254644864554162848696210763681197279758130811723700154618280764123396312330032986093579531909363210692564988076206283296967165522152288770019720928264542910922693728918198338839 Q_1=103766439849465588084625049495793857634556517064563488433148224524638105971161051763127718438062862548184814747601299494052813662851459740127499557785398714481909461631996020048315790167967699932967974484481209879664173009585231469785141628982021847883945871201430155071257803163523612863113967495969578605521 Q_2=151010734276916939790591461278981486442548035032350797306496105136358723586953123484087860176438629843688462671681777513652947555325607414858514566053513243083627810686084890261120641161987614435114887565491866120507844566210561620503961205851409386041194326728437073995372322433035153519757017396063066469743 sub_Q=168992529793593315757895995101430241994953638330919314800130536809801824971112039572562389449584350643924391984800978193707795909956472992631004290479273525116959461856227262232600089176950810729475058260332177626961286009876630340945093629959302803189668904123890991069113826241497783666995751391361028949651 Ciphertext = 1709187240516367141460862187749451047644094885791761673574674330840842792189795049968394122216854491757922647656430908587059997070488674220330847871811836724541907666983042376216411561826640060734307013458794925025684062804589439843027290282034999617915124231838524593607080377300985152179828199569474241678651559771763395596697140206072537688129790126472053987391538280007082203006348029125729650207661362371936196789562658458778312533505938858959644541233578654340925901963957980047639114170033936570060250438906130591377904182111622236567507022711176457301476543461600524993045300728432815672077399879668276471832 _Q=pow(sub_Q , Q_2 , Q_1) Q= sympy.nextprime(_Q) # print("Q: ", Q) defp_Prime(p): whileTrue: p=p-2 if sympy.isprime(p)==1: return p P = [0for i inrange(17)] P[9]=P_p for i inrange(10,17): P[i]=sympy.nextprime(P[i-1]) for i inrange(9,0,-1): P[i-1]=p_Prime(P[i]) n=1 for i inrange(17): n*=P[i] phi=1 for i inrange(17): phi*=P[i]-1 d=gmpy2.invert(base,phi) P_1=pow(P_factor,d,n) P=sympy.nextprime(P_1) Phi=(P-1)*(Q-1) N=P*Q D=gmpy2.invert(base,Phi) flag=pow(Ciphertext,D,N) print(long_to_bytes(flag))