Padding

當給出一個奇怪的數據時,通常如何使用 PKCS5/7?

  • September 14, 2018

PKCS5/7 用二進製表示需要填充多少空間來填充剩餘的數據元素。這是有用且緊湊的,但在下面的範例場景中我應該怎麼做?

範例:案例場景是使用 AES 或任何固定長度的 128 位分組密碼來加密使用者提供的數據,其中使用者可以控制發送的字節,並且不限於任何類型的語言格式(即 UTF-8)。

使用者發送以下字節05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05(160x05個字節)在 AES 加密之前進行 PKCS5/7 編碼。PKCS 5/7 編碼器不會做任何事情,因為它具有全部 16 個字節(AES 密碼需要 1 個塊大小)。

當使用者想要解密數據時,AES解密成功但PKCS5/7填充引擎看到05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05(16個0x05字節)。

如果0x05刪除了 5 個字節並僅返回 110x05個字節,這將意味著原始數據05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05將在 PKCS 解碼器級別損壞。

在解碼數據時,處理具有 PKCS5/7 填充方案中所有相同元素的數據數組的最佳方法是什麼?

PKCS 5/7 編碼器不會做任何事情,因為它具有全部 16 個字節(AES 密碼需要 1 個塊大小)。

那就是你錯了。

應始終應用填充。如果使用者正在加密一個已經是塊大小倍數的明文,那麼 PKCS#5/#7 填充方案將添加一個額外的完整填充塊,以便在解密時沒有歧義。

在您的範例中,這意味著這是加密的填充明文:

05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

當然也有不添加額外塊的填充方案(例如 PHP 的零填充),但這不是 PKCS#5 或 PKCS#7 的工作方式。

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