刷题记录:[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$令$edequiv 1{pmod {r}}$)。(模逆元存在,当且仅当$e$与$r$互质)
  • 将$p$和$q$的记录销毁。$(N,e)$是公钥,$(N,d)$是私钥

加密

$cequiv m^{e}{pmod {N}}$

解密

$mequiv 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"))
原文地址:https://www.cnblogs.com/20175211lyz/p/14185590.html