首先对于pubkey.pem,我们可以使用openssl命令提取信息。
openssl rsa -pubin -in (文件名) -text
ps:只要文件名合法就能提取相关信息。
而对于private.pem,我们也可以使用openssl命令。
openssl rsa -in (文件名) -text
然后我们来介绍一下openssl 的rsautl:
加解密
1)公钥加密
openssl rsautl -encrypt -in test -out test.enc -inkey asn1pub.pem -pubin
2)私钥解密
openssl rsautl -decrypt -in test.enc -out test.dec -inkey asn1enc.pem
比较test和test.dec两个文件结果相同。
签名验证
1)私钥签名
openssl rsautl -sign -in test -out test.sig-inkey asn1enc.pem
2)公钥验证
openssl rsautl -verify -in test.sig -out test.vfy -inkey asn1pub.pem -pubin
例题
1.JarvisOJ Medium RSA
题目同时给出了flag.enc和pubkey.pem文件时,可以先使用openssl命令提取出n和e。
openssl rsa -pubin -in pubkey.pem -text -modulus
然后factordb.com分解一下p和q,得到:
p = 275127860351348928173285174381581152299
q = 319576316814478949870590164193048041239
随即直接写python脚本解密,
import libnum
from Crypto.Util.number import long_to_bytes
p = 275127860351348928173285174381581152299
q = 319576316814478949870590164193048041239
n = 87924348264132406875276140514499937145050893665602592992418171647042491658461
e = 65537
d = libnum.invmod(e, (p - 1) * (q - 1))
with open('flag.enc', 'r') as f:
c = f.read().encode('hex')
c = int(c, 16)
m = pow(c, d, n)
print long_to_bytes(m)
# 前面有一部分不知道为什么乱码,但是不影响看出flag
# ���&[�PCTF{256b_i5_m3dium}
2.HGAME WEEK3 BABY RSA
题目很有迷惑性的同时给出了pubkey.pem,flag.enc和private.pem。
首先没什么想法,直接对pubkey.pem使用 openssl命令
openssl rsa -pubin -in pubkey.pem -text -modulus
提取出n和e,发现n太大,根本没有分解的可能。所以它只是起到一个误导作用。
随机对private.pem使用openssl命令
openssl rsa -in private.pem -text -modulus
把提取出来的私钥存在private.key里面,使用openssl命令解密。
openssl rsautl -decrypt -in flag.enc -inkey private.key -out flag.de
openssl rsautl -decrypt -in flag.enc -inkey private.key -out flag.de -oaep
openssl rsautl -decrypt -in flag.enc-inkey private.key -out flag.de -pkcs
因为不知道是哪种填充方式,把命令都试试。最后发现是oarp填充。
解密得flag。
THINKING FOR YOUR READING!
–BY 郁离歌
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论