攻防世界-密码学-equation-2
题目信息
题目描述“RSA私钥上面的部分被屏蔽了请恢复私钥并解密文件”,附件给出私钥编码的截图,但是只能看见最后5行。
分析
OpenSSL私钥结构
私钥信息按如下顺序排列:
version | pad | n | pad | e | pad | d | pad | p | pad | q | pad | x1 | pad | x2 | pad | x3
其中,pad是填充信息,各pad并不同,$x_{1}= d\ \textrm{mod}\ (p-1),x_{2}= d\ \textrm{mod}\ (q-1),x_{3}=p^{-1}\ \textrm{mod}\ q$,填充pad用来注释接下来的大数的(字节)长度,\x02为pad开头的标记,有时后面接\x81或\x82,这用来标记长度值所占用的字节(\x81代表占用1个字节,\x82代表占用2个字节),有时后面不接\x81或\x82而直接放置长度;
例:\x02\x03代表接下来的大数的字节长度为3个字节;\x02\x81\x80,首先,\x81代表长度占用1个字节,因此\x80就是长度值,即128,表明接下来的大数的字节长度为128个字节。
将私钥信息按照上述顺序排列好之后,再进行base64编码。
利用已知信息恢复私钥
截图可见编码为1
Os9mhOQRdqW2cwVrnNI72DLcAXpXUJ1HGwJBANWiJcDUGxZpnERxVw7s0913WXNtV4GqdxCzG0pG5EHThtoTRbyX0aqRP4U/hQ9tRoSoDmBn+3HPITsnbCy67VkCQBM4xZPTtUKM6Xi+16VTUnFVs9E4rqwIQCDAxn9UuVMBXlX2Cl0xOGUF4C5hItrX2woF7LVS5EizR63CyRcPovMCQQDVyNbcWD7N88MhZjujKuSrHJot7WcCaRmTGEIJ6TkU8NWt9BVjR4jVkZ2EqNd0KZWdQPukeynPcLlDEkIXyaQx
解码后结合OpenSSL私钥结构分析可得:x1,x2,x3为已知;但是仅有x1,x2,x3并不能恢复出p,q与d,若我们假设e为常用的指数3,65537等等,则可试出p与q:
$d\cdot e\equiv 1\ \textrm{mod}\ (p-1)(q-1)$
则有$d\cdot e\equiv 1\ \textrm{mod}\ (p-1)$与$d\cdot e\equiv 1\ \textrm{mod}\ (q-1)$;
由$x_{1}$与$x_{2}$的定义可得$x_{1}\cdot e\equiv 1\ \textrm{mod}\ (p-1)$,$x_{2}\cdot e\equiv 1\ \textrm{mod}\ (q-1)$;
因此$(p-1)|(x_{1}\cdot e-1)$;
记$x_{1}\cdot e-1=r_{1}\cdot (p-1)$;
由于$x_{1}= d\ \textrm{mod}\ (p-1)$,则$x_{1}<(p-1)$;
几乎可以看做$x_{1}\cdot e=r_{1}\cdot (p-1)$,那么必有$r_{1}<e$;
同理可得$r_{2}<e$,其中$x_{2}\cdot e-1=r_{2}\cdot (q-1)$
可以看到,$r_{i}<e,i=1,2$,从而可使用试除法求出$r_{i},i=1,2$;
则$p=(x_{1}\cdot e-1)/r_{1}+1,q=(x_{2}\cdot e-1)/r_{2}+1$;
解题
实现的Python脚本如下:
1 | from Crypto.Util.number import bytes_to_long,isPrime,inverse |
注:这里之所以猜测e为65537而不是3是因为$r_{i}<e,i=1,2$,如果e=3可能情况太少。
程序运行结果如下:
1 | $ python solve.py |