BUUCTF_Crypto题目:rsa2

本文记录了一道CTF竞赛中关于RSA解密的题目,通过分解大数n获取p和q,计算私钥d,并在Python2与Python3中处理d值的差异,最终计算MD5得出flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BUUCTF刷题Crypto篇



前言

一道很简单的已知n和e,求RSA私钥d的题目。可以借助在线网站分解n得到p和q的网站分解n得到p和q的值,接下来就是各种套用RSA理论知识里的各计算式。想要记录一下这道题的原因在于最后计算结果的过程中有一点小坑,涉及了Python2和Python3在输出方面存在的区别。


一、原题

打开题目文件如下,已知n和e,拿到flag需要求出d再计算md5的结果。可见这是一道求解步骤比较少的题目,甚至都不涉及RSA中的c和m,只需要求出私钥d,然后再按照题目给的式子去计算md5即可。
原题文件内容

二、解题步骤

1.分解n进而求解出d的值

借助在线网站分解n得到p和q的网站,对大数n做质因数分解,得到p和q,然后根据RSA的理论知识,已知e,求解d还需要计算(p-1)*(q-1),然后调用gmpy2模块的invert函数就可得d。

2.根据原题处理d值并输出

这里就是按照原题给的计算式去处理d值,这里有个小坑,就是由于Python2和Python3有一点区别,在Python3中,hex(d)得到的值在输出形式上相比Python2少了一个末尾的L,再用这个值去做hash得到的md5值也就不同了。经实验发现,正确的结果可以用Python2直接得到,或在Python3中做hash时给参数末尾加上L。
给出Python3的代码如下:

import gmpy2
import hashlib
from Crypto.Util.number import *
n=101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471
p=9046853915223503351787031888977627106934564043204783593118678181991596316582877057556463152579621699010610569526573031954779520781448550677767565207407183
q=11273732364123571293429600400343309403733952146912318879993851141423284675797325272321856863528776914709992821287788339848962916204774010644058033316303937
phi=(p-1)*(q-1)
e=46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085
d=gmpy2.invert(e,phi)
print(d)
print(hex(d))
#hex(d)='0x13b8f87d588e2aa4a27296cf2898f56ab4c8deb5a1222ec080e23afecaf7f975'

''' 但python3中hex(d)得到的数字最后没有L,导致hash值与python2得到的不同,而正确的flag是用python2得到的结果,所以这里我手动加上了L'''
print(hashlib.md5(b'0x13b8f87d588e2aa4a27296cf2898f56ab4c8deb5a1222ec080e23afecaf7f975L').hexdigest())

运行结果如下:
输出的三行分别是d,hex(d),和最终的flag{}内的字符串
运行结果


总结

以上就是这题要记录的全部内容了,做题的过程中要多多尝试~

### BUUCTF 密码学挑战及相关资源 BUUCTF 是一个提供多种信息安全领域挑战的平台,其中密码学部分涵盖了广泛的题目类型和技术难度。通过参与这些活动可以提升个人在加密算法分析、密钥管理以及破解技术方面的能力[^1]。 对于初学者来说,在 BUUCTF 上可以从基础级别的 Caesar Cipher 或 Vigenère cipher 开始尝试解决简单的问题。随着经验积累,参与者能够逐步接触更复杂的现代加密标准如 AES (Advanced Encryption Standard),RSA 等公私钥体系下的应用实例。 除了在线解题外,社区还提供了丰富的学习资料来帮助用户理解背后的工作原理: - **官方文档与教程**:包含详细的理论介绍和实践指南。 - **论坛交流区**:与其他爱好者分享心得并寻求建议的地方。 - **外部链接集合**:指向其他优质教育资源网站或书籍推荐列表。 ```python import requests def fetch_buu_ctf_challenges(): url = "https://buuoj.cn/api/challenges" response = requests.get(url) if response.status_code == 200: data = response.json() crypto_challenges = [ challenge for challenge in data['data'] if 'crypto' in challenge['category'].lower() ] return crypto_challenges raise Exception(f"Failed to retrieve challenges, status code {response.status_code}") challenges = fetch_buu_ctf_challenges() for index, item in enumerate(challenges[:5], start=1): print(f"{index}. Title: {item['name']}, Category: {item['category']}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值