zoukankan      html  css  js  c++  java
  • [BUUCTF]REVERSE——rsa

    rsa

    附件

    题目是rsa,首先了解一下什么是rsa加密,具体的看这个文章

    首先大概介绍下RSA加密解密
    在这里插入图片描述

    RSA加密是对明文的E次方后除以N后求余数的过程
    
    公钥n = p * q,其中p和q是两个大素数
    
    e是随机选择的数,作为公钥
    

    在这里插入图片描述

    从通式可知,只要知道E和N任何人都可以进行RSA加密了
    所以说E、N是RSA加密的密钥,也就是说E和N的组合就是公钥,
    我们用(E,N)来表示公钥
    

    在这里插入图片描述

    密文进行D次方后除以N的余数就是明文,这就是RSA解密过程
    

    在这里插入图片描述

    知道D和N就能进行解密密文了,所以D和N的组合就是私钥
    

    在这里插入图片描述
    在这里插入图片描述

    知道了RSA的原理后来看这道题

    附件有两个,一个公钥,还有一个应该是密文
    在这里插入图片描述
    我们首先可以利用这个在线网站,分解公钥得到E和N
    在这里插入图片描述
    E=65537 (0x10001)
    N=0xC0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD

    N=p*q
    我们可以利用这个工具网站直接分解N得到p和q(记得将N转换为10进制去分解)
    在这里插入图片描述
    p= 285960468890451637935629440372639283459
    q=304008741604601924494328155975272418463

    知道了p和q后我们根据L=lcm(p-1,q-1) (L为p-1、q-1的最小公倍数)就可以算出L,有了L和E可以根据1 < D < L,E*D mod L = 1算出D,有了D和N我们就可以根据明文=密文^D mod N来解密出明文了

    原理看懂了,上exp

    import gmpy2 
    import rsa 
     
    e = 65537
    n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
    p = 285960468890451637935629440372639283459
    q = 304008741604601924494328155975272418463
    
    phin = (q-1)*(p-1)
    
    d = gmpy2.invert(e, phin)
    
    key = rsa.PrivateKey(n, e, int(d), p, q)
    
    with open("G:\output\flag.txt", "rb+") as f:
        f = f.read()
        print(rsa.decrypt(f, key))
    

    在这里插入图片描述

    exp中用到了两个模块,rsa和gmpy2,没有安装的可以看我这篇文章

  • 相关阅读:
    第一类第二类丢失更新
    收藏文章
    Oracle常见授权与回收权限——grant和revoke
    web.xml组件加载顺序
    Java的native方法
    serialVersionUID作用
    Css选择器和JQuery基本编程接口
    使用Spring IoC进行Bean装配
    关于C/C++的一些思考(5)
    关于C/C++的一些思考(4)
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273660.html
Copyright © 2011-2022 走看看