进入题目后下载附件,发现是2个文件,flag.enc和pubkey.pem。猜测分别为加密后的flag和RSA公钥。
其中,pubkey.pem文件内容如下:
-----BEGIN PUBLIC KEY----- MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr yigb/+l/vjDdAgMBAAE= -----END PUBLIC KEY-----
要想解密flag,必须使用私钥。
第1步,使用openssl从pubkey.pem中提取出e和modulus(即大素数)的值。
rsa指令说明:
root@kali:~# openssl rsa -help Usage: rsa [options] Valid options are: -help Display this summary -inform format Input format, one of DER PEM -outform format Output format, one of DER PEM PVK -in val Input file -out outfile Output file -pubin Expect a public key in input file //指定输入文件是公钥 -pubout Output a public key -passout val Output file pass phrase source -passin val Input file pass phrase source -RSAPublicKey_in Input is an RSAPublicKey -RSAPublicKey_out Output is an RSAPublicKey -noout Don't print key out -text Print the key in text //以明文形式输出各个参数值 -modulus Print the RSA key modulus //输出模数值 -check Verify key consistency -* Any supported cipher -pvk-strong Enable 'Strong' PVK encoding level (default) -pvk-weak Enable 'Weak' PVK encoding level -pvk-none Don't enforce PVK encoding -engine val Use engine, possibly a hardware device
命令:openssl rsa -pubin -text -modulus -in pubkey.pem
第2步,进制转换,将modulus从16进制转换为十进制。
在线进制转换工具:https://tool.lu/hexconvert/
Modulus(十六进制)=C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD
Modulus(十进制)=87924348264132406875276140514499937145050893665602592992418171647042491658461
所以现在知道了
p=275127860351348928173285174381581152299
q=319576316814478949870590164193048041239
e=65537
第4步,使用rsatool工具生成私钥。
安装:
git clone https://github.com/ius/rsatool.git cd rsatool-master/ //进入这个目录 python setup.py install
如果安装出现问题,请参考:https://blog.csdn.net/jcbx_/article/details/97250664
命令:python rsatool.py -o prikey.pem -e 65537 -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239
第5步,使用私钥解密flag。
命令:openssl rsautl -decrypt -in flag.enc -inkey prikey.pem
参考: