1. [De1CTF2019]babyrsa(综合rsa)

orz…

分步做:

1. 求p

n =  [20129615352491765499340112943188317180548761597861300847305827141510465619670536844634558246439230371658836928103063432870245707180355907194284861510906071265352409579441048101084995923962148527097370705452070577098780246282820065573711015664291991372085157016901209114191068574208680397710042842835940428451949500607613634682684113208766694028789275748528254287705759528498986306494267817198340658241873024800336013946294891687591013414935237821291805123285905335762719823771647853378892868896078424572232934360940672962436849523915563328779942134504499568866135266628078485232098208237036724121481835035731201383423, 31221650155627849964466413749414700613823841060149524451234901677160009099014018926581094879840097248543411980533066831976617023676225625067854003317018794041723612556008471579060428898117790587991055681380408263382761841625714415879087478072771968160384909919958010983669368360788505288855946124159513118847747998656422521414980295212646675850690937883764000571667574381419144372824211798018586804674824564606122592483286575800685232128273820087791811663878057827386379787882962763290066072231248814920468264741654086011072638211075445447843691049847262485759393290853117072868406861840793895816215956869523289231421, 29944537515397953361520922774124192605524711306753835303703478890414163510777460559798334313021216389356251874917792007638299225821018849648520673813786772452822809546571129816310207232883239771324122884804993418958309460009406342872173189008449237959577469114158991202433476710581356243815713762802478454390273808377430685157110095496727966308001254107517967559384019734279861840997239176254236069001453544559786063915970071130087811123912044312219535513880663913831358790376650439083660611831156205113873793106880255882114422025746986403355066996567909581710647746463994280444700922867397754748628425967488232530303, 25703437855600135215185778453583925446912731661604054184163883272265503323016295700357253105301146726667897497435532579974951478354570415554221401778536104737296154316056314039449116386494323668483749833147800557403368489542273169489080222009368903993658498263905567516798684211462607069796613434661148186901892016282065916190920443378756167250809872483501712225782004396969996983057423942607174314132598421269169722518224478248836881076484639837343079324636997145199835034833367743079935361276149990997875905313642775214486046381368619638551892292787783137622261433528915269333426768947358552919740901860982679180791]
c =  [19131432661217908470262338421299691998526157790583544156741981238822158563988520225986915234570037383888112724408392918113942721994125505014727545946133307329781747600302829588248042922635714391033431930411180545085316438084317927348705241927570432757892985091396044950085462429575440060652967253845041398399648442340042970814415571904057667028157512971079384601724816308078631844480110201787343583073815186771790477712040051157180318804422120472007636722063989315320863580631330647116993819777750684150950416298085261478841177681677867236865666207391847046483954029213495373613490690687473081930148461830425717614569, 15341898433226638235160072029875733826956799982958107910250055958334922460202554924743144122170018355117452459472017133614642242411479849369061482860570279863692425621526056862808425135267608544855833358314071200687340442512856575278712986641573012456729402660597339609443771145347181268285050728925993518704899005416187250003304581230701444705157412790787027926810710998646191467130550713600765898234392350153965811595060656753711278308005193370936296124790772689433773414703645703910742193898471800081321469055211709339846392500706523670145259024267858368216902176489814789679472227343363035428541915118378163012031, 18715065071648040017967211297231106538139985087685358555650567057715550586464814763683688299037897182845007578571401359061213777645114414642903077003568155508465819628553747173244235936586812445440095450755154357646737087071605811984163416590278352605433362327949048243722556262979909488202442530307505819371594747936223835233586945423522256938701002370646382097846105014981763307729234675737702252155130837154876831885888669150418885088089324534892506199724486783446267336789872782137895552509353583305880144947714110009893134162185382309992604435664777436197587312317224862723813510974493087450281755452428746194446, 2282284561224858293138480447463319262474918847630148770112472703128549032592187797289965592615199709857879008271766433462032328498580340968871260189669707518557157836592424973257334362931639831072584824103123486522582531666152363874396482744561758133655406410364442174983227005501860927820871260711861008830120617056883514525798709601744088135999465598338635794275123149165498933580159945032363880613524921913023341209439657145962332213468573402863796920571812418200814817086234262280338221161622789516829363805084715652121739036183264026120868756523770196284142271849879003202190966150390061195469351716819539183797]
f=lambda m,e,n,c:pow(m,e,n)==c
assert(sum(map(f,[p]*4,[4]*4,n,c))==4)

四对n,c,中国剩余定理(懒得写函数了……

这里以防万一求了一下n的最大公因数,发现他们互质所以他们四个的最小公倍数就是乘积

n =  [20129615352491765499340112943188317180548761597861300847305827141510465619670536844634558246439230371658836928103063432870245707180355907194284861510906071265352409579441048101084995923962148527097370705452070577098780246282820065573711015664291991372085157016901209114191068574208680397710042842835940428451949500607613634682684113208766694028789275748528254287705759528498986306494267817198340658241873024800336013946294891687591013414935237821291805123285905335762719823771647853378892868896078424572232934360940672962436849523915563328779942134504499568866135266628078485232098208237036724121481835035731201383423, 31221650155627849964466413749414700613823841060149524451234901677160009099014018926581094879840097248543411980533066831976617023676225625067854003317018794041723612556008471579060428898117790587991055681380408263382761841625714415879087478072771968160384909919958010983669368360788505288855946124159513118847747998656422521414980295212646675850690937883764000571667574381419144372824211798018586804674824564606122592483286575800685232128273820087791811663878057827386379787882962763290066072231248814920468264741654086011072638211075445447843691049847262485759393290853117072868406861840793895816215956869523289231421, 29944537515397953361520922774124192605524711306753835303703478890414163510777460559798334313021216389356251874917792007638299225821018849648520673813786772452822809546571129816310207232883239771324122884804993418958309460009406342872173189008449237959577469114158991202433476710581356243815713762802478454390273808377430685157110095496727966308001254107517967559384019734279861840997239176254236069001453544559786063915970071130087811123912044312219535513880663913831358790376650439083660611831156205113873793106880255882114422025746986403355066996567909581710647746463994280444700922867397754748628425967488232530303, 25703437855600135215185778453583925446912731661604054184163883272265503323016295700357253105301146726667897497435532579974951478354570415554221401778536104737296154316056314039449116386494323668483749833147800557403368489542273169489080222009368903993658498263905567516798684211462607069796613434661148186901892016282065916190920443378756167250809872483501712225782004396969996983057423942607174314132598421269169722518224478248836881076484639837343079324636997145199835034833367743079935361276149990997875905313642775214486046381368619638551892292787783137622261433528915269333426768947358552919740901860982679180791]
c =  [19131432661217908470262338421299691998526157790583544156741981238822158563988520225986915234570037383888112724408392918113942721994125505014727545946133307329781747600302829588248042922635714391033431930411180545085316438084317927348705241927570432757892985091396044950085462429575440060652967253845041398399648442340042970814415571904057667028157512971079384601724816308078631844480110201787343583073815186771790477712040051157180318804422120472007636722063989315320863580631330647116993819777750684150950416298085261478841177681677867236865666207391847046483954029213495373613490690687473081930148461830425717614569, 15341898433226638235160072029875733826956799982958107910250055958334922460202554924743144122170018355117452459472017133614642242411479849369061482860570279863692425621526056862808425135267608544855833358314071200687340442512856575278712986641573012456729402660597339609443771145347181268285050728925993518704899005416187250003304581230701444705157412790787027926810710998646191467130550713600765898234392350153965811595060656753711278308005193370936296124790772689433773414703645703910742193898471800081321469055211709339846392500706523670145259024267858368216902176489814789679472227343363035428541915118378163012031, 18715065071648040017967211297231106538139985087685358555650567057715550586464814763683688299037897182845007578571401359061213777645114414642903077003568155508465819628553747173244235936586812445440095450755154357646737087071605811984163416590278352605433362327949048243722556262979909488202442530307505819371594747936223835233586945423522256938701002370646382097846105014981763307729234675737702252155130837154876831885888669150418885088089324534892506199724486783446267336789872782137895552509353583305880144947714110009893134162185382309992604435664777436197587312317224862723813510974493087450281755452428746194446, 2282284561224858293138480447463319262474918847630148770112472703128549032592187797289965592615199709857879008271766433462032328498580340968871260189669707518557157836592424973257334362931639831072584824103123486522582531666152363874396482744561758133655406410364442174983227005501860927820871260711861008830120617056883514525798709601744088135999465598338635794275123149165498933580159945032363880613524921913023341209439657145962332213468573402863796920571812418200814817086234262280338221161622789516829363805084715652121739036183264026120868756523770196284142271849879003202190966150390061195469351716819539183797]
plus = 1
for i in n:plus *= i
plus_0 = plus // n[0]
basic_0 = c[0] * (gmpy2.invert(plus_0, n[0])) * plus_0
plus_1 = plus // n[1]
basic_1 = c[1] * (gmpy2.invert(plus_1, n[1])) * plus_1
plus_2 = plus // n[2]
basic_2 = c[2] * (gmpy2.invert(plus_2, n[2])) * plus_2
plus_3 = plus // n[3]
basic_3 = c[3] * (gmpy2.invert(plus_3, n[3])) * plus_3
basic = (basic_0 + basic_1 + basic_2 + basic_3) % plus
# print(plus)
# print(basic)
p = gmpy2.iroot(basic, 4)[0]
# print(p)

2. 求e1,e2

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)

这里ee2 = 3,可以直接爆破开方求得e2(记得最后结果减去tmp)

 for i in range(100000):if gmpy2.iroot(ce2 + i * n, ee2)[1]:print(i)print(gmpy2.iroot(ce2 + i * n, ee2)[0])
#e2 = 381791429275130

求e1的时候用了一个小技巧,由于ce1和n相差较大,所以有一种可能是ce1就是式子的余数(举个例子)

x = 3 mod 100000 求x
>> x = 3 or 100003 or 200003 or ……

尝试把ce1开ee1次方,发现可以成功开方

is_iroot = gmpy2.iroot(ce1, ee1)[1]
# True

所以开方后得到的数就是e1

e1 = gmpy2.iroot(ce1, ee1)[0]
# e1 = 15218928658178

3. hint没用!!!orz

4. 求flag

e = 46531
n = 16278524034278364842964386062476113517067911891699789991355982121084973951738324063305190630865511554888330215827724887964565979607808294168282995825864982603759381323048907814961279012375346497781046417204954101076457350988751188332353062731641153547102721113593787978587135707313755661153376485647168543680503160420091693269984008764444291289486805840439906620313162344057956594836197521501755378387944609246120662335790110901623740990451586621846212047950084207251595169141015645449217847180683357626383565631317253913942886396494396189837432429078251573229378917400841832190737518763297323901586866664595327850603
c = 14992132140996160330967307558503117255626925777426611978518339050671013041490724616892634911030918360867974894371539160853827180596100892180735770688723270765387697604426715670445270819626709364566478781273676115921657967761494619448095207169386364541164659123273236874649888236433399127407801843412677293516986398190165291102109310458304626261648346825196743539220198199366711858135271877662410355585767124059539217274691606825103355310348607611233052725805236763220343249873849646219850954945346791015858261715967952461021650307307454434510851869862964236227932964442289459508441345652423088404453536608812799355469
flag=int(binascii.hexlify(flag),16)
q1=q1p
# 将上面n分解就能求得q1p,结果为
# q1 = 127587319253436643569312142058559706815497211661083866592534217079310497260365307426095661281103710042392775453866174657404985539066741684196020137840472950102380232067786400322600902938984916355631714439668326671310160916766472897536055371474076089779472372913037040153356437528808922911484049460342088834871
q2 =  114401188227479584680884046151299704656920536168767132916589182357583461053336386996123783294932566567773695426689447410311969456458574731187512974868297092638677515283584994416382872450167046416573472658841627690987228528798356894803559278308702635288537653192098514966089168123710854679638671424978221959513
c1 =  262739975753930281690942784321252339035906196846340713237510382364557685379543498765074448825799342194332681181129770046075018122033421983227887719610112028230603166527303021036386350781414447347150383783816869784006598225583375458609586450854602862569022571672049158809874763812834044257419199631217527367046624888837755311215081173386523806086783266198390289097231168172692326653657393522561741947951887577156666663584249108899327053951891486355179939770150550995812478327735917006194574412518819299303783243886962455399783601229227718787081785391010424030509937403600351414176138124705168002288620664809270046124
c2 =  7395591129228876649030819616685821899204832684995757724924450812977470787822266387122334722132760470911599176362617225218345404468270014548817267727669872896838106451520392806497466576907063295603746660003188440170919490157250829308173310715318925771643105064882620746171266499859049038016902162599261409050907140823352990750298239508355767238575709803167676810456559665476121149766947851911064706646506705397091626648713684511780456955453552020460909638016134124590438425738826828694773960514221910109473941451471431637903182205738738109429736425025621308300895473186381826756650667842656050416299166317372707709596
assert(c1==pow(flag,e1,p*q1))
assert(c2==pow(flag,e2,p*q2))

但这里由于e和phin不互质,所以不能直接求

print(gmpy2.gcd(e1, (p - 1) * (q1 - 1)))
# 14
print(gmpy2.gcd(e2, (p - 1) * (q2 - 1)))
# 14

注意到他们的最大公因数都是14,所以分别将e // 14后就可以和phin互质了

最后记得对求得的new_m开方,才是原来的14次方

d1 = gmpy2.invert(e1 // 14, (p - 1) * (q1 - 1))
d2 = gmpy2.invert(e2 // 14, (p - 1) * (q2 - 1))
a1 = gmpy2.powmod(c1, d1, p * q1) % q1
a2 = gmpy2.powmod(c2, d2, p * q2) % q2
a = [a1, a2]
q = [q1, q2]
new_plus = q1 * q2
new_plus_0 = q2
basic_0 = a1 * (gmpy2.invert(new_plus_0, q1)) * new_plus_0
new_plus_1 = q1
basic_1 = a2 * (gmpy2.invert(new_plus_1, q2)) * new_plus_1
basic = (basic_0 + basic_1 ) % new_plus
# print(basic)
# 3580483299432395573659317753435578327637985357646700589244795353763573715336139257763207735764180027583647775608064149038853113096146443168864525876633843358404759038299549652788731401504933571857458579919657482494694530749880548630064266049810247928643334919438340898675734894238176854701817798193943787788697804563837637936347825096631189269242445925193015122262187618001159858028229304823201669018674562259904808285226405200475644934113919993329694127412750568776255266590650092290392749263011086241948791335363230476476351250684647853369997799237573793567577022116859682785257602832495614664192557787307332769009
new_c = basic
new_e = 7
new_p = q1
new_q = q2
new_phin = (new_p - 1) * (new_q - 1)
new_n = new_p * new_q
new_d = gmpy2.invert(new_e, new_phin)
new_m_2 = pow(new_c, new_d, new_n)
m = gmpy2.iroot(new_m_2, 2)[0]
print(long_to_bytes(m))

2. [NPUCTF2020]共 模 攻 击

hint文件直接用共模攻击求就好(具体证明原理可回顾之前的笔记RSA 2022/8/8_梅东的桃西的博客-CSDN博客

用到一个sympy新函数

# c = pow(m, 256, p)
m = sympy.nthroot_mod(c, 256, p)

得到hint

m.bit_length() < 400

Coppersmith定理:在一个e阶的mod n多项式f(x)中,如果有一个根小于n^1/e,就可以运用一个O(log n)的算法求出这些根。

这里由于hint中给了m的长度限制,所以联想到了Coppersmith定理

参考:NPUCTF2020 共模攻击 - vict0r - 博客园 (cnblogs.com) (1条消息) RSA中coppersmith定理的应用条件_M3ng@L的博客-CSDN博客_coppersmith定理

task

from gmpy2 import *
from Crypto.Util.number import *
from secret import flagflag = flag.strip(b"npuctf{").strip(b"}")
m = bytes_to_long(flag)p, q = getPrime(512), getPrime(512)
n = p * q
e1, e2 = p, q
c1, c2 = pow(m, e1, n), pow(m, e2, n)n = 128205304743751985889679351195836799434324346996129753896234917982647254577214018524580290192396070591032007818847697193260130051396080104704981594190602854241936777324431673564677900773992273463534717009587530152480725448774018550562603894883079711995434332008363470321069097619786793617099517770260029108149
c1 = 96860654235275202217368130195089839608037558388884522737500611121271571335123981588807994043800468529002147570655597610639680977780779494880330669466389788497046710319213376228391138021976388925171307760030058456934898771589435836261317283743951614505136840364638706914424433566782044926111639955612412134198
c2 = 9566853166416448316408476072940703716510748416699965603380497338943730666656667456274146023583837768495637484138572090891246105018219222267465595710692705776272469703739932909158740030049375350999465338363044226512016686534246611049299981674236577960786526527933966681954486377462298197949323271904405241585

这里得到c1 = m ^ p mod (p * q), c2 = m ^ q mod(p * q) (1)

根据费马小定理:

如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。

得到  m ^ p = m mod p , m ^ q = m mod q (2)

(1)(2)联立得到

下载sagemath

其中 m = f.small_roots(x = 2 ^ 400)代表根的绝对边界(hint中给的值

其他有关sage内容参考一下其他大佬

然后把解得的m转换成字符就好啦

3.[QCTF2018]Xman-RSA

给了四个文件,把扩展名改成txt后打开,看到encryption里面是一堆无意义的代码,里面很多能看出来字母的对应关系(比如adg对应def……)(不过一一对应好麻烦)

可以用quipqiup - cryptoquip and cryptogram solver解决(虽然不太准,不过也能凑合用)

然后打开密文文件,可以看出是16进制,用int('c1',16),int('c2',16)转为十进制就好

1240198b148089290e375b999569f0d53c32d356b2e95f5acee070f016b3bef243d0b5e46d9ad7aa7dfe2f21bda920d0ac7ce7b1e48f22b2de410c6f391ce7c4347c65ffc9704ecb3068005e9f35cbbb7b27e0f7a18f4f42ae572d77aaa3ee189418d6a07bab7d93beaa365c98349d8599eb68d21313795f380f05f5b3dfdc6272635ede1f83d308c0fdb2baf444b9ee138132d0d532c3c7e60efb25b9bf9cb62dba9833aa3706344229bd6045f0877661a073b6deef2763452d0ad7ab3404ba494b93fd6dfdf4c28e4fe83a72884a99ddf15ca030ace978f2da87b79b4f504f1d15b5b96c654f6cd5179b72ed5f84d3a16a8f0d5bf6774e7fd98d27bf3c9839
129d5d4ab3f9e8017d4e6761702467bbeb1b884b6c4f8ff397d078a8c41186a3d52977fa2307d5b6a0ad01fedfc3ba7b70f776ba3790a43444fb954e5afd64b1a3abeb6507cf70a5eb44678a886adf81cb4848a35afb4db7cd7818f566c7e6e2911f5ababdbdd2d4ff9825827e58d48d5466e021a64599b3e867840c07e29582961f81643df07f678a61a9f9027ebd34094e272dfbdc4619fa0ac60f0189af785df77e7ec784e086cf692a7bf7113a7fb8446a65efa8b431c6f72c14bcfa49c9b491fb1d87f2570059e0f13166a85bb555b40549f45f04bc5dbd09d8b858a5382be6497d88197ffb86381085756365bd757ec3cdfa8a77ba1728ec2de596c5ab

然后打开n2&n3文件,用b64decode解密再转换成数字

print(base64.b64encode(num_to_bytes(n2)))
print(base64.b64encode(num_to_bytes(n3)))
# PVNHb2BfGAnmxLrbKhgsYXRwWIL9eOj6K0s3I0slKHCTXTAUtZh3T0r+RoSlhpO3+77AY8P7WETYz2Jzuv5FV/mMODoFrM5fMyQsNt90VynR6J3Jv+fnPJPsm2hJ1Fqt7EKaVRwCbt6a4BdcRoHJsYN/+eh7k/X+FL5XM7viyvQxyFawQrhSV79FIoX6xfjtGW+uAeVF7DScRcl49dlwODhFD7SeLqzoYDJPIQS+VSb3YtvrDgdV+EhuS1bfWvkkXRijlJEpLrgWYmMdfsYX8u/+Ylf5xcBGn3hv1YhQrBCg77AHuUF2w/gJ/ADHFiMcH3ux3nqOsuwnbGSr7jA6Cw==
# TmNVbWUhCXR1od3gBpM+HGMKK/4ErfIKITxomQ/QmNCZlzmmsNyPXQBiMEeUB8udO7lWjQTYGjD6k21xjThHTNDG4z6C2cNNPz73VIaNTGz0hrh6CmqDowFbyrk+rv53QSkVKPa8EZnFKwGz9B3zXimm1D+01cov7V/ZDfrHrEjsDkgK4ZlrQxPpZAPl+yqGlRK8soBKhY/PF3/GjbquRYeYKbagpUmWOhLnF4/+DP33ve/EpaSAPirZXzf8hyatL4/5tAZ0uNq9W6T4GoMG+N7aS2GeyUA2sLJMHymW4cFK5l5kUvjslRdXOHTmz5eHxqIV6TmSBQRgovUijlNamQ==

n1文件中也是两串16进制,这里根据代码中的输出可以看出是其中一对c1,c2(分不清的话可以在解共模攻击的时候挨个代入,然后就可以解出来n1)

2639c28e3609a4a8c953cca9c326e8e062756305ae8aee6efcd346458aade3ee8c2106ab9dfe5f470804f366af738aa493fd2dc26cb249a922e121287f3eddec0ed8dea89747dc57aed7cd2089d75c23a69bf601f490a64f73f6a583081ae3a7ed52238c13a95d3322065adba9053ee5b12f1de1873dbad9fbf4a50a2f58088df0fddfe2ed8ca1118c81268c8c0fd5572494276f4e48b5eb424f116e6f5e9d66da1b6b3a8f102539b690c1636e82906a46f3c5434d5b04ed7938861f8d453908970eccef07bf13f723d6fdd26a61be8b9462d0ddfbedc91886df194ea022e56c1780aa6c76b9f1c7d5ea743dc75cec3c805324e90ea577fa396a1effdafa3090
42ff1157363d9cd10da64eb4382b6457ebb740dbef40ade9b24a174d0145adaa0115d86aa2fc2a41257f2b62486eaebb655925dac78dd8d13ab405aef5b8b8f9830094c712193500db49fb801e1368c73f88f6d8533c99c8e7259f8b9d1c926c47215ed327114f235ba8c873af7a0052aa2d32c52880db55c5615e5a1793b690c37efdd5e503f717bb8de716303e4d6c4116f62d81be852c5d36ef282a958d8c82cf3b458dcc8191dcc7b490f227d1562b1d57fbcf7bf4b78a5d90cd385fd79c8ca4688e7d62b3204aeaf9692ba4d4e44875eaa63642775846434f9ce51d138ca702d907849823b1e86896e4ea6223f93fae68b026cfe5fa5a665569a9e3948a
n2 = bytes_to_long(b64decode('PVNHb2BfGAnmxLrbKhgsYXRwWIL9eOj6K0s3I0slKHCTXTAUtZh3T0r+RoSlhpO3+77AY8P7WETYz2Jzuv5FV/mMODoFrM5fMyQsNt90VynR6J3Jv+fnPJPsm2hJ1Fqt7EKaVRwCbt6a4BdcRoHJsYN/+eh7k/X+FL5XM7viyvQxyFawQrhSV79FIoX6xfjtGW+uAeVF7DScRcl49dlwODhFD7SeLqzoYDJPIQS+VSb3YtvrDgdV+EhuS1bfWvkkXRijlJEpLrgWYmMdfsYX8u/+Ylf5xcBGn3hv1YhQrBCg77AHuUF2w/gJ/ADHFiMcH3ux3nqOsuwnbGSr7jA6Cw=='))
n3 = bytes_to_long(b64decode('TmNVbWUhCXR1od3gBpM+HGMKK/4ErfIKITxomQ/QmNCZlzmmsNyPXQBiMEeUB8udO7lWjQTYGjD6k21xjThHTNDG4z6C2cNNPz73VIaNTGz0hrh6CmqDowFbyrk+rv53QSkVKPa8EZnFKwGz9B3zXimm1D+01cov7V/ZDfrHrEjsDkgK4ZlrQxPpZAPl+yqGlRK8soBKhY/PF3/GjbquRYeYKbagpUmWOhLnF4/+DP33ve/EpaSAPirZXzf8hyatL4/5tAZ0uNq9W6T4GoMG+N7aS2GeyUA2sLJMHymW4cFK5l5kUvjslRdXOHTmz5eHxqIV6TmSBQRgovUijlNamQ=='))
c1 = 0x1240198b148089290e375b999569f0d53c32d356b2e95f5acee070f016b3bef243d0b5e46d9ad7aa7dfe2f21bda920d0ac7ce7b1e48f22b2de410c6f391ce7c4347c65ffc9704ecb3068005e9f35cbbb7b27e0f7a18f4f42ae572d77aaa3ee189418d6a07bab7d93beaa365c98349d8599eb68d21313795f380f05f5b3dfdc6272635ede1f83d308c0fdb2baf444b9ee138132d0d532c3c7e60efb25b9bf9cb62dba9833aa3706344229bd6045f0877661a073b6deef2763452d0ad7ab3404ba494b93fd6dfdf4c28e4fe83a72884a99ddf15ca030ace978f2da87b79b4f504f1d15b5b96c654f6cd5179b72ed5f84d3a16a8f0d5bf6774e7fd98d27bf3c9839
c2 = 0x129d5d4ab3f9e8017d4e6761702467bbeb1b884b6c4f8ff397d078a8c41186a3d52977fa2307d5b6a0ad01fedfc3ba7b70f776ba3790a43444fb954e5afd64b1a3abeb6507cf70a5eb44678a886adf81cb4848a35afb4db7cd7818f566c7e6e2911f5ababdbdd2d4ff9825827e58d48d5466e021a64599b3e867840c07e29582961f81643df07f678a61a9f9027ebd34094e272dfbdc4619fa0ac60f0189af785df77e7ec784e086cf692a7bf7113a7fb8446a65efa8b431c6f72c14bcfa49c9b491fb1d87f2570059e0f13166a85bb555b40549f45f04bc5dbd09d8b858a5382be6497d88197ffb86381085756365bd757ec3cdfa8a77ba1728ec2de596c5ab
c11 = int('2639c28e3609a4a8c953cca9c326e8e062756305ae8aee6efcd346458aade3ee8c2106ab9dfe5f470804f366af738aa493fd2dc26cb249a922e121287f3eddec0ed8dea89747dc57aed7cd2089d75c23a69bf601f490a64f73f6a583081ae3a7ed52238c13a95d3322065adba9053ee5b12f1de1873dbad9fbf4a50a2f58088df0fddfe2ed8ca1118c81268c8c0fd5572494276f4e48b5eb424f116e6f5e9d66da1b6b3a8f102539b690c1636e82906a46f3c5434d5b04ed7938861f8d453908970eccef07bf13f723d6fdd26a61be8b9462d0ddfbedc91886df194ea022e56c1780aa6c76b9f1c7d5ea743dc75cec3c805324e90ea577fa396a1effdafa3090', 16)
c12 = int('42ff1157363d9cd10da64eb4382b6457ebb740dbef40ade9b24a174d0145adaa0115d86aa2fc2a41257f2b62486eaebb655925dac78dd8d13ab405aef5b8b8f9830094c712193500db49fb801e1368c73f88f6d8533c99c8e7259f8b9d1c926c47215ed327114f235ba8c873af7a0052aa2d32c52880db55c5615e5a1793b690c37efdd5e503f717bb8de716303e4d6c4116f62d81be852c5d36ef282a958d8c82cf3b458dcc8191dcc7b490f227d1562b1d57fbcf7bf4b78a5d90cd385fd79c8ca4688e7d62b3204aeaf9692ba4d4e44875eaa63642775846434f9ce51d138ca702d907849823b1e86896e4ea6223f93fae68b026cfe5fa5a665569a9e3948a', 16)
_, s1, s2 = gmpy2.gcdext(e1, e2)
n1 = pow(c11, s1, n3) * pow(c12, s2, n3) % n3
print(n1)

然后就能求出来两部分flag

一开始忘了上面还有一个函数,直接把两个字符串合并,结果得到了一堆错误答案……后来发现刚好是奇数偶数错开输出的,然后合并一下就好啦

4. [羊城杯 2020]RRRRRRRSA

这道题其实直接分解N再用欧拉函数就可以简单求出来,不过还是学习一下其中的原理

维纳攻击Wiener’s attack:根据连分数的性质以及定理,通过对e/N的连续逼近找到对应的k/d,从而分解N。

维纳提出了一种关于私钥过小时对NN 进行分解的一种方式。并给出了证明当 d<1/3 * N ^ 1/4 满足时 (还应满足q<p<2q,因这里及后文主要是对私钥进行探讨,故忽略这类条件) 一定能够分解NN。

摘抄自:扩展维纳攻击 - CTF Wiki (ctf-wiki.org)

这里由于题中给到

P1 = getPrime(1038)
P2 = sympy.nextprime(P1)
assert(P2 - P1 < 1000)Q1 = getPrime(512)
Q2 = sympy.nextprime(Q1)N1 = P1 * P1 * Q1
N2 = P2 * P2 * Q2

所以 N1 / N2 = (P1 / P2)^2 * Q1 / Q2

由于(P1 / P2)^2 <1,所以N1 / N2 < Q1 / Q2 < 1

具体原理差不多就是这样的,连分数的实现原理举例如下:

sagemath好像可以用continued_fraction(x, bits)实现,不过不太清楚是怎么实现的,看了一下其他大佬写的python代码

传送门:(1条消息) [羊城杯 2020]RRRRRRRSA 题解(wiener attack运用)_mortal15的博客-CSDN博客

RSA 2022/8/17相关推荐

  1. 微软发布 Visual Studio 2022 版本 17.3:支持.NET MAUI 正式版,提高 C++ 性能

    微软今天发布了 Visual Studio 2022 版本 17.3.此更新带来了对 .NET 多平台应用程序 UI (.NET MAUI) 支持.为 Microsoft Teams 开发应用程序的能 ...

  2. 2022.3.17 关于镜头标称焦距和相机标定的焦距的差异

    2022.3.17 关于镜头标称焦距和相机标定的焦距的差异 来源 https://jah10527.github.io/articles/about_focol_length.html 有些日子没聊点 ...

  3. 用VScode编写LaTex-最新教程2022/4/17

    2022/4/17日更新内容 新版vscode对于原来的配置,反向搜索失效 更新代码. vscode需要修改或添加的配置 "latex-workshop.view.pdf.viewer&qu ...

  4. 时间管理(李葆春教授,2022.8.17)

    Source: weibo Time: 2022.8.17 18:02 几个月前,有个朋友曾经提到回头会在微博上问我一个有关「时间管理」的问题.直到现在这个问题也没有等来,我想要不然先聊起来,等问题来 ...

  5. gnome桌面打造日常使用操作系统(支持Arch Linux、Fedora、Ubuntu)(2022.04.17更新)

    更新日志 日期 内容 2022.04.03 完成初稿 2022.04.05 更新sublime和imwheel 2022.04.06 添加所有软件在Feroda的安装方法 2022.04.07 添加所 ...

  6. 2022第17届中国重庆橡塑工业展览会|成都橡塑展

    2022第17届中国重庆橡塑工业展览会 The 17th China Chongqing Rubber, Plastics Industry Exhibition 2022年6月16-18日     ...

  7. 四巫日来临本周硅铁、铁矿石领跌,铁矿石认沽最高31倍,钢厂利润回升2022.6.17

    <期货套利基础系列>介绍套利的基础知识: 期货套利基础第一篇:对套利的误解 第2-3篇是套利基础知识,内容来自电子书,有做过套利的人可以跳过: 期货套利基础第二篇:套利交易的基本概念 期货 ...

  8. 【提前批】【第二批】CUHK CSE 面经2022.6.17

    面试基础信息: 面试时间:共15分钟 面试官人数:2-3人(我是下午两点的面试,面试官有2人) 是否需要PPT:否 面试语言:全英 面试作答方式:全部口答 第一部分:自我介绍(1-2分钟) 英文自我介 ...

  9. 第一周总结(2022.10.17~2022.10.22)

    本周内容: 本周学习了前端一些基本的HTML标签以及css(网页修饰)---完成简单的登录/注册/一些首页的页面布局. DAY1 1.HTML基础学习 HTML:超文本标记语言(Hyper Text ...

最新文章

  1. 智能车大赛AI视觉组培训第一弹——基础篇
  2. Power Shell03 在PowerShell 3.0重新启动计算机指令
  3. 文本编辑器实现复制、剪切、粘贴、撤销、重做操作
  4. Fedora20 优化体验
  5. HDU 5131 Song Jiang's rank list
  6. nRF51822 SDK初体验
  7. Emberjs学习之路(一)
  8. 算法题——投篮比赛获胜概率问题
  9. PDCN循环 与 GTD时间管理
  10. 关于博弈论中的一硬币正反问题的分析
  11. ps----高低频磨皮--------中性灰磨皮-----------双曲线磨皮
  12. 计算机 无法 访问共享网络打印机,打印机不能共享怎么办|无法连接共享打印机的解决方案...
  13. Mac电脑的文件快捷访问工具:Default Folder X 5
  14. Web漏洞-Xss跨站
  15. Tagtraum.Industries.beaTunes.v3.5.7.Incl.Keygen-NOY
  16. 求n的阶乘的算法框图_当代程序员必备技能(算法)之:递归详解 - Java斗帝之路...
  17. [Unity][游戏实现][UGUI][AnimatorAnimation]Graveyard Keeper守墓人UI实现
  18. 未能创建类型“Genersoft.ZJGL_XD.XDXTXY.XDGLPUBSrv”。
  19. vue-player 官网demo示例
  20. 机组配对算法matlab,基于MATLAB的风力发电机组控制算法的研究 - 北极星风力发电网...

热门文章

  1. 不要想在任何事上都占上风
  2. 压缩BCD码和非压缩BCD码的区别
  3. Android手机有哪学好用的epub阅读器app
  4. Android之JVM基础
  5. OKR实施方法——关于思路和流程的思考
  6. 使用 Learner Lab - 如何设置自己想要的VPC,以供EC2使用
  7. Bzoj2095:[Poi2010]Bridges:混合图欧拉回路,网络流
  8. 记录:Linux 安装 EMQX MQTT 并启用 SSL/TLS 安全连接
  9. 中国石油大学《客户关系管理》第一次在线作业
  10. ble_app_hrs心率程序 nrf51822