这题是关于RSA解密相关的,下载题目文件后压缩包里有两个文件,分别是公钥和加密的文件,我们的思路就是通过公钥爆破出私钥,再根据私钥解密出密文
其中 .pem格式的是openssl的文件类型,所以我们需要用到openssl来解出RSA中的N 值与 e值,这个过程完全是可计算的,并不是爆破,毕竟传统的rsa公钥是(e,N)的形式,这里只是通过openssl把他格式化了一下
kali自带有openssl,可在 pubkey.pem的当前目录运行一下命令解出N值与e值
openssl rsa -pubin -text -modulus -in pubkey.pem
运行效果如下:
root@kali:~/CTF/openssl# ls
pubkey.pem
root@kali:~/CTF/openssl# openssl rsa -pubin -text -modulus -in pubkey.pem
RSA Public-Key: (256 bit)
Modulus:
00:c2:63:6a:e5:c3:d8:e4:3f:fb:97:ab:09:02:8f:
1a:ac:6c:0b:f6:cd:3d:70:eb:ca:28:1b:ff:e9:7f:
be:30:dd
Exponent: 65537 (0x10001)
Modulus=C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD
writing RSA key
-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr
yigb/+l/vjDdAgMBAAE=
-----END PUBLIC KEY-----
或者可以使用在线工具计算,http://tool.chacuo.net/cryptrsakeyparse
其中 "65537"就是 e值,而 "C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD" 是16进制的N值,我们需要把它转为10进制,我个人比较喜欢用python
root@kali:~/CTF/openssl# python3
Python 3.8.3 (default, May 14 2020, 11:03:12)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> int(0xC2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD)
87924348264132406875276140514499937145050893665602592992418171647042491658461
>>>
这就计算出了N值,这时候我们需要通过类似爆破的方式来计算 p值与q值,可以用过在线网站进行计算,网址:http://www.factordb.com/index.php,下面是解密结果:
下面我们就可以根据rsa加密的原理进行计算出密钥,使用到的一个工具是rsatool,安装方法:
git clone https://github.com/ius/rsatool.git
cd rsatool //进入这个目录
python setup.py install
然后可以使用下面的命令生成密钥文件:
python rsatool.py -o private.pem -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239 -e 65537
运行完成后即可在目录下生成一个私钥文件 private.pem,将 private.pem 与 flag.enc 放在同一个目录下,然后运行openssl解密,计算出 加密的明文信息
openssl rsautl -decrypt -in flag.enc -inkey private.pem
下面是运行效果:
root@kali:~/CTF/openssl# ls
flag.enc private.pem
root@kali:~/CTF/openssl# openssl rsautl -decrypt -in flag.enc -inkey private.pem
PCTF{256b_i5_m3dium}
root@kali:~/CTF/openssl#
可以看到加密后的信息被解密出来了