Aes
OpenSSL aes-128-cfb 不會產生預期的大小
我嘗試自己實現aes-128-cfb進行學習。為了確認我的實現是否正確,我想用 OpenSSL 等知名庫進行驗證。但是當我嘗試使用 OpenSSL 進行加密時,我注意到了一些奇怪的事情。
我有
cleartext.txt
以下內容的文件:This is cleartext that will be used to encrypt with OpenSSL.
然後我執行這個命令
openssl enc -aes-128-cfb -in cleartext.txt -K 48656c6c6f20576f726c642041455321 -iv 72616e646f6d20313662797465206976 -out output.txt
奇怪的是輸出文件只包含 60 個字節。AES 塊是 16 個字節。以字節為單位的預期輸出大小應該是 16 的倍數。60 不是 16 的倍數。
我在這裡錯過了什麼重要的事情嗎?
因為 CFB 不需要填充類似於 CTR 和 OFB 操作模式。這些模式創建密碼塊,並且使用其中的必要數量。
- 在
openssl enc -K -iv
IV沒有寫入輸出文件的情況下output.txt
。因此它具有與明文相同的大小(以字節為單位);61
我的文件的每個字節。在這種情況下,您必須處理 IV。由於您還提供了 IV,因此請確保不再使用它。否則,在 CTR 模式或 OTP 的密鑰重用中可能會發生拖拽。- 在 的情況下
-k/-kfile/-pass
,IV 和 Key 是通過使用使用者密碼和 8 字節隨機鹽從密鑰推導方法推導出來的。OpenSSL 首先將8 字節鹽的文件魔法寫入文件,
Salted__
然後將密文寫入文件。現在輸出大小是你的magic size + salt size + data-size
. 在我的系統中,8+8+61 = 77
字節。
- 如果使用 ECB 模式
openssl enc -aes-128-ecb -in cleartext.txt -k -pass -out output.txt ```那麼`80`由於填充,大小是字節。當然,ECB 不使用 IV,應該忘記這種模式! + CBC 模式與 ECB 的結果相似。 + 派生的 IV 大小可以根據使用的加密算法(如 8 字節分組密碼 TDES 和 Blowfish 需要 8 字節 IV 和 16 字節分組密碼(如 AES)和 Twofish 需要 16 字節 IV)而改變。 使用密碼時,可能要注意密碼的熵和使用的密鑰派生方法。建議使用 Diceware 密碼,至少 PBKDF2 用於密鑰派生。OpenSSL 提供了多種[密鑰派生方法](https://wiki.openssl.org/index.php/EVP_Key_Derivation)