[BUUCTF]rsa
给了两个文件, 一个加密后的文件, 一个公钥
,
开始我以为是用公钥
去解密私钥
加密的文件,
但是很多加密库都没有提供这样的功能, 比如OpenSSL
,
只有用公钥
验签的功能.
看了别人的WP才知道这个题是分解公钥的模
来实现算出私钥
再进行解密.
用OpenSSL
可以查看公钥
的一些信息
我们可以得知 \[ \begin{aligned} &e=65537\\ &n=C0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD \end{aligned} \]
而且公钥
比常见的要短很多, 只有256Bit
,
这为攻击提供了方便
一些分解模
的工具:
RsaCtfTool: Github //这个工具不支持Windows
yafu: Sourceforge
Msieve: Sourceforge
yafu
方式, 运行后进入yafu
命令行, 输入
1 | factor(0xC0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD) |
即可开始分解
RsaCtfTool
方式, 安装好后输入
1 | ./RsaCtfTool.py -n 0xC0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD -e 65537 --private --dumpkey |
工具就会综合判断自动采用合适的方式得出私钥(也可以直接用这个工具解密文件, 详细用法见Github)
RsaCtfTool
已经帮我们生成好了私钥
,
如果是用yafu
的话还需要计算一下d
我们已经得出 \[ \begin{aligned} &p=285960468890451637935629440372639283459 \\ &q=304008741604601924494328155975272418463 \end{aligned} \]
有了\(p\)和\(q\)就可以轻松求出欧拉函数
的值
\[\phi(n)=\phi(p)\times\phi(q)=(p-1)\times(q-1)\]
根据公式 \(ed\equiv1(\mod\phi(n))\),
则d
是e
模\(\phi(n)\)的模逆元
,
Python
可以通过gmpy2
这个库来求得
1 | from Crypto.PublicKey import RSA |