XCTF夏令营选拔赛TooooomanyRSA题解

先看一道类似题目的题解,这是2020羊城杯的simple:

引用自:https://blog.csdn.net/jcbx_/article/details/109306542

from Crypto.Util.number import *
from gmpy2 import invert
c = 6472367338832635906896423990323542537663849304314171581554107495210830026660211696089062916158894195561723047864604633460433867838687338370676287160274165915800235253640690510046066541445140501917731026596427080558567366267665887665459901724487706983166070740324307268574128474775026837827907818762764766069631267853742422247229582756256253175941899099898884656334598790711379305490419932664114615010382094572854799421891622789614614720442708271653376485660139560819668239118588069312179293488684403404385715780406937817124588773689921642802703005341324008483201528345805611493251791950304129082313093168732415486813
e2 = 27188825731727584656624712988703151030126350536157477591935558508817722580343689565924329442151239649607993377452763119541243174650065563589438911911135278704499670302489754540301886312489410648471922645773506837251600244109619850141762795901696503387880058658061490595034281884089265487336373011424883404499124002441860870291233875045675212355287622948427109362925199018383535259913549859747158348931847041907910313465531703810313472674435425886505383646969400166213185676876969805238803587967334447878968225219769481841748776108219650785975942208190380614555719233460250841332020054797811415069533137170950762289
e1 = 114552459553730357961013268333698879659007919035942930313432809776799669181481660306531243618160127922304264986001501784564575128319884991774542682853466808329973362019677284072646678280051091964555611220961719302320547405880386113519147076299481594997799884384012548506240748042365643212774215730304047871679706035596550898944580314923260982768858133395187777029914150064371998328788068888440803565964567662563652062845388379897799506439389461619422933318625765603423604615137217375612091221578339493263160670355032898186792479034771118678394464854413824347305505135625135428816394053078365603937337271798774138959
N = 14922959775784066499316528935316325825140011208871830627653191549546959775167708525042423039865322548420928571524120743831693550123563493981797950912895893476200447083386549353336086899064921878582074346791320104106139965010480614879592357793053342577850761108944086318475849882440272688246818022209356852924215237481460229377544297224983887026669222885987323082324044645883070916243439521809702674295469253723616677245762242494478587807402688474176102093482019417118703747411862420536240611089529331148684440513934609412884941091651594861530606086982174862461739604705354416587503836130151492937714365614194583664241
a = 0.356#731./2049
M1=N**0.5
M2= N *(a+1)
D = diagonal_matrix(ZZ,[N,M1,M2,1])
M=matrix(ZZ,[[1,-N,0,N2],[0,e1,-e1,-e1N],[0,0,e2,-e2N],[0,0,0,e1e2]])D
L=M.LLL()
t=vector(ZZ,L[0])
x=tM(-1)
phi = int(x[1]/x[0]*e1)
d = invert(0x10001,phi)
m=pow(c,d,N)
print long_to_bytes(m) 

这个问题采用的是extending wiener attack,可以参考这篇博客https://blog.csdn.net/jcbx_/article/details/109306542,但是本题e有三个,与上面例题有差异,所以要构造新的LLL矩阵,涉及格相关的内容。

研究了一下LLL算法的论文,矩阵终于磨出来了:

根据论文中三个e的情况更改M矩阵及D矩阵

另外还需要更改a的值,a的值等于e的位数加一(即811),除以p*q的位数加一(即2049),保留三位小数。

也就是说算法可以改成这样:

from gmpy2 import invert
c = 8836441252076834545813477411326425375032267123570785772864736522363289546687708899074336247215937510570504358003107825056501941030269383864118843746175337393654312850577439133664730484837119573532202639084658757820201188879766516909534973535998857651937119461057973385426395724145776918292561702292436605761423965907449269350234768599086801097764871812636671292354213601605096195311151373515090830120096932678276497558133279308072396732663178152322425868305886057431421961733257631788613513220162555655889179523511665784230205568552674460999865994501813783725694862606623394523003050895631252334230583883118073253764
e2 = 1369139766594499502102339802022151306473260303306443944809840701670612636871224554225002168944819225437998598365160666841985968029088084698853903787370193867870645734160453072726844381549153136514381609762281206178008136789238144315497475817194151194572296755949819068715206908967557531534965163142405984337962331584669073736885280026972797963267782773986730500382181318371495017118704093918920704345311527651399811381295059334575066198160251659075954912595362620180554775651196811925899974337478484410958141839806933182849189323190130942495340593301630517690327831594714373018323154749642065080783334651101242699263
e1 = 6394785330485131407826851764944106702989306751661773111300134919431104584180613989558300377714349529400378558913602158291081082675430487235339914971012067566601890029839947493155254582899628788537164340404428811085870041808860483801729245083548201334366733631432145384161908034867977906516995215397817811827060338562939218932916441868066261899714398094644048582309184012571138467837154157300425982546397721016585389530109123133328761496692431696333697620772147165360784490956672563278919171793966890158893934190837756790824904679773847777676326932643265426451922272758626857050445979305022351126666958426400079653623
e3 = 5437175210613834481955163777766627983523303337501300230689357572042873091664083970990501546609837607847693632622863075171175573210124960851439677015543351005393752316875323874628271392021624688370950188978195558312943877934365491687668809500866579503310026982199641168879029765994054311638922866950503743682009008734748720854732986500921718042561188808728053600445110972992438469967649056256589175739478272363214764480549487083235779588504538469805052660174224984711215950503095920589943783308241737365123329897745808282472351927870398484175556134059702516479014529101233832019814273876515569307294857432779445820767
N = 13441675621853397537941552930565086940390470130815380172405483101963424807980457970171725987335576421109600777181124732686757429091494072838586546464238360449989289020069386272380414809945684476174566989775147057082001644921451704981593847572798324632557836313044339427816944052099264108168157879645492166128090320214880302941951710697142064976112121583858774576042442313128499340606412845822519283515566759147621860641682899507428800319575392348478145779271935852461866317025429591494415486087527357696348049367246280018948490128455131326723173717164420547870649041609012209503120621766999344338619628361309881504449
a = 0.396#811/2049
M1=N**0.5
M2= N**(a+1.5)
M3=N**(1+a)
D = diagonal_matrix(ZZ,[N**1.5,N,M2,M1,M2,M3,M3,1])
M=matrix(ZZ,[[1,-N,0,N**2,0,0,0,-N**3],[0,e1,-e1,-e1*N,-e1,0,e1*N,e1*N**2],[0,0,e2,-e2*N,0,e2*N,0,e2*N**2],[0,0,0,e1*e2,0,-e1*e2,-e1*e2,-e1*e2*N],[0,0,0,0,e3,-e3*N,-e3*N,e3*N**2],[0,0,0,0,0,e1*e3,0,-e1*e3*N],[0,0,0,0,0,0,e2*e3,-e2*e3*N],[0,0,0,0,0,0,0,e1*e2*e3]])D
L=M.LLL()
t=vector(ZZ,L[0])
x=t*M(-1)
phi = int(x[1]/x[0]*e1)
d = invert(0x10001,phi)
m=pow(c,d,N)
print (m)

 在sage上运行该脚本就可以得到m的数字形式了,再通过long_to_byte()函数即可得到flag。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值