• 刷题记录:[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"))
    
  • 相关阅读:
    小阳买水果
    单调队列+dp
    最长的合法序列(栈+dp)
    A. 打印收费
    数位dp(K好数)
    Floyd(选地址)
    最短路计数
    线段树维护区间01
    解密(拓展欧几里的)
    树、森林的遍历
  • 原文地址:https://www.cnblogs.com/20175211lyz/p/14185590.html
Copyright © 2020-2023  润新知