解压文件包发现两个文件,flag.enc和pub.pem两个文件。首先我们会想到openssl。这类题目需要用linux的openssl来解。openssl是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
第一步:在kali中使用命令:
openssl rsa -pubin -text -modulus -in warmup -in pub.pem
得到:
E=65537
N=439AEAB34EAEE973E968EBDD11D6D3EF7302072C4BFD4F7FE2B0CF9889277F6D
第二步:我们把N转换成10进制,在这里我使用了python的进制转换函数 int(x,16)。将16进制转换成10进制。
于是,我们得到 N=30578675145816634962204467309994126955968568987449100734690153203822106214253
第三步:分解N得出P和Q以便求出私钥D
这里的话暂时来说有两种方法,第一种:http://factordb.com/这个网站。输入N基本会分解出P和Q。但也有时候输入N分解不出P和Q,那么久用第二种方法。
第二种方法:
软件yafu:用于自动整数因式分解,在RSA中,当p、q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p、q值,原理是使用Fermat方法与Pollard rho方法。
首先打开cmd,进入yafu所在路径,输入yafu-64的命令,进入yafu工作阶段。输入
factor(30578675145816634962204467309994126955968568987449100734690153203822106214253)然后回车
得到P=3487583947589437589237958723892346254777
Q=8767867843568934765983476584376578389
第四步:求出D
在kali中使用python生成私钥,脚本如下:
#coding=utf-8
import math
import sys
from Crypto.PublicKey import RSA
arsa=RSA.generate(1024)
arsa.p=
arsa.q=
arsa.e=
arsa.n=arsa.p*arsa.q
Fn=long((arsa.p-1)*(arsa.q-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的文件
第五步:解密
在kali终端输入openssl进入openssl
输入rsautl -decrypt -in flag.enc(密文名称) -inkey private.pem(我们所求得密钥名称)
得到flag。
总结来说,解决此类RSA解密的题目(提供enc和pem文件类)步骤还是比较固定的,得到flag一般需要五步。
第一步:在kali中使用命令:openssl rsa -pubin -text -modulus -in warmup -in pub.pem得到E和N的值。
第二步:使用python把16进制的N转换成10进制。
第三步:分解N得出P和Q以便求出私钥。
第四步:在kali中使用python脚本生成私钥D。
第五步:在kali终端输入openssl进入openssl输入rsautl -decrypt -in flag.enc(密文名称) -inkey private.pem(我们所求得密钥名称)得到flag。