Aes
如果鹽改變了為什麼不能用 OpenSSL 解密(對於 CBC 和 ECB)
使用 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。