当前位置: 首页 > news >正文

buu RSA 1 (Crypto 第一页)

题目描述:

在这里插入图片描述
两个文件,都用记事本打开,记住用记事本打开

pub.key:

-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+
/AvKr1rzQczdAgMBAAE=
-----END PUBLIC KEY-----

flag.enc:

A柪YJ^ 
柛x秥?y[蔜?旭?緃沚

题目分析:

  • 显然第一个文件即时普通的公钥(n,e)解密文件,第二个文件是密文c解密文件,与
    buu [AFCTF2018]可怜的RSA 1 和 buu [HDCTF2019]together 1 很像
  • 公钥解密按套路来,可以用线上工具,也可以用脚本
    1.线上公钥解析网站:
    在这里插入图片描述

2.代码解密(将代码文件和 pub.key文件 放同一个文件夹):

from Crypto.PublicKey import RSA
with open('pub.key','rb') as f:key = RSA.import_key(f.read())print(key.n)print(key.e)
  • 得到:

n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
e = 65537

  • n 分解得 p,q:

p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

  • 最终便是求密文了,遇到此种一段乱码的直接用python脚本(记住就好,不必深究,挺简单的,记住将代码文件和 flag.enc文件 放同一个文件夹):
with open('flag.enc','rb') as f:print(libnum.s2n(f.read()))
  • 最终得到密文c:

c = 29666689760194689065394649908301285751747553295673979512822807815563732622178

  • 自此,所有未知数都已求出,完整代码如下:
from Crypto.PublicKey import RSA
import gmpy2
import libnum# with open('pub.key','rb') as f:
#     key = RSA.import_key(f.read())
#     print(key.n)
#     print(key.e)n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
e = 65537
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463# with open('flag.enc','rb') as f:
#     print(libnum.s2n(f.read()))c = 29666689760194689065394649908301285751747553295673979512822807815563732622178
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(libnum.n2s(int(m)))
  • 得到 flag{decrypt_256}

收获与体会:

  • 对于求公钥私钥的套路我们已了解,那么接下来我们来总结此种题型下求密文的方法(至今知道的有三种):

1.密文出现一段乱码的用以下代码:

with open('flag.enc','rb') as f:print(libnum.s2n(f.read()))

2.密文出现一串类似base64的字符串的有一下两种:
(1)第一种:

f1="R3Noy6r3WLItytAmb4FmHEygoilucEEZbO9ZYXx5JN03HNpBLDx7fXd2fl+UL5+11RCs/y0qlTGURWWDtG66eNLzGwNpAKiVj6I7RtUJl2Pcm3NvFeAFwI9UsVREyh7zIV6sI9ZP8l/2GVDorLAz5ULW+f0OINGhJmZm8FL/aDnlfTElhQ87LPicWpXYoMtyr6WrxjK6Ontn8BqCt0EjQ7TeXZhxIH9VTPWjDmFdmOqaqdVIT+LZemTgLNESwM5nn4g5S3aFDFwj1YiDYl0/+8etvKfOrfoKOwR0CxsRHagwdUUTES8EcHLmMGCxCkDZn3SzmmA6Nb3lgLeSgG8P1A=="
f2="O+rRCXI3aTB6P1rYIOPUdalUp6ujpwEq4I20CoWA+HIL8xxGtqY6N5gpr0guZv9ZgOEAMFnBxOqMdVNnB9GgnhmXtt1ZWydPqIcHvlfwpd/Lyd0XSjXnjaz3P3vOQvR71cD/uXyBA0XPzmnTIMgEhuGJVFm8min0L/2qI7wg/Z7w1+4mOmi655JIXeCiG23ukDv6l9bZuqfGvWCa1KKXWDP31nLbp0ZN2obUs6jEAa1qVTaX6M4My+sks+0VvHATrAUuCrmMwVEivqIJ/nS6ymGVERN6Ohnzyr168knEBKOVj0FAOx3YLfppMM+XbOGHeqdKJRLpMvqFXDMGQInT3w=="
c1 = bytes_to_long(base64.b64decode(f1)) # base64转字节后再转整数
c2 = bytes_to_long(base64.b64decode(f2)) # base64转字节后再转整数

(2)第二种(此种情况可在使用第一种方式下得不到答案的情况下使用,很特殊的一种方式):

import base64
from Crypto.Cipher import PKCS1_OAEPkey = RSA.construct((n, e, d, p, q))
key = RSA.importKey(key.exportKey())
key = PKCS1_OAEP.new(key)f = 'GVd1d3viIXFfcHapEYuo5fAvIiUS83adrtMW/MgPwxVBSl46joFCQ1plcnlDGfL19K/3PvChV6n5QGohzfVyz2Z5GdTlaknxvHDUGf5HCukokyPwK/1EYU7NzrhGE7J5jPdi0Aj7xi/Odxy0hGMgpaBLd/nL3N8O6i9pc4Gg3O8soOlciBG/6/xdfN3SzSStMYIN8nfZZMSq3xDDvz4YB7TcTBh4ik4wYhuC77gmT+HWOv5gLTNQ3EkZs5N3EAopy11zHNYU80yv1jtFGcluNPyXYttU5qU33jcp0Wuznac+t+AZHeSQy5vk8DyWorSGMiS+J4KNqSVlDs12EqXEqqJ0uA=='
c = base64.b64decode(f)
flag = key.decrypt(c)
print(flag)
http://www.lryc.cn/news/36927.html

相关文章:

  • Python 二分查找:bisect库的使用
  • 性能优化之HBase性能调优
  • 图像金字塔,原理、实现及应用
  • 08-Oracle游标管理(定义,打开、获取数据及关闭游标)
  • Python判断字符串是否包含特定子串的7种方法
  • aop实现接口访问频率限制
  • Hive---窗口函数
  • JavaSe第7次笔记
  • 什么是 Service 以及描述下它的生命周期。Service 有哪些启动方法,有 什么区别,怎样停用 Service?
  • Redis部署
  • AT32F437制作Bootloader然后实现Http OTA升级
  • Springboot项目启动初始化数据缓存
  • 深度学习必备知识——模型数据集Yolo与Voc格式文件相互转化
  • 数据、数据资源及数据资产管理的区别
  • 标度不变性(scale invariance)与无标度(scale-free)概念辨析
  • WMS仓库管理系统解决方案,实现仓库管理一体化
  • css常见定位、居中方案_css定位居中
  • 【微信小程序】-- 自定义组件 -- 创建与引用 样式(三十二)
  • ArangoDB——AQL编辑器
  • Lesson 9.1 集成学习的三大关键领域、Bagging 方法的基本思想和 RandomForestRegressor 的实现
  • basic1.0链码部署(基于test-network 环境ubuntu20.04腾讯云)
  • Android---系统启动流程
  • 【网络】http协议
  • Thread::interrupted() 什么意思? 如何中断线程?
  • Oracle OCP 19c 考试(1Z0-083)中关于Oracle不完全恢复的考点(文末附录像)
  • 一起来学习配置Combo接口吧!
  • C++模拟实现红黑树
  • HTTPS协议之SSL/TLS详解(下)
  • OLE对象是什么?为什么要在CAD图形中插入OLE对象?
  • 【微信小程序】-- 自定义组件 -- 数据、方法和属性(三十三)