OpenSSL AES encryption 對稱式加密指令用法與範例

本篇 ShengYu 介紹 OpenSSL AES encryption and decryption 對稱式加密解密指令用法與範例,AES 是典型的對稱式加密演算法,對稱式加密演算法是可逆的,也就是用一個金鑰加密後可以再用同一個金鑰解密回來,而 AES 全名是 Advanced Encryption Standard 是用來取代原先的 DES (Data Encryption Standard) 演算法,AES 是目前主流的加密演算法,常見對稱式加密演算法的應用像是將檔案壓成壓縮時 (zip/7-zip) 如果要設定密碼加密就會使用到。

以下 OpenSSL AES 加密解密的指令用法介紹將分為這幾部份,

  • 檢查 OpenSSL 版本
  • OpenSSL AES encryption 加密/解密檔案
  • OpenSSL AES encryption 加密/解密文字

那我們開始吧!

檢查 OpenSSL 版本

在使用 OpenSSL 之前,要先檢查確認 OpenSSL 版本,輸入 openssl version 指令可以顯示 OpenSSL 的版本,

1
2
$ openssl version
OpenSSL 1.1.1n 15 Mar 2022

目前來說是比較建議使用 OpenSSL 1.1.1 之後的版本,之前的版本有一些安全性 bug 不建議使用,建議要裝有 -pbkdf2 選項的 OpenSSL 版本。
有些平台會使用 LibreSSL,LibreSSL 是從 OpenSSL 1.0.1g 分支出來的,那麼可能有些選項跟 openssl 不一樣。

OpenSSL AES encryption 加密/解密檔案

這邊介紹 OpenSSL AES-256 encryption 加密與解密檔案指令的用法,使用 openssl list-cipher-commands 選項可以列出有哪些加密模式可以選擇,在本範例我們使用 aes-256-cbc 選項,AES-256 表示 key 金鑰長度使用 256 bits,目前有 128、192 或 256 bits 可以選擇,而其中以 AES-256 安全性最高,CBC 是 AES 的其中一種模式,

openssl 對稱式加密有兩種使用方式,一種是直接指定要用的加密演算法,例如直接指定 AES-256 CBC:openssl aes-256-cbc ,另外一種是使用 enc 的方式,在 openssl enc 後面參數再指定要使用的加密演算法,例如:openssl enc -aes-256-cbc,enc 是將 openssl 提供多個對稱式加密演算法集成到一個指令中,而且 enc 可以指定對稱式加密演算法指令沒有提供的選項,所以建議使用 openssl enc 這種方式,openssl AES 解密檔案指令如下,

1
2
3
$ openssl enc -aes-256-cbc -pbkdf2 -in plain.txt -out encrypted.txt
# 或者
$ openssl aes-256-cbc -pbkdf2 -in plain.txt -out encrypted.txt

openssl enc -aes-256-cbc 常見選項有:
-in: 輸入檔案
-out: 輸出檔案
-e: 加密(預設)
-d: 解密
-a: 文字格式輸出,base64
-md: Openssl 1.1.0 才從 md5 改為 sha-256,目前 sha-256 為預設
-pass pass:: 指定加密/解密密碼,否則會顯示提示訊息讓你輸入密碼
-salt: 加鹽(預設),用於 password 推導成 key 的過程中
-nosalt: 不加鹽,除非測試才時使用
-S salt: 指定鹽
-p: 印出 salt, key and IV
-P: 印出 salt, key and IV 且立即結束程式,不做任何加解密
-pbkdf2: Openssl 1.1.1 才有,建議使用此選項
-iter: password 推導成 key 的迭代次數
-z: 在加密前壓縮,使用zlib,前提是這個openssl在編譯時有加入zlib選項。

執行後會要你輸入 password,並且重新輸入 password 一次確認,之後就會進行加密,

1
2
3
$ openssl enc -aes-256-cbc -pbkdf2 -in plain.txt -out encrypted.txt
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:

openssl AES 解密檔案的話就使用下列指令,

1
2
3
$ openssl enc -aes-256-cbc -pbkdf2 -d -in encrypted.txt -out plain.txt
# 或者
$ openssl aes-256-cbc -pbkdf2 -d -in encrypted.txt -out plain.txt

OpenSSL AES encryption 加密/解密文字

這邊介紹 OpenSSL AES-256 encryption 加密與解密文字指令的用法,openssl AES 加密文字指令如下,-a 表示以文字格式輸出 (base64格式),預設不指定 -pass 帶入密碼的話,他會跳出提示訊息讓你輸入密碼,

1
2
3
4
$ echo "Hello World" | openssl aes-256-cbc -pbkdf2 -a
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
U2FsdGVkX19X1Q1t2NbuTdc4xjRr21ZGQ0BZ4rYy8qs=

openssl AES 解密文字的話就使用下列指令,加密時有加 -a 選項的話解密也要有 -a 選項,

1
2
3
$ echo "U2FsdGVkX19X1Q1t2NbuTdc4xjRr21ZGQ0BZ4rYy8qs=" | openssl enc -aes-256-cbc -pbkdf2 -a -d
enter aes-256-cbc decryption password:
Hello World

加入 -pass 選項的話可以設定密碼,以下範例密碼為 “shengyutalk”,

1
2
$ echo "Hello World" | openssl enc -aes-256-cbc -pbkdf2 -a -pass pass:shengyutalk
U2FsdGVkX19M0vfdhjcNiBW0OHrwdQYWMnOUJ6UvOL0=

解密時也可以加入 -pass 參數設定解密密碼,

1
2
$ echo "U2FsdGVkX19M0vfdhjcNiBW0OHrwdQYWMnOUJ6UvOL0=" | openssl enc -aes-256-cbc -pbkdf2 -a -d -pass pass:shengyutalk
Hello World

以上就是 OpenSSL AES encryption 對稱式加密指令用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
openssl-enc man 1.0.2
openssl-enc man 1.1.1
openssl-enc man 3.0
encryption - How to use OpenSSL to encrypt/decrypt files? - Stack Overflow
https://stackoverflow.com/questions/16056135/how-to-use-openssl-to-encrypt-decrypt-files
encryption - OpenSSL 1.1.1b warning: Using -iter or -pbkdf2 would be better while decrypting a file encrypted using OpenSSL 1.1.0g - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/507131/openssl-1-1-1b-warning-using-iter-or-pbkdf2-would-be-better-while-decrypting
(討論 OpenSSL 1.1.1 之前舊版本的 bug,建議要裝有 -pbkdf2 選項的 OpenSSL 版本。)
OpenSSL 對稱式、非對稱式加密檔案指令教學與範例
https://officeguide.cc/linux-openssl-file-symmetic-asymmetric-encryption-commands-tutorial-examples/

其它相關文章推薦
C/C++ OpenSSL AES encryption/decryption 加密解密範例
macOS 2 種安裝 OpenSSL 的方法
Ubuntu 2 種安裝 OpenSSL 的方法