Intro
一般所謂的對稱金鑰演算法,以區塊加密演算法為主,演算法如AES或DES。
區塊加密工作模式:所謂的Mode,如ECB、CBC、PCBC、CFB、OFB和CTR。延伸出初始向量(IV)
ECB,CBC,OFB,CFB,CTR和XTS模式僅僅提供了機密性;為了保證加密資訊沒有被意外修改或惡意篡改,需要採用分離的訊息驗證碼,例如CBC-MAC。
認證加密模式(AE,Authenticated Encryption),或稱為authenc,結合了加密和認證的單一模式。AE模式的例子包括CCM,GCM,CWC,EAX,IAPM和OCB。
Mode - 工作模式
ECB (最簡單的加密模式)
最簡單的加密模式為 ECB (Electronic codebook):每個加密塊獨立加密,不須使用IV
(亦即相同內文,密文相同)
- 缺點:同樣的明文塊會被加密成相同的密文塊;
CBC (經典加密模式)
經典常用的加密模式為 CBC (Cipher-block chaining):每個明文塊先與前一個密文塊進行互斥或後,再進行加密。在這種方法中,每個密文塊都依賴於它前面的所有明文塊。同時,為了保證每條訊息的唯一性,在第一個塊中需要使用IV
。
- 缺點:加密過程是串行的,無法被並列化
CTR (串流加密模式)
計數器模式 (CTR) 通過對計數器(Counter)進行加密,並將加密結果與明文進行 XOR 操作來生成密文。
加密過程中,首先生成初始計數器(IV 或 Nonce),並將其與密鑰一起加密,然後逐個增量加密計數器(或可並行處理),從而避免重複的加密結果。
- 優點:與 CBC 模式相比,CTR 模式支持並行處理,顯著提升效能。
GCM (CTR + MAC)
GCM (Galois/Counter Mode) 結合了 CTR (計數器模式) 進行加密,並使用 Galois 領域的認證碼(MAC) 來提供數據的 完整性 和 認證。
GCM 算法提供數據的真實性(與完整性) 以及機密性的驗證,採用的是一種基於關聯資料的認證加密 (AEAD) 方法。
這表示它的輸入包括:密鑰 K、明文 P,以及一些附加資料(Associated Data,以下簡稱 AD)。
加密時,使用密鑰對明文 P 進行加密以產生 密文 C,並根據 C 和 AD(未加密)計算出一組 認證標籤 T。
擁有密鑰 K 的接收端,在接收到 AD、C(密文)以及 T(認證標籤)後,可以解密密文還原出明文 P,並透過驗證 T 來確認密文和 AD 在傳輸過程中是否遭到篡改。
- 優點: CTR 效能 + 內建 MAC 簽章機制
AEAD 帶有關聯資料的認證加密
Authenticated encryption with associated data,AEAD 主要目的在於同時提供 訊息的機密性(防止未授權的存取)和 完整性(防止訊息被篡改)保護。
分別有三種認證加密的方法:
- Encrypt-then-MAC (EtM)
- Encrypt-and-MAC (E&M)
- MAC-then-Encrypt (MtE)
IV - 初始向量
Padding - 填充
部分模式(即ECB和CBC)因塊密碼只能對確定長度的資料塊進行處理,需要最後一塊在加密前進行填充。
CFB,OFB和CTR模式不需要對長度不為密碼塊大小整數倍的訊息進行特別的處理。
實作
OpenSSL指令
// Encrypt with EBC
$ openssl enc -aes-256-ecb -in plaintext.txt -out encrypted.txt -k YourSecretKey
// Decrypt with EBC
$ openssl enc -d -aes-256-ecb -in encrypted.txt -out decrypted.txt -k YourSecretKey
// Encrypt with CBC (auto IV)
$ openssl enc -aes-256-cbc -in plaintext.txt -out encrypted.txt -k YourSecretKey
// Decrypt with CBC (auto IV from chipherText)
$ openssl enc -d -aes-256-cbc -in encrypted.txt -out decrypted.txt -k YourSecretKey
// Encrypt with CBC (IV in hex format)
$ openssl enc -aes-256-cbc -in plaintext.txt -out encrypted.txt -k YourSecretKey -iv 00112233445566778899aabbccddeeff
// Decrypt with CBC (IV in hex format)
openssl enc -d -aes-256-cbc -in encrypted.txt -out decrypted.txt -k YourSecretKey -iv 00112233445566778899aabbccddeeff
Key 參數
-k <password>
省略的話會用對話模式要求輸入Key。需要 IV 的演算法,加密時若沒有指定 IV 則自動產生的 IV 會加到密文 prefix