1. 题目背景与核心挑战
这道来自ACTF新生赛2020的RSA密码学题目,是典型的CTF竞赛中中等难度的crypto挑战。题目给出了两个关键文件:output.txt包含加密后的flag,而public.pem则是RSA公钥文件。这类题目通常考察选手对RSA算法漏洞的识别能力以及相关数学工具的应用技巧。
在实际解题过程中,我发现这道题的核心突破口在于公钥文件中隐藏的模数(n)数值异常。通过分析发现这个n值特别小,完全可以通过暴力分解的方式获取其质因数p和q。这种设置是CTF竞赛中常见的"陷阱",旨在考察选手对RSA基础原理的理解程度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键工具与准备
2.1 必要工具安装
首先需要准备以下工具链:
- OpenSSL:用于解析公钥文件
- Python3:主要解题环境
- gmpy2库:处理大数运算
- PyCryptodome:RSA相关操作
安装命令示例:
bash复制pip install pycryptodome gmpy2
2.2 公钥信息提取
使用OpenSSL解析公钥文件:
bash复制openssl rsa -pubin -in public.pem -text -noout
这个命令会输出模数n和公开指数e。在本案例中,我们发现n的值仅为:
code复制n = 1648185017903695061726031131650959810372682661095751691712442489210293950430063800713
而e采用的是常见的65537。
3. 模数分解实战
3.1 因数分解方法选择
对于这样相对较小的n值(仅52位),我们可以采用以下几种分解方法:
- 在线分解网站(如factordb.com)
- 本地使用yafu工具
- 自己编写Pollard's Rho算法实现
我选择使用factordb.com进行快速分解,得到:
code复制p = 12448414899925726053949032014721
q = 13257575838392572916945256599753
注意:在实际CTF比赛中,如果网络受限无法使用在线工具,建议提前准备好本地的yafu工具。
3.2 私钥参数计算
得到
