这道题的关键点有三个:
1.如何正确打开一个未知文件。应该是修改后缀,但如何知道其真实后缀?可以靠经验,也可以靠Kali的file命令来判断。我个人靠经验判断。
2.使用公钥解析工具。如果看见“-----BEGIN PUBLIC KEY-----”与“-----END PUBLIC KEY-----”,可到网站上做公钥解析。(附网站:SSL在线工具-公钥解析)
3.发现最基本的RSA解题模型解出的明文m实际上无效怎么办?可以去算完整私钥来做解密而不仅仅是用私钥指数d。
下面是完整解题流程:
下载得到直接打开无效的未知类型文件,但是看见“.gz”,我凭经验猜测文件拓展名可能是“.tar.gz‘”。(导致源码泄露的其中一种可能的后缀)结果成功打开,发现有两个文件。
(后来发现这边的“.tar.gz”自己变成“.tar”打开了)
其中一个显然是密文,而另一个文件中有关键字“-----BEGIN PUBLIC KEY-----”与“-----END PUBLIC KEY-----”,于是到网站 SSL在线工具-公钥解析 做公钥解析,于是获得公钥指数e和公共模数n,然后借助网站 factordb.com (yafu算得慢得多)算出质数p与q。
有了上面这些信息,可尝试用最基本的RSA脚本来解密文,最后发现解出来的密文貌似没有用。于是改变思路,算出完整私钥priv,然后再利用完整私钥解密文。
但是这样貌似也有问题,最后发现是密文的形式异常,尤其是末尾有个等号,于是尝试在python中将其base64解密(相关的base64解密网站可能解不好),然后再用完整私钥解密,于是获得flag。下面是完整脚本:
import libnum
import gmpy2
from Crypto.Util import *
from Crypto.Util.number import *
from functools import reduce
import functools
#上面是我几乎做每一道RSA都会用到的东西。下面是求完整私钥与做base64所需的东西
from Crypto.PublicKey import RSA
import rsa
import base64
p=863653476616376575308866344984576466644942572246900013156919
q=965445304326998194798282228842484732438457170595999523426901
n=833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019
e = 65537
ou=(q-1)*(p-1)
d=inverse(e,ou)
priv=rsa.PrivateKey(n,e,d,p,q)
c='Ni45iH4UnXSttNuf0Oy80+G5J7tm8sBJuDNN7qfTIdEKJow4siF2cpSbP/qIWDjSi+w=' #文件中的密文
#我看其他题解总想以文件读取的形式来获取这个字符串,但事实上此处并不需要那样做。
c=base64.b64decode(c)
flag=rsa.decrypt(c,priv)
print(flag)
得到flag: