Aes

AES-CBC 是否總是使用 PKCS#7?

  • May 12, 2020

我需要在我們的軟體中添加256位密鑰的AES解密,當然我自己不會做;相反,我選擇了一個可以很好地滿足我們需求的庫。它支持各種操作模式,我需要的是 CBC(我知道 GCM 會更好,但我們從舊硬體獲取數據,這就是它使用的方式。硬體將在幾年內得到更新……) .

但是,該庫始終(例如,無法更改它,它在加密和解密常式中硬編碼)使用 PKSC#7 進行填充。AES-CBC 是否總是使用這種填充,或者它只是庫的一種快捷方式,因為 PKCS#7 在這種算法中無處不在,以至於它已成為事實上的標準,此時使用其他任何東西都是不可想像的?

AES-CBC 是否總是使用 PKCS#7 填充?

沒有。其他常見或合理的填充物包括

  • 無填充,其中明文的長度已知為 16 字節的倍數。
  • 位填充,其中明文被視為位流,它在 處附加一個位1,然後在 0 到 127 位處附加0以到達塊邊界。使用大端字節,即在 0x80 處附加一個字節,然後在 0x00 處附加 0 到 15 個字節。
  • 零填充(與上面沒有初始的 相同1),適用於已知使用明文的內容會忽略額外的零位的情況,壓縮音頻/影片/圖像通常是這種情況。

在我過去聽說過的填充中(但從未有意識地與 AES 結合使用),有ESP 填充CipherText Stealing。其他人知道的更多


AES-CBC 庫可用於獲得沒有填充的加密,即使它是硬連線的,通過送出長度為塊大小倍數的明文並刪除最後一個密文塊。

這種帶有硬連線填充的庫也可以強制忽略解密時的填充。如果庫是為動態解密而設計的,這很容易:只是不要告訴它已經到達輸入的結尾。否則,一個選項是在加密模式下使用庫來加密具有相同密鑰的空明文,獲取 32 字節的結果密文 $ C’_0\mathbin|C’_1 $ (在哪裡 $ C’_0 $ 是IV,零就可以了)然後在最後一個塊之後 $ C_k $ 實際密文的附加一個額外的塊 $ C_k\oplus C’_0\oplus C’_1 $ 在使用庫進行解密之前。這將確保填充檢查通過,並產生一個沒有填充的解密明文。

在沒有填充的加密或解密之上,很容易建構任何填充。

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