题目分析
从题目就可以看出来这道题在考标准的RSA算法,而且会用到工具。下载附件解压后,发现有两个文件flag.enc和pubkey.pem。从文件的命名可知,前者就是加密后的flag,而后者是公钥。因为RSA是非对称加密算法,公钥加密,私钥解密,可以保证信息的机密性,而私钥加密,公钥解密,可以对信息进行签名,保证信息不可以被抵赖。这里用到的工具就是openssl,其中包含了许多常见的加密算法,可以使用它来查看公钥私钥,并加解密。为了避免安装openssl的麻烦,建议直接装一个kali虚拟机,其中自带了openssl工具,而且对于信息安全爱好者来说,kali真的是必不可少的学习工具。
解题过程
开始我以为是用公钥直接去解密flag.enc,后来发现这样行不通。直到我看了一篇博客,才意识到应该是利用公钥求解出私钥,然后用私钥解密flag。接下来就按照博客中的步骤解出来了这道题。
1. 查看公钥
使用下面的命令,可以查看调用rsa算法的相应参数
1 | OpenSSL> rsa -help |
查看公钥pubkey.pem的命令如下
1 | OpenSSL> rsa -pubin -text -modulus -in pubkey.pem |
输出的公钥文件如下图,
我们便得到了公钥对(n, e),现在n还是十六进制,还需要转化成十进制再分解。
1 2 | n = C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD e = 65537 |
2. 分解整数n
分解n的工具有很多,之前推荐的RSA介绍里提供了三种,我是使用factordb网站进行的分解,分解得到的结果如下,
所以我们得知计算私钥时的两个大素数p, q为,
1 2 | p=275127860351348928173285174381581152299 q=319576316814478949870590164193048041239 |
3. 使用脚本计算私钥
这里我偷懒没有自己写,就使用了开头介绍的那位博客的博主提供的一个python脚本,生成了一个私钥文件private.pem。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #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。
1 | OpenSSL> rsautl -decrypt -in flag.enc -inkey private.pem |