重用 IV 但仍然生成不同的程式碼?
我正在上初學者的密碼學課程,我試圖弄清楚我是否做錯了什麼,或者我只是不明白為什麼會這樣。
我創建了一個 124 字節的簡單 .txt 文件,並使用 AES-CBC 對其進行了三次加密:兩次使用相同的 IV 為“135797531”,一次使用不同的 IV 為“246808642”。我也對所有這些都使用了相同的密碼。然後我在十六進制編輯器中打開所有加密文件以分析內容,我看到——除了標題字節之外——每個文件的程式碼完全不同。即使是那些使用相同 IV 的人。我的印像是,如果我使用相同的 IV 和密碼對文件進行兩次加密,那麼它們都會產生相同的程式碼,這就解釋了為什麼每次 IV 都應該不同。但是就我所擁有的而言,即使我知道情況並非如此,它看起來也並不重要。我做錯了什麼,還是有其他解釋?
編輯:使用的程式碼-
openssl enc -aes-128-cbc -e -in text1.txt -out text2.txt -k '0123456789' -iv '135797531'
CBC 模式的屬性僅特定於您實際使用為 AES-CBC 指定的密鑰和 IV 時。這意味著,使用 128、192 或 256 位密鑰 - 通常指定為 16、24 或 32 字節 - 和 128 位密鑰 - 為 16 字節。許多工具允許使用其他參數,例如密碼。一些工具,尤其是線上工具,忘記提及它們允許與直接鍵和 IV 不同的參數,因為它們是由完全工具編寫的。
如果您使用密碼而不是密鑰,則很可能使用基於密碼的密鑰派生方法來派生密鑰。這些 PBKDF 通常使用隨機鹽,並且可能使用工作因子或迭代計數。因為鹽每次都不同,派生的密鑰也每次都不同。因此,在這種情況下,您的 IV 兩次相同並不重要。
同樣,如果您指定的 IV 小於 16 字節,則很可能使用了超出IV 的記憶體並且結果會有所不同。但是,在這種情況下,您將無法正確解密第一個塊。
OpenSSL 命令行 - 預設情況下 - 使用它自己的 PBKDF,
EVP_BytesToKey
使用(不安全的)單次迭代和 8 字節鹽呼叫。如果查看標題,您可以看到這一點,因為第一個字節拼寫Salted__
後跟一個 8 字節的鹽(與密文的其餘部分沒有區別)。如果要使用指定的 CBC,則必須使用(大寫)
-K
和(小寫)-iv
選項,並為密鑰使用 32、48 或 64 位十六進制數字,為 IV 使用 32 位十六進制數字。這些是二進制密鑰和 IV 的十六進製表示- 它們在使用之前被解碼openssl
為字節。所以嘗試類似:
openssl enc -aes-128-cbc -e -in text1.txt -out text2.txt -K '000102030405060708090A0B0C0D0E0F' -iv '000102030405060708090A0B0C0D0E0F'
反而。當然,無論您想嘗試什麼鍵和IV。