TSCTF-J2023 Writeup
好狠的新生赛,被拷打了TAT
babyrsa √
flag1: \(William's \; P+1\)
flag2: 低指数广播
flag3: \(dp\)泄露
flag4: \(e\)与\(phi\)不互素的处理
花了比较长的时间,感觉还是太低手了。找\(William's \; P+1\)的脚本找了一会儿,然后发现直接猜就完了
感觉得搞个算法脚本库了
More than once √
一眼题
4k+1√
现在依然不懂原理,用的Wolfram,等一手官方wp
唉,数论
Methenmatics√
灵光乍现
\(2n=a_0^2+a_1^2+e(b_0^2+b_1^2)\)
\(n=a_0^2+eb_0^2\)
\(n=a_1^2+eb_1^2\)
\(nb_1^2=a_0^2b_1^2+eb_0^2b_1^2\)
\(nb_0^2=a_1^2b_0^2+eb_1^2b_0^2\)
\((b_1-b_0)(b_1+b_0)n=(a_0b_1-a_1b_0)(a_0b_1+a_1b_0)\)
DLP
离散对数正常算算不出来,考虑\(p-1\)光滑的情况,分解\(p-1\)后发现有很多小素数和一个\(39\)位的大素数\(p_0\)。flag长度只有\(55\)位,所以可以把大素数扔掉,用小素数跑\(pohlig-hellman\) 。\(p\)的原根是\(5\),先求\(a=dlp(5,enc,p),b=dlp(5,2,p)\)然后\(exgcd\)搞一搞,或者\(\frac{p-1}{p_0}+1\)的原根刚好是\(2\),可以直接跑
通过这道题深入了解了一下\(pohlig-hellman\)
https://www.cnblogs.com/Kuroniko/p/17728714.html
充分发挥复制粘贴的作用 https://lazzzaro.github.io/2020/05/07/crypto-离散对数/index.html 魔改一下来处理小素数指数为2的情况
加入下面一段
点击查看代码
if(_==1) :
crt_moduli.append(q)
crt_remain.append(x)
if(_==2) :
a0=x
inv=pow(pow(g,a0*(p-1)//(q*q),p),p-2,p)
a1=babystep_giantstep(pow(g,(p-1)//q,p),pow(y,(p-1)//(q*q),p)*inv,p,q)
crt_moduli.append(q*q)
crt_remain.append(a0+a1*q)
#flag=8789501385339948530110121143868539794259523279408421184965498352996056952623518492843867374482394546659583150721261552724810972407928
但不知道为什么,跑出来的\(flag\)乱七八糟,一位大佬帮忙看了代码以后发现
点击查看代码
a1=babystep_giantstep(pow(g,(p-1)//q,p),pow(y,(p-1)//(q*q),p)*inv,p,q)
应该是
a1=babystep_giantstep(pow(g,(p-1)//q,p),pow(y,(p-1)//(q*q),p)*inv%p,p,q)
#TSCTF-J{You_really_understand_how_Pohlig_Hellman_works}
NoMatrix
一直苦恼于找出一个满秩的矩阵,结果\(sagemath\)有解左解右的功能
点击查看代码
R=[.....]#从文件读入
S=[.....]#从文件读入
MR = matrix(GF(3), R)
MS = matrix(GF(3),19881,1, S)
a = MR.solve_right(MS)
flag = ''.join([str(a[i,0]) for i in range(l)])
bytes.fromhex(hex(int(flag,3))[2:])
然后\(0xGame\)那个\(EzLFSR\)也是同一个东西,不过在看到之前口胡了一个愚蠢的方法,因为那道题是在\(GF(2)\)上的,似乎可以做线性基硬找一个满秩的矩阵出来
Checksum
\((\oplus{i=0}^{31} s_i F{i}) \oplus A = \sum_{i=0}^{31} s_i \cdot 2^i\)
\(s_1 F{1,1} \oplus s_2 F{2,1} \oplus s_3 F{3,1} \oplus \cdots \oplus s{32} F_{32,1} \oplus A_0 = s_0\)
\(s_1 F{1,2} \oplus s_2 F{2,2} \oplus s_3 F{3,2} \oplus \cdots \oplus s{32} F_{32,2} \oplus A_1 = s_1\)
\(\cdots\)
\(s_1 F{1,32} \oplus s_2 F{2,32} \oplus s_3 F{3,32} \oplus \cdots \oplus s{32} F{32,32} \oplus A{32} =
s_{32}\)

浙公网安备 33010602011771号