Aes

OpenSSL aes-128-cfb 不會產生預期的大小

  • August 19, 2020

我嘗試自己實現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 -ivIV沒有寫入輸出文件的情況下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)

引用自:https://crypto.stackexchange.com/questions/83419