SRCTF
浙江树人学院校赛,不过好像变成面向群友的比赛了,有几道密码题学到真东西了,写个wp记录一下
Baby
task
1 | from enc import flag |
由题意得
$$
leak = pr + qt + tmp
$$
即
$$
tmp = leak - pr -qt
$$
造格
$$
\begin{pmatrix}
1 & p & q & tmp
\end{pmatrix}
\begin{pmatrix}
leak & 0 & 0 & 0\\
r & 1 & 0 & 0 \\
t & 0 & 1 & 0\\
-1 & 0 & 0 & 2^{500}
\end{pmatrix}=
\begin{pmatrix}
0&p & q&2^{500}tmp
\end{pmatrix}
$$
exp
1 | from Crypto.Util.number import * |
leak
task.py
1 | from Crypto.Util.number import * |
$$
\because e\times dp \equiv 1 \mod p-1
$$
$$
\therefore e\times (dp_{high} + x) = k\times (p-1) + 1
$$
$$
\therefore e\times (dp_{high} + x) +k - 1 \equiv 0 \mod p
$$
因为e不大,所以枚举k,在模n下copper即可得到dp
得到dp之后用常规的dp泄露思路得解
exp
1 | from Crypto.Util.number import * |
leak revenge
task.py
1 | from Crypto.Util.number import * |
和上题区别在于e变大了,用二元copper得解
exp
1 | from Crypto.Util.number import * |
justez
task.py
1 | from Crypto.Util.number import * |
花里胡哨的变量,其实就是维纳攻击
gen
task
1 | from Crypto.Util.number import * |
剪枝
有个小细节是根据n的最后一位是1,而经过S盒变换之后,p,q的最后一位有固定的映射,可以推断出p,q的最后一位肯定是9
1 | from Crypto.Util.number import * |
Who_is_Bob
task
1 | from Crypto.Util.number import * |
由题意得
$$
leak = (p-x)(q-x)
$$
$$
leak = n - x(p+q) +x^2
$$
$$
n - leak = x(p+q-x)
$$
把$n - leak$的值拿去网站分解,有一堆素因子,做一点排列组合得到30bit的值就是x了
最后x = 761777992
拿到x之后解方程组得到p,q
Elementary Chinese
提示说了注意拼音的音调,想到四进制,每四个对应一个字符
exp
1 | import pypinyin |
ez_solve
task.py
1 | import hashlib |
由题意知
$$
M_1 \equiv M^7+6M^6 +3M^2+M+1 \mod n
$$
$$
M_2 \equiv 4M^5+7M^4+2M+3 \mod n
$$
比较关键的点是Sagemath可以定义一个模n的矩阵,例如
1 | R.<M> = PolynomialRing(MatrixSpace(Zmod(n),3,3)) |
直接取$M_1$和$M_2$的公因子就可以了
exp
1 | from Crypto.Cipher import AES |
hash_attack
Util.py
1 | import random |
hash_attack.py
1 | from Util import ez_hash, gensalt |
注意password = b64decode(input("input your key: ")).decode("latin-1")
这个编码方式不是utf-8
回头看util里面的ez_hash
1 | def ez_hash(msg, salt=None): |
c = iteration_fun(pad_msg)
,输出这个pad_msg,我们会有一串adwa_only_has_one_key
经过填充之后的二进制串
把这个二进制串用latin-1
编码后发现和原始的adwa_only_has_one_key
不一样
随后base64加密后传给服务器即可
1 | from Crypto.Util.number import * |
SRCTF{2413df81-fc67-4c14-a4e9-bbe3e0a141f7}
broke_prime
task.py
1 | from Crypto.Util.number import * |
设seed为x,那么p,q都是关于$x$的多项式
$$
p_h + p_l \equiv \sum_{i = 0}^{n_1}a_ix^i \mod m
$$
$$
q_h + q_l \equiv \sum_{i=0}^{n_2} b_ix^{i} \mod m
$$
利用结式把x消去,这样可以得到一个关于$p_l$和$q_l$的式子,然后尝试用二元copper。
exp
1 | import itertools |
不是正解
本题跑了40min,可以自己先生成数据,测试一下二元copper的参数,然后再爆破
一点关于结式的细节:
1 | from sage.matrix.matrix2 import Matrix |
等价于
1 | h = f.sylvester_matrix(g,x).det() |
Minirsa
task.py
1 | from Crypto.Util.number import * |
看懂代码之后就会知道
$$
L_0 = n - p_1 - p_2 - p_3 - p_4 - p_5
$$
通过这个式子恢复n,还有
$$
L_2 \equiv p\times x \mod n
$$
x是512bit的素数,因为n有2048bit,所以这里模n没意义,直接和n取公因数即可得到p,然后就是解RSA
exp
1 | from Crypto.Util.number import * |