Aes
在 AES 中驗證成功解密
我有一個程序在 CBC 模式下使用 AES-256 來加密和解密文件。正如我很快意識到的那樣,AES 甚至會使用不正確的密碼來解密數據,這讓我無法驗證密碼是否正確,進而無法驗證我是否成功解密。
之前提出的一個想法是在加密數據的開頭嵌入一個已知值,以驗證解密是否產生了預期的結果。本質上,由於 IV 是一個已知值,我想簡單地對其進行散列並將其作為文件中的前 32 個字節嵌入。如果在第一個塊被解密後,前 32 個字節等於 IV 的雜湊,我們可以知道解密成功。如果沒有,我們可以知道它失敗了。
這會以任何方式損害我的加密文件嗎?
這會起作用,並且幾乎可以肯定不會對安全性產生任何負面影響,但是在消息的開頭使用一個 16 0x00 字節的字元串會更簡潔。這不僅為您省去了散列的麻煩,而且您仍處於 CBC 的標準威脅模型中,該模型假設 IV 獨立於消息塊。(人們可以提出病態但技術上仍然安全的雜湊函式,這會導致您的方法變得不安全。)
快速說明:塊大小是 16 字節,而不是 32 字節。AES-256 中的 256 是指密鑰的長度,而不是塊的長度。
您應該考慮使用消息身份驗證程式碼,例如 HMAC。這樣做不僅可以驗證正確的密碼,還可以確保密文沒有被篡改。(CBC 將阻止某人學習有關明文的資訊,但不會阻止已經知道它的人篡改密文,以便將其部分解密為他選擇的字元串。)
編輯:如果您決定使用 MAC(我認為您應該),有幾個警告:(1)對 CBC 和 MAC 使用不同的密鑰;(2) MAC 密文,而不是明文;(3) 在使用 MAC 之前將 IV 連接到密文。
如果您使用像 GCM 或 EAX 這樣的經過身份驗證的加密模式(無論如何都應該這樣做),這是一個內置功能。
否則,請使用 HMAC。