1. 程式人生 > >關於rsa的openssl命令一些隨筆。

關於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 鬱離歌