当前位置: 代码迷 >> 综合 >> Crypto_[De1CTF2019]babyrsa
  详细解决方案

Crypto_[De1CTF2019]babyrsa

热度:46   发布时间:2023-11-21 23:25:07.0

[De1CTF2019]babyrsa

题目描述:

import binascii
from data import e1,e2,p,q1p,q1q,hint,flagn =  [20129615352491765499340112943188317180548761597861300847305827141510465619670536844634558246439230371658836928103063432870245707180355907194284861510906071265352409579441048101084995923962148527097370705452070577098780246282820065573711015664291991372085157016901209114191068574208680397710042842835940428451949500607613634682684113208766694028789275748528254287705759528498986306494267817198340658241873024800336013946294891687591013414935237821291805123285905335762719823771647853378892868896078424572232934360940672962436849523915563328779942134504499568866135266628078485232098208237036724121481835035731201383423L, 31221650155627849964466413749414700613823841060149524451234901677160009099014018926581094879840097248543411980533066831976617023676225625067854003317018794041723612556008471579060428898117790587991055681380408263382761841625714415879087478072771968160384909919958010983669368360788505288855946124159513118847747998656422521414980295212646675850690937883764000571667574381419144372824211798018586804674824564606122592483286575800685232128273820087791811663878057827386379787882962763290066072231248814920468264741654086011072638211075445447843691049847262485759393290853117072868406861840793895816215956869523289231421L, 29944537515397953361520922774124192605524711306753835303703478890414163510777460559798334313021216389356251874917792007638299225821018849648520673813786772452822809546571129816310207232883239771324122884804993418958309460009406342872173189008449237959577469114158991202433476710581356243815713762802478454390273808377430685157110095496727966308001254107517967559384019734279861840997239176254236069001453544559786063915970071130087811123912044312219535513880663913831358790376650439083660611831156205113873793106880255882114422025746986403355066996567909581710647746463994280444700922867397754748628425967488232530303L, 25703437855600135215185778453583925446912731661604054184163883272265503323016295700357253105301146726667897497435532579974951478354570415554221401778536104737296154316056314039449116386494323668483749833147800557403368489542273169489080222009368903993658498263905567516798684211462607069796613434661148186901892016282065916190920443378756167250809872483501712225782004396969996983057423942607174314132598421269169722518224478248836881076484639837343079324636997145199835034833367743079935361276149990997875905313642775214486046381368619638551892292787783137622261433528915269333426768947358552919740901860982679180791L]
c =  [19131432661217908470262338421299691998526157790583544156741981238822158563988520225986915234570037383888112724408392918113942721994125505014727545946133307329781747600302829588248042922635714391033431930411180545085316438084317927348705241927570432757892985091396044950085462429575440060652967253845041398399648442340042970814415571904057667028157512971079384601724816308078631844480110201787343583073815186771790477712040051157180318804422120472007636722063989315320863580631330647116993819777750684150950416298085261478841177681677867236865666207391847046483954029213495373613490690687473081930148461830425717614569L, 15341898433226638235160072029875733826956799982958107910250055958334922460202554924743144122170018355117452459472017133614642242411479849369061482860570279863692425621526056862808425135267608544855833358314071200687340442512856575278712986641573012456729402660597339609443771145347181268285050728925993518704899005416187250003304581230701444705157412790787027926810710998646191467130550713600765898234392350153965811595060656753711278308005193370936296124790772689433773414703645703910742193898471800081321469055211709339846392500706523670145259024267858368216902176489814789679472227343363035428541915118378163012031L, 18715065071648040017967211297231106538139985087685358555650567057715550586464814763683688299037897182845007578571401359061213777645114414642903077003568155508465819628553747173244235936586812445440095450755154357646737087071605811984163416590278352605433362327949048243722556262979909488202442530307505819371594747936223835233586945423522256938701002370646382097846105014981763307729234675737702252155130837154876831885888669150418885088089324534892506199724486783446267336789872782137895552509353583305880144947714110009893134162185382309992604435664777436197587312317224862723813510974493087450281755452428746194446L, 2282284561224858293138480447463319262474918847630148770112472703128549032592187797289965592615199709857879008271766433462032328498580340968871260189669707518557157836592424973257334362931639831072584824103123486522582531666152363874396482744561758133655406410364442174983227005501860927820871260711861008830120617056883514525798709601744088135999465598338635794275123149165498933580159945032363880613524921913023341209439657145962332213468573402863796920571812418200814817086234262280338221161622789516829363805084715652121739036183264026120868756523770196284142271849879003202190966150390061195469351716819539183797L]
f=lambda m,e,n,c:pow(m,e,n)==c
assert(sum(map(f,[p]*4,[4]*4,n,c))==4)ee1 = 42
ee2 = 3
ce1 =  45722651786340123946960815003059322528810481841378247280642868553607692149509126962872583037142461398806689489141741494974836882341505234255325683219092163052843461632338442529011502378931140356111756932712822516814023166068902569458299933391973504078898958921809723346229893913662577294963528318424676803942288386430172430880307619748186863890050113934573820505570928109017842647598266634344447182347849367714564686341871007505886728393751147033556889217604647355628557502208364412269944908011305064122941446516990168924709684092200183860653173856272384
ce2 =  13908468332333567158469136439932325992349696889129103935400760239319454409539725389747059213835238373047899198211128689374049729578146875309231962936554403287882999967840346216695208424582739777034261079550395918048421086843927009452479936045850799096750074359160775182238980989229190157551197830879877097703347301072427149474991803868325769967332356950863518504965486565464059770451458557744949735282131727956056279292800694203866167270268988437389945703117070604488999247750139568614939965885211276821987586882908159585863514561191905040244967655444219603287214405014887994238259270716355378069726760953320025828158
tmp =  864078778078609835167779565982540757684070450697854309005171742813414963447462554999012718960925081621571487444725528982424037419052194840720949809891134854871222612682162490991065015935449289960707882463387
n  =  15911581555796798614711625288508309704791837516232122410440958830726078821069050404012820896260071751380436992710638364294658173571101596931605797509712839622479368850251206419748090059752427303611760004621378226431226983665746837779056271530181865648115862947527212787824629516204832313026456390047768174765687040950636530480549014401279054346098030395100387004111574278813749630986724706263655166289586230453975953773791945408589484679371854113457758157492241225180907090235116325034822993748409011554673180494306003272836905082473475046277554085737627846557240367696214081276345071055578169299060706794192776825039
assert(pow(e1,ee1,n)==ce1)
assert(pow(e2+tmp,ee2,n)==ce2)e = 46531
n = 16278524034278364842964386062476113517067911891699789991355982121084973951738324063305190630865511554888330215827724887964565979607808294168282995825864982603759381323048907814961279012375346497781046417204954101076457350988751188332353062731641153547102721113593787978587135707313755661153376485647168543680503160420091693269984008764444291289486805840439906620313162344057956594836197521501755378387944609246120662335790110901623740990451586621846212047950084207251595169141015645449217847180683357626383565631317253913942886396494396189837432429078251573229378917400841832190737518763297323901586866664595327850603
c = 14992132140996160330967307558503117255626925777426611978518339050671013041490724616892634911030918360867974894371539160853827180596100892180735770688723270765387697604426715670445270819626709364566478781273676115921657967761494619448095207169386364541164659123273236874649888236433399127407801843412677293516986398190165291102109310458304626261648346825196743539220198199366711858135271877662410355585767124059539217274691606825103355310348607611233052725805236763220343249873849646219850954945346791015858261715967952461021650307307454434510851869862964236227932964442289459508441345652423088404453536608812799355469
hint=int(binascii.hexlify(hint),16)
assert(q1p*q1q==n)
assert(q1p<q1q)
assert(c==pow(hint,e,n))flag=int(binascii.hexlify(flag),16)
q1=q1p
q2 =  114401188227479584680884046151299704656920536168767132916589182357583461053336386996123783294932566567773695426689447410311969456458574731187512974868297092638677515283584994416382872450167046416573472658841627690987228528798356894803559278308702635288537653192098514966089168123710854679638671424978221959513
c1 =  262739975753930281690942784321252339035906196846340713237510382364557685379543498765074448825799342194332681181129770046075018122033421983227887719610112028230603166527303021036386350781414447347150383783816869784006598225583375458609586450854602862569022571672049158809874763812834044257419199631217527367046624888837755311215081173386523806086783266198390289097231168172692326653657393522561741947951887577156666663584249108899327053951891486355179939770150550995812478327735917006194574412518819299303783243886962455399783601229227718787081785391010424030509937403600351414176138124705168002288620664809270046124
c2 =  7395591129228876649030819616685821899204832684995757724924450812977470787822266387122334722132760470911599176362617225218345404468270014548817267727669872896838106451520392806497466576907063295603746660003188440170919490157250829308173310715318925771643105064882620746171266499859049038016902162599261409050907140823352990750298239508355767238575709803167676810456559665476121149766947851911064706646506705397091626648713684511780456955453552020460909638016134124590438425738826828694773960514221910109473941451471431637903182205738738109429736425025621308300895473186381826756650667842656050416299166317372707709596
assert(c1==pow(flag,e1,p*q1))
assert(c2==pow(flag,e2,p*q2))

分析程序:

第一段:给出了多组n和c;其中的明文是最后一段的p

定义了一个函数 f f f

相当于四组 c ≡ p 4 ( m o d n ) c \equiv p^4~(mod~n) cp4 (mod n)?

应用中国剩余定理,直接解出明文p

p 4 = c 1 ? M 1 ? M 1 ′ + . . . + c 4 ? M 4 ? M 4 ′ ( m o d M ) p^4=c_1*M_1*M_{1'}+...+c_4*M_4*M_{4'}(mod~M) p4=c1??M1??M1?+...+c4??M4??M4?(mod M)

再对 p 4 p^4 p4开四次方即可

第二段:给出了两组e和c,还有共同的n;其中e很小;而加密的明文为最后一段的e1和e2,也就是说明文很大可能不会很长,而在这次加密中的指数e也很小,很有可能可以直接爆破出来明文

也就是 e 1 e e 1 = c e 1 + k 1 ? n e1^{ee1} =ce1 +k_1*n e1ee1=ce1+k1??n? e 2 e e 2 = c e 2 + k 2 ? n e2^{ee2} =ce2 +k_2*n e2ee2=ce2+k2??n?

爆破 k 1 , k_1, k1?, k 2 k_2 k2?;使 c e 2 + k 2 ? n ce2+k_2*n ce2+k2??n满足能被开 e e 2 ee2 ee2次方,同理 e 1 e1 e1;使用gmpy2.iroot()函数

得到明文 e 1 , e 2 e1,e2 e1e2

第三段:最后一段q1参与构成n;直接在线分解n factordb.com;

得到q1;试着把hint解出来了,但是hint没有用

hint: orz…you.found.me.but.sorry.no.hint…keep.on.and.enjoy.it!

第四段:终于明文是flag了;其中c1,c2,e1,e2和构成n的p和q1,q2均已知

进行正常的RSA求解;But!

这里的 e 1 , e 2 e1,e2 e1e2和对应的 f a i ( n ) fai(n) fai(n)不互质;求得他们之间的最大公因数 c o m 1 = c o m 2 = 14 com1=com2=14 com1=com2=14?

先让 e 1 , e 2 e1,e2 e1,e2除以 c o m 1 , c o m 2 com1,com2 com1,com2

再求解 d 1 , d 2 d1,d2 d1,d2

这时求得的是 m c o m m^{com} mcom

推导一下:

c ≡ m e ( m o d n ) c\equiv m^e(mod~n) cme(mod n)

d ? e ≡ 1 ( m o d n ) d*e\equiv 1(mod~n) d?e1(mod n)?

而e不是素数;可以分解成 a , b a,b a,b,其中 a a a f a i ( n ) fai(n) fai(n)互质

而此时实际上是 d ? a ? b ≡ 1 ( m o d f a i ( n ) ) d*a*b\equiv 1(mod~fai(n)) d?a?b1(mod fai(n))

所以 c d ? b ≡ m d ? b ? a ? b ≡ m b ( m o d f a i ( n ) ) c^{d*b}\equiv m^{d*b*a*b}\equiv m^{b}(mod~fai(n)) cd?bmd?b?a?bmb(mod fai(n))

也就是说使用 e / c o m e/com e/com?求得的 d d d?进而求得的是 m c o m ( m o d n ) m^{com}(mod~n) mcom(mod n);写作 a 1 , a 2 a_1,a_2 a1?,a2??

我们现在有两个同余式:

m 14 ≡ a 1 ( m o d n 1 ) m^{14}\equiv a_1~(mod~n1) m14a1? (mod n1)

m 14 ≡ a 2 ( m o d n 2 ) m^{14}\equiv a_2(~mod~n2) m14a2?( mod n2)

其中指数为14,相比3太大了,要是暴力破解或者直接开方是不可能的;

再使用中国剩余定理分解模数:

m 14 ≡ a 1 ( m o d p ) m^{14}\equiv a_1~(mod~p) m14a1? (mod p)?

m 14 ≡ a 1 ( m o d q 1 ) m^{14}\equiv a_1(~mod~q1) m14a1?( mod q1)?

m 14 ≡ a 2 ( m o d p ) m^{14}\equiv a_2(~mod~p) m14a2?( mod p)

m 14 ≡ a 2 ( m o d q 2 ) m^{14}\equiv a_2(~mod~q2) m14a2?( mod q2)

这里转换思维(偷个懒)这里使用中国剩余定理求出来的 m m m不是我们需要的明文

取其中两个等式:

m 14 ≡ a 1 ( m o d q 1 ) m^{14}\equiv a_1(~mod~q1) m14a1?( mod q1)

m 14 ≡ a 2 ( m o d q 2 ) m^{14}\equiv a_2(~mod~q2) m14a2?( mod q2)

为什么不取另外两个等式呢?因为另外两个等式的模数的欧拉函数 p ? 1 p-1 p?1 7 7 7不互素(之后要用到)

把这两个等式分别看作另外一个RSA加密公式;进行解密;这个时候 m m m的指数14依然与 q 1 , q 2 q1,q2 q1,q2不是互素的;但是可以把14看作 2 ? 7 2*7 2?7这样 7 7 7?就被当做e进行正常的RSA求解,同理于之前化简 m c o m m^{com} mcom

得到

m 2 ≡ b 1 ( m o d q 1 ) m^2\equiv b_1(mod~q1) m2b1?(mod q1)

m 2 ≡ b 2 ( m o d q 2 ) m^2\equiv b_2(mod~q2) m2b2?(mod q2)

试了试直接开方 b 1 , b 2 b_1,b_2 b1?,b2?但是得到m不是我们要的

但实际上m是同时满足这两个等式,那我们就把这两个等式合并

继续使用中国剩余定理进行等式合并

得到的 m 2 m^2 m2进行开方,得到flag

代码实现:

from Crypto.Util.number import *
import gmpy2n =  [20129615352491765499340112943188317180548761597861300847305827141510465619670536844634558246439230371658836928103063432870245707180355907194284861510906071265352409579441048101084995923962148527097370705452070577098780246282820065573711015664291991372085157016901209114191068574208680397710042842835940428451949500607613634682684113208766694028789275748528254287705759528498986306494267817198340658241873024800336013946294891687591013414935237821291805123285905335762719823771647853378892868896078424572232934360940672962436849523915563328779942134504499568866135266628078485232098208237036724121481835035731201383423, 31221650155627849964466413749414700613823841060149524451234901677160009099014018926581094879840097248543411980533066831976617023676225625067854003317018794041723612556008471579060428898117790587991055681380408263382761841625714415879087478072771968160384909919958010983669368360788505288855946124159513118847747998656422521414980295212646675850690937883764000571667574381419144372824211798018586804674824564606122592483286575800685232128273820087791811663878057827386379787882962763290066072231248814920468264741654086011072638211075445447843691049847262485759393290853117072868406861840793895816215956869523289231421 , 29944537515397953361520922774124192605524711306753835303703478890414163510777460559798334313021216389356251874917792007638299225821018849648520673813786772452822809546571129816310207232883239771324122884804993418958309460009406342872173189008449237959577469114158991202433476710581356243815713762802478454390273808377430685157110095496727966308001254107517967559384019734279861840997239176254236069001453544559786063915970071130087811123912044312219535513880663913831358790376650439083660611831156205113873793106880255882114422025746986403355066996567909581710647746463994280444700922867397754748628425967488232530303, 25703437855600135215185778453583925446912731661604054184163883272265503323016295700357253105301146726667897497435532579974951478354570415554221401778536104737296154316056314039449116386494323668483749833147800557403368489542273169489080222009368903993658498263905567516798684211462607069796613434661148186901892016282065916190920443378756167250809872483501712225782004396969996983057423942607174314132598421269169722518224478248836881076484639837343079324636997145199835034833367743079935361276149990997875905313642775214486046381368619638551892292787783137622261433528915269333426768947358552919740901860982679180791]
c =  [19131432661217908470262338421299691998526157790583544156741981238822158563988520225986915234570037383888112724408392918113942721994125505014727545946133307329781747600302829588248042922635714391033431930411180545085316438084317927348705241927570432757892985091396044950085462429575440060652967253845041398399648442340042970814415571904057667028157512971079384601724816308078631844480110201787343583073815186771790477712040051157180318804422120472007636722063989315320863580631330647116993819777750684150950416298085261478841177681677867236865666207391847046483954029213495373613490690687473081930148461830425717614569, 15341898433226638235160072029875733826956799982958107910250055958334922460202554924743144122170018355117452459472017133614642242411479849369061482860570279863692425621526056862808425135267608544855833358314071200687340442512856575278712986641573012456729402660597339609443771145347181268285050728925993518704899005416187250003304581230701444705157412790787027926810710998646191467130550713600765898234392350153965811595060656753711278308005193370936296124790772689433773414703645703910742193898471800081321469055211709339846392500706523670145259024267858368216902176489814789679472227343363035428541915118378163012031 , 18715065071648040017967211297231106538139985087685358555650567057715550586464814763683688299037897182845007578571401359061213777645114414642903077003568155508465819628553747173244235936586812445440095450755154357646737087071605811984163416590278352605433362327949048243722556262979909488202442530307505819371594747936223835233586945423522256938701002370646382097846105014981763307729234675737702252155130837154876831885888669150418885088089324534892506199724486783446267336789872782137895552509353583305880144947714110009893134162185382309992604435664777436197587312317224862723813510974493087450281755452428746194446, 2282284561224858293138480447463319262474918847630148770112472703128549032592187797289965592615199709857879008271766433462032328498580340968871260189669707518557157836592424973257334362931639831072584824103123486522582531666152363874396482744561758133655406410364442174983227005501860927820871260711861008830120617056883514525798709601744088135999465598338635794275123149165498933580159945032363880613524921913023341209439657145962332213468573402863796920571812418200814817086234262280338221161622789516829363805084715652121739036183264026120868756523770196284142271849879003202190966150390061195469351716819539183797]
e = 4
# 中国剩余定理
sum_n = 1
rev_n = []
ni = []
m = 0
for i in n:sum_n = sum_n * i
for i in n:temp = sum_n//ini.append(temp)rev_n.append(gmpy2.invert(temp,i))
for i in range(len(n)):m += c[i]*rev_n[i]*ni[i] % sum_n
p = gmpy2.iroot(m%sum_n,e)[0]
print(p)ee1 = 42
ee2 = 3
ce1 =  45722651786340123946960815003059322528810481841378247280642868553607692149509126962872583037142461398806689489141741494974836882341505234255325683219092163052843461632338442529011502378931140356111756932712822516814023166068902569458299933391973504078898958921809723346229893913662577294963528318424676803942288386430172430880307619748186863890050113934573820505570928109017842647598266634344447182347849367714564686341871007505886728393751147033556889217604647355628557502208364412269944908011305064122941446516990168924709684092200183860653173856272384
ce2 =  13908468332333567158469136439932325992349696889129103935400760239319454409539725389747059213835238373047899198211128689374049729578146875309231962936554403287882999967840346216695208424582739777034261079550395918048421086843927009452479936045850799096750074359160775182238980989229190157551197830879877097703347301072427149474991803868325769967332356950863518504965486565464059770451458557744949735282131727956056279292800694203866167270268988437389945703117070604488999247750139568614939965885211276821987586882908159585863514561191905040244967655444219603287214405014887994238259270716355378069726760953320025828158
tmp =  864078778078609835167779565982540757684070450697854309005171742813414963447462554999012718960925081621571487444725528982424037419052194840720949809891134854871222612682162490991065015935449289960707882463387
n  =  15911581555796798614711625288508309704791837516232122410440958830726078821069050404012820896260071751380436992710638364294658173571101596931605797509712839622479368850251206419748090059752427303611760004621378226431226983665746837779056271530181865648115862947527212787824629516204832313026456390047768174765687040950636530480549014401279054346098030395100387004111574278813749630986724706263655166289586230453975953773791945408589484679371854113457758157492241225180907090235116325034822993748409011554673180494306003272836905082473475046277554085737627846557240367696214081276345071055578169299060706794192776825039
# 暴力破解k的值
def force(ee,ce,n):k = 0while True:temp = ce + k*nif gmpy2.iroot(temp,ee)[1]:return gmpy2.iroot(temp,ee)[0]k = k + 1
e1 = force(ee1,ce1,n)
# print(e1)
e2 = force(ee2,ce2,n) - tmp
# print(e2)p_ = 127587319253436643569312142058559706815497211661083866592534217079310497260365307426095661281103710042392775453866174657404985539066741684196020137840472950102380232067786400322600902938984916355631714439668326671310160916766472897536055371474076089779472372913037040153356437528808922911484049460342088834871
# 求hint的过程
# q_ = 127587319253436643569312142058559706815497211661083866592534217079310497260365307426095661281103710042392775453866174657404985539066741684196020137840472950102380232067786400322600902938984916355631714439668326671310160916766472897536055371474076089779472372913037040153356437528808922911484049460342088835693
# c = 14992132140996160330967307558503117255626925777426611978518339050671013041490724616892634911030918360867974894371539160853827180596100892180735770688723270765387697604426715670445270819626709364566478781273676115921657967761494619448095207169386364541164659123273236874649888236433399127407801843412677293516986398190165291102109310458304626261648346825196743539220198199366711858135271877662410355585767124059539217274691606825103355310348607611233052725805236763220343249873849646219850954945346791015858261715967952461021650307307454434510851869862964236227932964442289459508441345652423088404453536608812799355469
# fai_n = (p_-1)*(q_-1)
# e = 46531
# d = gmpy2.invert(e,fai_n)
# n = p_*q_
# m = pow(c,d,n)
# print(long_to_bytes(m))
q1 = p_q2 =  114401188227479584680884046151299704656920536168767132916589182357583461053336386996123783294932566567773695426689447410311969456458574731187512974868297092638677515283584994416382872450167046416573472658841627690987228528798356894803559278308702635288537653192098514966089168123710854679638671424978221959513
c1 =  262739975753930281690942784321252339035906196846340713237510382364557685379543498765074448825799342194332681181129770046075018122033421983227887719610112028230603166527303021036386350781414447347150383783816869784006598225583375458609586450854602862569022571672049158809874763812834044257419199631217527367046624888837755311215081173386523806086783266198390289097231168172692326653657393522561741947951887577156666663584249108899327053951891486355179939770150550995812478327735917006194574412518819299303783243886962455399783601229227718787081785391010424030509937403600351414176138124705168002288620664809270046124
c2 =  7395591129228876649030819616685821899204832684995757724924450812977470787822266387122334722132760470911599176362617225218345404468270014548817267727669872896838106451520392806497466576907063295603746660003188440170919490157250829308173310715318925771643105064882620746171266499859049038016902162599261409050907140823352990750298239508355767238575709803167676810456559665476121149766947851911064706646506705397091626648713684511780456955453552020460909638016134124590438425738826828694773960514221910109473941451471431637903182205738738109429736425025621308300895473186381826756650667842656050416299166317372707709596
fai_n1 = (p-1)*(q1-1)
fai_n2 = (p-1)*(q2-1)
com1 = gmpy2.gcd(e1,fai_n1)
com2 = gmpy2.gcd(e2,fai_n2)d1 = gmpy2.invert(e1//com1,(p-1)*(q1-1))
d2 = gmpy2.invert(e2//com2,(p-1)*(q2-1))a1 = pow(c1,d1,p*q1) #同余于m**14
a2 = pow(c2,d2,p*q2)
d1_ = gmpy2.invert(7,(q1-1)) #q1的欧拉函数等于(q1-1);同理q2
d2_ = gmpy2.invert(7,(q2-1))
b1 = pow(a1,d1_,q1) #同余于m**2
b2 = pow(a2,d2_,q2)
#进行中国剩余定理合并等式
M = q1*q2
M1 = q2
M2 = q1
rev_M1 = gmpy2.invert(M1,q1)
rev_M2 = gmpy2.invert(M2,q2)
m = (b1*M1*rev_M1 + b2*M2*rev_M2) % M
print(long_to_bytes(gmpy2.iroot(m,2)[0]))

思路来源:当中国剩余定理邂逅RSA - 安全客,安全资讯平台 (anquanke.com)