关于rsa的openssl命令一些随笔。

openssl用来对一些标准格式的rsa加解密。

首先对于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 郁离歌







你可能感兴趣的:(密码学学习)