RSA破解
解题链接: http://ctf5.shiyanbar.com/crypto/RSA
1.点击链接得到一个压缩包。点击开里面有两个文件,分别是flag.enc和public.pem这两个文件。
首先我们会想到openssl。
openssl:是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
一般做RSA 的题只需用到两个命令到时候我们在详细说明。
2.打开kali(kali里的openssl可以直接使用,但windows下的需要花钱。)
进入终端,输入openssl进入openssl状态。
输入这个命令rsa -pubin -text -modulus -in public.pem(public.pem 是你自己的文件名)读取N 和E。
我们看到了N=A41006DEFD378B7395B4E2EB1EC9BF56A61CD9C3B5A0A73528521EEB2FB817A7
E=65537
我们首先将N转换成10进制,在这里我使用了python的进制转换函数 int(x,16)。将16进制转换成10进制。
于是我们得到了N=74207624142945242263057035287110983967646020057307828709587969646701361764263
3.分解N得出P和Q以便求出私钥D
在这里介绍两种方法。(当然我也只会这两种,本人纯小白一枚,python都不太会写)
第一种:http://factordb.com/这个网站。输入N基本会分解出P和Q。
第二种:软件yafu:用于自动整数因式分解,在RSA中,当p、q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p、q值,原理是使用Fermat方法与Pollard rho方法
首先打开cmd,进入yafu所在路径,输入yafu-64的命令,进入yafu工作阶段。输入factor(74207624142945242263057035287110983967646020057307828709587969646701361764263)点击回车会出现
这样我们就得到了P=258631601377848992211685134376492365269
Q=286924040788547268861394901519826758027
4.求出D
可在这里我通过工具求出了D 但无法在openssl中进行解开密文。因为题中所给的密文是flag.enc我们正常没有办法打开。而用openssl对其进行解密需要按其格式来的密钥,即pem后缀。当然脑洞不小的我,尝试将D放入txt文件中,在进行改文件名。但在openssl中无法使用。我又查了各种enc后缀结尾文件的打开命令,但没有搜到什么。于是找了一下,发现可以用pythonq来写生成可用的私钥。
于是我们来写吧。(之前说过不会python,所以代码借鉴于http://blog.csdn.net/dongyanwen6036/article/details/76900001。)
import math import sys from Crypto.PublicKey import RSA arsa=RSA.generate(1024) arsa.p=258631601377848992211685134376492365269 arsa.q=286924040788547268861394901519826758027 arsa.e=65537 arsa.n=arsa.p*arsa.q Fn=long((arsa.p-1)*(arsa.q-1)) #此处原理e*d=Fn*i+1 i=1 while(True): x=(Fn*i)+1 if(x%arsa.e==0): arsa.d=x/arsa.e break i=i+1 private=open('private.pem','w') private.write(arsa.exportKey()) private.close()
在kali里运行会在home里发现生成的private.pem文件。至此我们找到了D
5.解密
在kali终端输入openssl进入openssl
输入rsautl -decrypt -in flag.enc(密文名称) -inkey private.pem(我们所求得密钥名称)
看这样我们就得到明文了!
是不是很开心!
注:本人纯属小白,为了自己更好的理解,和掌握知识。不喜勿喷。