攻防世界 —— Crypto新手练习区11题(Normal RSA)题解

题目分析

从题目就可以看出来这道题在考标准的RSA算法,而且会用到工具。下载附件解压后,发现有两个文件flag.enc和pubkey.pem。从文件的命名可知,前者就是加密后的flag,而后者是公钥。因为RSA是非对称加密算法,公钥加密,私钥解密,可以保证信息的机密性,而私钥加密,公钥解密,可以对信息进行签名,保证信息不可以被抵赖。这里用到的工具就是openssl,其中包含了许多常见的加密算法,可以使用它来查看公钥私钥,并加解密。为了避免安装openssl的麻烦,建议直接装一个kali虚拟机,其中自带了openssl工具,而且对于信息安全爱好者来说,kali真的是必不可少的学习工具。

攻防世界 —— Crypto新手练习区11题(Normal RSA)题解_第1张图片 kali中使用openssl

解题过程

开始我以为是用公钥直接去解密flag.enc,后来发现这样行不通。直到我看了一篇博客,才意识到应该是利用公钥求解出私钥,然后用私钥解密flag。接下来就按照博客中的步骤解出来了这道题。

1. 查看公钥

使用下面的命令,可以查看调用rsa算法的相应参数

OpenSSL> rsa -help

查看公钥pubkey.pem的命令如下

OpenSSL> rsa -pubin -text -modulus -in pubkey.pem

输出的公钥文件如下图,

攻防世界 —— Crypto新手练习区11题(Normal RSA)题解_第2张图片 使用openssl查看公钥文件pubkey.pem

我们便得到了公钥对(n, e),现在n还是十六进制,还需要转化成十进制再分解。

n = C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD
e = 65537

2. 分解整数n

分解n的工具有很多,之前推荐的RSA介绍里提供了三种,我是使用factordb网站进行的分解,分解得到的结果如下,

攻防世界 —— Crypto新手练习区11题(Normal RSA)题解_第3张图片 分解整数n

所以我们得知计算私钥时的两个大素数p, q为,

p=275127860351348928173285174381581152299
q=319576316814478949870590164193048041239

3. 使用脚本计算私钥

这里我偷懒没有自己写,就使用了开头介绍的那位博客的博主提供的一个python脚本,生成了一个私钥文件private.pem。

#coding=utf-8
import math
import sys
from Crypto.PublicKey import RSA
arsa=RSA.generate(1024)
arsa.p=275127860351348928173285174381581152299
arsa.q=319576316814478949870590164193048041239
arsa.e=65537
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()

4. 使用私钥解密flag

使用下面的命令就可以用刚生成的私钥文件解密flag.enc了,然后就可以看到flag。

OpenSSL> rsautl -decrypt -in flag.enc -inkey private.pem

 

 

你可能感兴趣的:(CTF)