Aes

如果鹽改變了為什麼不能用 OpenSSL 解密(對於 CBC 和 ECB)

  • May 13, 2019

使用 Linux 命令使用 OpenSSL(例如,AES 256 位模式 CBC)加密的文件

openssl enc -aes-256-cbc -in texte -out encrypted_texte -k password

在前 16 個字節中有一個鹽 - 字節 8-15 是鹽本身。解密文件時,如果修改了salt,OpenSSL會拋出一個

bad decrypt 140338977786624:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:520:

錯誤,而如果文件在 CFB 模式下加密,則不會給您該錯誤。

為什麼會這樣?與其他直接失敗的塊密碼加密模式相比,CFB 有什麼不同,以便在修改 salt 時不會產生錯誤?是否與填充有關(CBC 和 ECB 確實使用填充)?

這是我正在嘗試做的一個範例:使用dd,鹽中僅更改了一個字節。嘗試解密時,openssl拋出錯誤。

echo 'spam' > food.txt
openssl enc -aes-256-cbc -in food.txt -out food.enc -k IDONTLIKENOSPAM!
printf '?' | dd of=food.enc bs=1 seek=12 count=1 conv=notrunc &> /dev/null
openssl enc -d -aes-256-cbc -in food.enc -out food.bad -k IDONTLIKENOSPAM!

在您的命令中:

openssl enc -aes-256-cbc -in texte -out encrypted_texte -k password

提供了一個密碼,該密碼將用於派生密鑰和 IV 以進行加密。為此目的,儲存在文件中的鹽與您的密碼一起使用。因此,當您更改鹽時,您將在解密過程中獲得不同的 IV 和不同的密鑰,而不僅僅是 IV。然後,您將在 CBC 和 ECB 等塊模式下解密時遇到問題,因為解密後的明文中的填充將不正確(使用錯誤的密鑰解密)。在像 CFB 這樣的流模式下,沒有填充,所以修改鹽不會導致問題,但你會得到錯誤的明文。

編輯添加:EVP_BytesToKey()函式用於將密碼和鹽轉換為密鑰和 IV。

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