刷题记录:[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"))
posted @ 2020-12-24 18:16  MustaphaMond  阅读(581)  评论(1编辑  收藏  举报