خب همان طور که مشخص است در این سوال رشته flag به دو بخش b و a تقسیم و جداگانه در معادله خطی مثلثاتی استفاده شده است. پس مقدار a و b مجهولات ما یعنی فلگ و مقدار x معلوم است. خب این ترکیب خطی سینوس و کسینوس ما را به یاد الگوریتم LLL برای حل میاندازد که ابتدا جابجایی طرفین انجام میدهیم و سپس باید ماتریس مشبکه آن را بسازیم.
قبل از حل باید توجه داشت که در این سوال اعداد حقیقی با ۳۰۰ رقم اعشار هستند و ما باید با اعداد صحیح کار کنیم.
1 2 3 4 5 6 7 8 9101112131415161718192021222324
fromCrypto.Util.numberimportlong_to_bytesfromsage.allimport*m=10**300# both enc and x has a decimal point of 300R=RealField(1000)enc=R("2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45")x=R("0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100")enc=int(enc*m)cos_x=int(cos(x)*m)sin_x=int(sin(x)*m)M=Matrix(ZZ,[[cos_x,sin_x,-enc],[1,0,0],[0,1,0],]).Tvecs=M.LLL()forvecinvecs:a,b=vec[1],vec[2]flag=long_to_bytes(abs(int(a)))+long_to_bytes(abs(int(b)))ifb'CSCTF{'inflag:print(flag)
توجه
در این چالش به دلیل اینکه اعداد اعشاری را به صحیح با مقیاس محاسبات ۳۰۰ رقم افزایش دادیم، این منجر به این شده که درایه اول بردار هدف صفر vec[0]!=0 نباشد و باید بردار مناسب را در حلقه پیدا کنیم.