本篇文章介紹使用 openssl 使用指令進行 RSA 加解密。包含使用 PEM 和 DER 格式,以及使用 Base64 格式的方法。

加密

首先我們把明文存在檔案裡,例如 message.txt:

1
test

有兩種指令可以使用。

rsautl

PEM

使用公鑰來加密

1
openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt -out encrypted

將加密後的資料存成檔案 encrypted

可以使用不同的 padding

1
2
3
4
5
-ssl                     Use SSL v2 padding
-raw Use no padding
-pkcs Use PKCS#1 v1.5 padding (default)
-oaep Use PKCS#1 OAEP
-x931 Use ANSI X9.31 padding

DER

使用公鑰來加密

1
openssl rsautl -encrypt -inkey public.der -pubin -keyform DER -in message.txt -out encrypted

pkeyutl

這指令功能比較全面,基本用法完全一樣

PEM

1
openssl pkeyutl -encrypt -inkey public.pem -pubin -in message.txt -out encrypted

rsautl 不同的是,他可以用更多的參數。例如使用 oaep 時,rsautl 固定使用 sha1pkeyutl 則可以自訂其他演算法:

1
openssl pkeyutl -in message.txt -inkey public.pem -pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256

DER

使用公鑰來加密

1
openssl pkeyutl -encrypt -inkey public.der -pubin -keyform DER -in message.txt -out encrypted

解密

rsautl

PEM

使用私鑰解密

1
openssl rsautl -decrypt -inkey private.pem -in encrypted

DER

1
openssl rsautl -decrypt -inkey private.der -keyform DER -in encrypted

pkeyutl

PEM

使用私鑰解密

1
openssl pkeyutl -decrypt -inkey private.pem -in encrypted

DER

1
openssl pkeyutl -decrypt -inkey private.der -keyform DER -in encrypted

使用 Base64

上面產生的密文是二進位資料,如果想轉成 Base64 可以用以下寫法:

加密

1
openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt | openssl enc -base64 -out encrypted

1
openssl pkeyutl -encrypt -inkey public.pem -pubin -in message.txt | openssl enc -base64 -out encrypted

解密

先將 Base64 轉成二進位資料存到暫存的 .tmp,再進行原來的檢驗流程:

1
openssl enc -d -base64 -in encrypted -out .tmp && openssl rsautl -decrypt -inkey private.pem -in .tmp && rm .tmp

延伸閱讀

OpenSSL 指令產生 RSA 私鑰和公鑰