杂记(三)
这篇文章主要记录期末月做的一些赛题
R3CTF
r0system
审计代码发现,可以自己注册个账号完成登录
登录之后,在修改密码那里居然可以改所有用户的密码
1 | def R0System(USERNAME): |
那思路就是改Bob的密码,然后得到Bob的私钥,再求Alice和Bob的会话密钥完成解密
exp.py
1 | class Curve: |
r1system
上一题做完之后,拿到这题的附件
审计完代码发现,这题和上题区别在于,这题初始化只有Alice一个账号,而且我们居然能注册Bob的账号
注册之后和Alice交换密钥就好了
exp
1 | from Crypto.Util.number import long_to_bytes,bytes_to_long,isPrime |
CryptoCTF
另外一篇博客
熊猫杯
client.py
1 | from Crypto.Util.number import * |
server.py
1 | from Crypto.Util.number import * |
part1
由题意得
$$
m_{11} \equiv (v_1 - x_{11})^{d_1} + msg_0 \mod n_1
$$
$$
m_{12} \equiv (v_1 - x_{12})^{d_1} + msg_1 \mod n_1
$$
简单化简可以得到
$$
(m_{11}-msg_0)^3 \equiv v_1 - x_{11} \mod n_1
$$
$$
(m_{12}-msg_1)^3 \equiv v_1 - x_{12} \mod n_1
$$
展开
$$
m_{11}^{3} - 3m_{11}^2msg_0 + 3m_{11}msg_0^2 - msg_0^3 \equiv v_1 - x_{11} \mod n_1
$$
$$
m_{12}^{3} - 3m_{12}^2msg_1 + 3m_{12}msg_1^2 - msg_1^3 \equiv v_1 - x_{12} \mod n_1
$$
两个式子相减得到
$$
(m_{11} - m_{12})^3 - 3(m_{11}^2msg_0 -m_{12}^2msg_1) + 3(m_{11}msg_0^2-m_{12}msg_1^2) \equiv (x_{12}-x_{11}) \mod n_1
$$
不展开也行(
msg0
和msg1
都是168bit,用二元copper即可
part2
由题意得
$$
m_{21} \equiv (v_2 - x_{21})^{d_2} + msg_2 \mod n_2\
m_{22} \equiv (v_2 - x_{22})^{d_2} + (c_{0}\times msg_2 + c_1) \mod n_2
$$
简单化简得
$$
m_{21} - msg \equiv (v_2 - x_{21})^{d_2} \mod n_2
$$
$$
m_{22} - (c_0\times msg + c_1) \equiv (v_2 - x_{22})^{d_2} \mod n_2
$$
两边乘方得到
$$
(m_{21} - msg)^{e_2} \equiv (v_2 - x_{21}) \mod n_2\
$$
$$
(m_{22} - (c_0\times msg + c_1))^{e_2} \equiv (v_2 - x_{22}) \mod n_2
$$
然后相关消息攻击即可
exp
1 | # sage |
UIUCTF
Determined
server.py
1 | from Crypto.Util.number import bytes_to_long, long_to_bytes |
gen.py
1 | from SECRET import FLAG, p, q, r |
主要思路是利用server分解n
首先有个固定了部分值的矩阵M,?是我们要输入的值
$$
M =
\begin{pmatrix}
p & 0 & ? & 0 & ?\\
0 & ? & 0 & ? & 0\\
? & 0 & ? & 0 & ?\\
0 & q & 0 & r & 0\\
?&0&?&0&0
\end{pmatrix}
$$
第一反应是全填1,此时M如下
$$
M =
\begin{pmatrix}
p & 0 & 1 & 0 & 1\\
0 & 1 & 0 & 1 & 0\\
1 & 0 & 1 & 0 & 1\\
0 & q & 0 & r & 0\\
1 & 0 & 1 & 0 & 0
\end{pmatrix}
$$
但这个时候会发现curr一定是0,但我们可以找出curr不为0的排列有
1 | (0, 1, 4, 3, 2) |
对于每个排列来看,得到的sign()值分别为
1 | -1 |
得到的curr如下
1 | pr |
那么得到的res就是
$$
-pr + pq +r-q+r-r-q+q
$$
即
$$
pq-pr-q+r
$$
这对我们分解n没什么关系,所以,我们的目的就是输入什么样的值,能够让res仅仅与p,q有关
经过测试发现
输入1,1,0,1,1,1,1,1,1
,此时M如下
$$
M =
\begin{pmatrix}
p & 0 & 1 & 0 & 1\\
0 & 0 & 0 & 1 & 0\\
1 & 0 & 1 & 0 & 1\\
0 & q & 0 & r & 0\\
1 & 0 & 1 & 0 & 0
\end{pmatrix}
$$
此时输出的$res = pq-q$
利用这个来求q,即完成了n的分解
exp
1 | from Crypto.Util.number import * |
回过头来可以发现其实fun就是个计算行列式的函数。
Without a Trace
server.py
1 | import numpy as np |
过了check之后,服务器返回矩阵$M\times F$的迹
而$F$是以flag为对角元素的对角矩阵,我们只需要让$M$为单位矩阵然后传入$256^{20},256^{15},256^{10},256^5,1$,得到的值就是flag
Naptime
task.sage
1 | from random import randint |
首先测了一下,发现直接用dec函数就可以解密,但我们缺少参数
各个参数并不是很大,可以用爆破的思路完成
我们首先求出所有12bit的素数W,再爆破M。用a求回那个被打乱的b,判断sorted(b)
是不是一个超递增序列
然后再求排列pi,然后用dec解密
exp
1 | from Crypto.Util.number import * |
春秋杯夏季赛
ezzzecc
cipher.txt
1 | p = getPrime(256) |
点都在曲线上,利用
$$
y \equiv x^3 + ax + b \mod p
$$
我们随意取两个点
$$
x_i^3 + ax_i +b \equiv y_i^2 \mod p
$$
进行移项
$$
k_1p = x_1^3 + ax_1 + b - y_1^2
$$
$$
k_2p = x_2^3+ax_2 +b -y_2^2
$$
然后求公因数即可得到p,得到p之后爆破私钥
再利用$M = C_1-kC_2$求解
exp
1 | # sage |
signature
task.py
1 | import os |
关注验签过程
$$
v \equiv g^{s^{-1}\times H(admin)} \times g^{xr}\mod p \mod q
$$
$$
v \equiv g^{k(H(admin) + xr)^{-1}(H(admin) + xr)} \mod p \mod q \quad = r
$$
题目要求用admin
来验签,思路很简单,就是求出k,然后自己构造出r和s发给服务器即可,(并不需要求k)
通过$s \equiv k^{-1}(H+xr) \mod q$,有
$$
k \equiv s^{-1}(H+xr) \mod q
$$
$$
\therefore k \equiv s^{-1}H + s^{-1}xr \mod q
$$
令$A = s^{-1}r \mod q,B = s^{-1}h \mod q$
$$
\therefore k \equiv A_ix + B_i \mod q
$$
造格
$$
\begin{pmatrix}
t_1 & t_2 & … & t_8 & x & 1
\end{pmatrix}
\begin{pmatrix}
q & 0 & … & 0 & 0 & 0\\
0 & q & … & 0 & 0 & 0\\
\vdots & \vdots & \ddots & \vdots & \vdots & \vdots \\
0 & 0 & … & q & 0 & 0\\
A_1 & A_2 & … & A_8 & 1 & 0\\
B_1 & B_2 & … & B_8 & 0 & K
\end{pmatrix}
=
\begin{pmatrix}
k_1 & k_2 & … & k_8 & x & K
\end{pmatrix}
$$
q:160bit,k:128bit,x:160bit左右
d太大了,我们把d消去,有
$$
(r_0s_i)k_i - (r_1s_0)k_0 \equiv (h_ir_0-h_0r_i) \mod q
$$
同乘$(r_0s_i)^{-1}$有
$$
k_i - (r_0s_i)^{-1}(r_1s_0)k_0 \equiv (r_0s_i)^{-1}(h_ir_0-h_0r_i) \mod q
$$
令$A = (r_0s_i)^{-1}(r_1s_0) \mod q$,$B = (r_0s_i)^{-1}(h_ir_0-h_0r_i) \mod q$
所以有
$$
k_i \equiv A_ik_0 + B_i \mod q
$$
构造格
$$
\begin{pmatrix}
t_1 & t_2 & … & t_8 & k_0 & 1
\end{pmatrix}
\begin{pmatrix}
q & 0 & … & 0 & 0 & 0\\
0 & q & … & 0 & 0 & 0\\
\vdots & \vdots & \ddots & \vdots & \vdots & \vdots \\
0 & 0 & … & q & 0 & 0\\
A_1 & A_2 & … & A_8 & 1 & 0\\
B_1 & B_2 & … & B_8 & 0 & K
\end{pmatrix}
=
\begin{pmatrix}
k_1 & k_2 & … & k_8 & k_0 & K
\end{pmatrix}
$$
求出k0之后,我们计算$r \equiv g^{k_0} \mod p \mod q$,$s \equiv k^{-1}(H(admin) + xr) \mod q$
再把r,s发过去即可
1 | import hashlib |
补充
由于对DSA没学到位,上面的思路似乎多此一举了,题目给出了私钥,所以只需要拿admin以及私钥构造r,s即可,k可以随便取
如果没给出私钥,那就需要按照上面的思路,先求出k,再求出私钥。
happy2024——Unsolved
not2022but2024
1 | from Crypto.Util.number import * |
$$
h \equiv 3^{2022}\times p^2 + 5^{2022}\times q^{2} \mod N
$$
因为$N = n^2 + 2024$,在模N下,$p,q$比较小
ctfshow西瓜杯
这场比赛题目蛮简单的,主要拼手速吧
奇怪的条形码
从手机充电口看这张图片,得到密文Y3Rmc2hvd3t4aWd1YmVpX21pc2NfZ3JhbV9oZXJlX2ZsYWd9
base64解码得到ctfshow{xigubei_misc_gram_here_flag}
简单密码
密文647669776d757e83817372816e707479707c888789757c92788d84838b878d9d
ctfshow转16进制是63746673686f77
c对应的那个密文是c的ASCII码加一,以此类推
exp
1 | c = "647669776d757e83817372816e707479707c888789757c92788d84838b878d9d" |
factor
task.py
1 | from Crypto.Util.number import * |
直接利用leak1 ^ leak2 = p ^ q
剪枝
exp
1 | from Crypto.Util.number import * |
给你d又怎样
task.py
1 | from Crypto.Util.number import * |
这题主要问题是没有n
因为$hint \equiv n^e \mod c$
这个c可以分解为6091 * 8010963716765433514869336359812774009376685535134030237002058632158407912
所以可以求e模c的逆元,即可得到n
但是此时求出来的n是比c小的,n理应比c大,所以加回一个c即可
exp
1 | from Crypto.Util.number import * |
混合密码体系
task.py
1 | # 库 |
先解RSA得到key,然后再解AES
exp
1 | from Crypto.Util.number import * |