在資訊安全領域裡,我們常常會聽到「數位信封 (Digital Envelope)」。它不是一種演算法,而是一種 混合加密 (Hybrid Encryption) 的應用方式:同時利用對稱式與非對稱式加密的優點,兼顧效能與安全性。這篇文章會介紹概念,並透過 OpenSSL 手把手示範。
單純使用 對稱式加密 (AES/3DES) 可以快速處理大檔案,但金鑰的分送是問題。
單純使用 非對稱加密 (RSA/ECC) 雖然方便傳遞金鑰,但加大檔案效能差。
數位信封的解法:
收件人收到後:
這個封裝在標準裡就是 PKCS#7 (CMS, Cryptographic Message Syntax) 的 EnvelopedData。
先建立測試用的金鑰與憑證,模擬「收件人」身分。我們需要私鑰與憑證。
# 產生私鑰
openssl genpkey -algorithm RSA -out private.pem
# 產生憑證
openssl req -new -x509 -key private.pem -out cert.pem -days 365
到這裡,我們就有:
private.pem
→ 收件人的私鑰(收件人自己保管)cert.pem
→ 收件人的憑證(公開給發件人加密用)假設要加密的檔案是 plain.txt
。
openssl smime -encrypt -aes256 -in plain.txt -out encrypted.p7m -outform PEM cert.pem
參數解釋:
-encrypt
→ 建立 EnvelopedData-aes256
→ 對稱加密演算法使用 AES-256cert.pem
→ 收件人憑證,裡面的公鑰會用來加密 AES 金鑰encrypted.p7m
→ 數位信封檔案收件人用自己的私鑰來解密:
openssl smime -decrypt -in encrypted.p7m -inform PEM \
-inkey private.pem -recip cert.pem -out decrypted.txt
解釋:
-inkey private.pem
→ 使用收件人的私鑰解密 AES 金鑰-recip cert.pem
→ 指定收件人憑證,方便匹配封裝資訊,可省略-out decrypted.txt
→ 還原原始內容如果要同時傳給 Alice 與 Bob,只需把兩份憑證都放進指令即可:
openssl smime -encrypt -aes256 -in plain.txt -out encrypted.p7m -outform PEM \
alice_cert.pem bob_cert.pem
內容只會加密一次,但封裝中會有兩份「被公鑰加密的 AES 金鑰」,Alice 或 Bob 都能用各自私鑰解開。
這家是台北市區連鎖的豬腳店,居然有麻辣滷肉飯,腿庫、豬腳、滷肉都好吃