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