Implementation
使用 aes-cbc 時是否可以將填充長度以及明文長度視為公共資訊?
現在我正在使用一個簡單的填充系統,它採用明文,用 SHA512 對其進行雜湊處理,然後附加 $ x $ 雜湊的字節作為填充 where $ x $ 是明文和最近的塊大小倍數之間的增量。
這被認為是填充消息的安全方法嗎?我也在使用 HMAC-SHA512 對加密數據進行身份驗證,這會影響安全性嗎?
如果您不介意洩露一些有關明文大小的附加資訊,則可以公開填充的大小。然而,使用散列作為填充字節是沒有意義的;您不能將雜湊用作身份驗證標籤或檢查完整性,因此雜湊計算變得虛假。它甚至可能通過側通道洩漏數據。在最好的情況下,它只是消耗 CPU 資源而沒有完成任何事情。
最好使用經過審查的填充方法,例如 PKCS#7 或位填充。他們可能會更多地使用密文塊,但否則實施會佔用資源。然而,這兩種填充方法都容易受到填充預言攻擊。因此,您應該在密文上生成 MAC 或 HMAC(使用第二個密鑰)。您還應該在 MAC 計算中包含所有公共資訊。
或者,您可以使用零字節填充和填充或純文字長度指示字節,因為這可以為您節省要加密的字節塊。在這種情況下,您絕對應該在 MAC 計算中包含長度指示符,否則攻擊者可能會通過簡單地更改長度指示符來欺騙您從純文字中添加或刪除字節。
最後,您當然可以在計數器模式下使用分組密碼,可能使用經過身份驗證的方案,例如 GCM。這將使您完全擺脫填充(明文大小是密文大小),並會生成一個消息身份驗證標籤,而不必求助於兩個單獨的密鑰。與 MAC 計算一樣,您應該將所有公共數據作為附加認證數據 (AAD) 包括在內。此外,您應該確保永遠不要重複 nonce/IV。您也不需要單獨的 nonce 和 IV。