RSA解密-提供enc和pem文件类
RSA解密
——提供enc和pem文件类
解压文件包发现两个文件,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
keypair = RSA.generate(1024)
keypair.p =3487583947589437589237958723892346254777
keypair.q =8767867843568934765983476584376578389
keypair.e = 65537
keypair.n = keypair.p * keypair.q
Qn = long((keypair.p-1) * (keypair.q-1))
i = 1
while (True):
x = (Qn * i ) + 1
if (x % keypair.e == 0):
keypair.d = x / keypair.e
break
i += 1
private = open('private.pem','w')
private.write(keypair.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。