• XD MakerCTF 2019 easy_rsa


      说实话,这是第一次接触rsa类型的ctf题目,以前太菜了,下午无聊就研究了这道题。

      关于RSA,我已经在上学期的密码学课程中了解到了,但是一直没有实战过,我参考到一个不错的博客做出了这道题: https://www.freebuf.com/sectool/163781.html ,主要内容是围绕命令行工具 openssl 、常用的集中rsa分解大数工具如yafu.exe 和python脚本(用到几个库) 对公钥、密文破解得到私钥 p、q,继续解密。

      这里的数论知识我就不再堆砌了……

      打开压缩包:

      这里有两个文件,其中_MAXOSX是mac系统生成自带的文件,像是个目录,没有太多意义,直接进入easy_RSA:

      分析一下上面的文件结构:flag.enc存放密文,是加密后的flag。pubkey.pem名如其物,存放公钥(n、e)。

      直接提取公钥:

      上图中Exponent代表公钥参数e,Moudules代表参数n。关于pem文件的相关知识基础(文件结构等),我推荐一个博客地址方便理解:https://blog.csdn.net/tuhuolong/article/details/42778945  

      紧接着用yafu工具进行破解,这款工具的使用方法我参照了文章开头参照的博客:

      如上图,大概五分钟后,分解出n的大素数因子p、q。

      然后用脚本求出公钥e对应的私钥n:

     1 import math
     2 import sys
     3 from Crypto.PublicKey import RSA
     4 
     5 keypair = RSA.generate(1024)
     6 keypair.p = 440140550843727826962832356360132665339
     7 keypair.q = 420226057252427765877741059207519510621
     8 keypair.e = 65537
     9 
    10 keypair.n = keypair.p * keypair.q  #公钥 大数n
    11 Qn = long((keypair.p-1) * (keypair.q-1)) #欧拉函数(n)
    12 
    13 i = 1
    14 while (True):
    15     x = (Qn * i ) + 1
    16     if (x % keypair.e == 0):
    17         keypair.d = x / keypair.e  #求出e关于Qn的模逆n
    18         break
    19     i += 1
    20 
    21 private = open('private.pem','w') #新建私钥pem
    22 private.write(keypair.exportKey()) #写入私钥
    23 private.close()

       紧接着,执行如下命令解密密文flag.enc:

    openssl rsautl -decrypt -in flag.enc -inkey private.pem -out flag.txt
    

    Done.

  • 相关阅读:
    Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证
    Python3连接MySQL数据库实战
    Python3 报错'latin-1' codec can't encode character 解决方案
    python 操作excle 之第三方库 openpyxl学习
    对象的深拷贝和浅拷贝
    手机wap站全屏展示隐藏地址栏和状态栏代码
    JS调用App方法及App调用JS方法
    Vue里给v-html元素添加样式
    为什么JavaScript中移动端使用ontouchend无法获取touches数组
    什么是并发和并行
  • 原文地址:https://www.cnblogs.com/Higgerw/p/10671690.html
Copyright © 2020-2023  润新知