پرش به محتویات

چالش trendy_windy_trigonity

در این چالش رمزنگاری اسکریپ زیر به ما داده شده است.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from Crypto.Util.number import bytes_to_long

flag = REDACTED
print(len(flag))

R = RealField(1000)
a, b = bytes_to_long(flag[:len(flag)//2]), bytes_to_long(flag[len(flag)//2:])
x = R(0.75872961153339387563860550178464795474547887323678173252494265684893323654606628651427151866818730100357590296863274236719073684620030717141521941211167282170567424114270941542016135979438271439047194028943997508126389603529160316379547558098144713802870753946485296790294770557302303874143106908193100)

enc = a*cos(x)+b*sin(x)

# 38
# 2.78332652222000091147933689155414792020338527644698903976732528036823470890155538913578083110732846416012108159157421703264608723649277363079905992717518852564589901390988865009495918051490722972227485851595410047572144567706501150041757189923387228097603575500648300998275877439215112961273516978501e45

خب همان طور که مشخص است در این سوال رشته flag به دو بخش b و a تقسیم و جداگانه در معادله خطی مثلثاتی استفاده شده است. پس مقدار a و b مجهولات ما یعنی فلگ و مقدار x معلوم است. خب این ترکیب خطی سینوس و کسینوس ما را به یاد الگوریتم LLL برای حل می‌اندازد که ابتدا جابجایی طرفین انجام می‌دهیم و سپس باید ماتریس مشبکه آن را بسازیم.

a \cdot cos(x) + b\cdot sin(x) - enc = 0
\begin{bmatrix} cos(x) & sin(x) & -enc \\ 1 & 0 & 0 \\ 0 & 1 & 0 \\ \end{bmatrix} \ \underrightarrow{LLL} \ \begin{bmatrix} 0 \\ a \\ b \end{bmatrix}

قبل از حل باید توجه داشت که در این سوال اعداد حقیقی با ۳۰۰ رقم اعشار هستند و ما باید با اعداد صحیح کار کنیم.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from Crypto.Util.number import long_to_bytes
from sage.all import *

m = 10 ** 300    # both enc and x has a decimal point of 300
R = 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],    
]).T

vecs = M.LLL()
for vec in vecs:
    a, b = vec[1], vec[2]
    flag = long_to_bytes(abs(int(a))) + long_to_bytes(abs(int(b)))
    if b'CSCTF{' in flag:
        print(flag)

توجه

در این چالش به دلیل اینکه اعداد اعشاری را به صحیح با مقیاس محاسبات ۳۰۰ رقم افزایش دادیم، این منجر به این شده که درایه اول بردار هدف‌ صفر vec[0]!=0 نباشد و باید بردار مناسب را در حلقه پیدا کنیم.


FLAG 🚩

CSCTF{Trigo_453_Tr3ndy_FuN_Th35e_D4Y5}

نویسنده

HIGHer