刷题记录:[SUCTF2019]SignIn
题目复现链接:https://buuoj.cn/challenges
参考链接:[SUCTF 2019] SignIn
RSA
密码学都还给老师了,惭愧,该打
看到一堆gmp
不用怕,去搜搜就知道是gmp库的函数,最后cmp
很明显的比较,v7
是硬编码的,v6
是输入的。
整个程序的逻辑是
${v_6}^{v_5},mod,{v_4}={v_7}$
很明显的RSA算法,重新复习一下RSA过程:
生成密钥
- 随意选择两个大的素数$p$和$q$,$p$不等于$q$,计算$N=pq$。
- 根据欧拉函数,求得$r=\varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)$
- 选择一个小于$r$的整数$e$,使$e$与$r$互质。并求得$e$关于$r$的模逆元,命名为$d$(求$d$令$ed\equiv 1{\pmod {r}}$)。(模逆元存在,当且仅当$e$与$r$互质)
- 将$p$和$q$的记录销毁。$(N,e)$是公钥,$(N,d)$是私钥
加密
$c\equiv m^{e}{\pmod {N}}$
解密
$m\equiv c^{d}\ (\mathrm {mod} \ N)$
解题
回到题目,我们现在相当于有$c$、$e$、$N$,要求明文,首先要求私钥,这里的$N$比较小,可以直接分解
http://www.factordb.com/
获得$p$和$q$
p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
据此求出私钥和明文
import gmpy2
import binascii
p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n = 103461035900816914121390101299049044413950405173712170434161686539878160984549
e = 65537
d = gmpy2.invert(e, (p - 1) * (q - 1))
m = gmpy2.powmod(c, d, n)
print(binascii.unhexlify(hex(m)[2:]).decode(encoding="utf-8"))