Padding

為什麼要驗證填充?

  • September 9, 2014

每當使用塊密碼解密密文時,我們都需要刪除填充。添加填充有不同的方法,但它們通常將最後一個塊的最後一個字節設置為已添加和需要刪除的填充字節數(例如,我們添加了 5 個字節,因此我們將最後一個字節設置為 0x05)。

我的問題是:為什麼我們需要驗證填充?為什麼不讀取最後一個字節,從消息中刪除那麼多字節,然後完成它呢?

發出填充錯誤有時會擷取完整性問題,但會引發諸如Padding Oracle之類的攻擊,它能夠在某些情況下檢索整個明文。在我看來,這是一個可怕的權衡。填充驗證背後的原因是什麼?

首先,更常見的填充方案將添加 5 倍相同的字節 0x05(在您的範例中),因此檢查不僅刪除了 5 個字節,而且還檢查了它之前的 4 個字節是否具有相同的值。但是讓我們暫時假設您的方案(未指定:在字節之前放入什麼?零或隨機值?)。

如果你不能刪除那麼多字節怎麼辦?您是否允許超過塊長度的最終字節(因此刪除多個塊)?(TLS 會這樣做。)您是否只是丟棄數據?但這也是可以觀察到的,可能。如果最終輸出的長度以某種方式可以觀察到,那麼您會洩漏最後一個塊的最後一個字節,這也可以用於填充 oracle 樣式攻擊。

通常,使用加密 MAC 來保護您的密文,並首先對其進行驗證。發出這些錯誤。然後根本不應該發生填充錯誤。

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