Padding

填充超過 255 個字節的普遍接受的方法是什麼?

  • January 11, 2017

今天有很多流行的填充方案在使用。我想到了 ANSI X.923 和 PKCS#7。但是,它們都一次只處理單個字節。這並不奇怪:用於加密目的的填充通常只有 16 個字節,單個字節可以保存值 255。

我想知道當我們需要添加超過 255 個字節的填充時,是否有任何普遍接受的填充方法。PKCS#7 顯然不起作用,因為通常每個字節都必須有多個字節。ANSI X.923 可以稍作修改以在末尾使用多於一個字節來儲存填充的長度,但這也有其自身的問題,即它不適用於每種輸入組合,除非你做一些手動處理邊緣情況的骯髒解決方法,即使那樣我也懷疑它是否有效。

我想出的解決方案是簡單地執行 PKCS#7 多次。我的意思是如果我們想要填充 300 個字節,然後正常填充到 255(通過添加 255 個字節的值 255),然後再次填充到 300(通過添加 45 個字節的值 45)。取消填充時,您只需刪除 45 個字節的頂層,檢查接下來的 255 個值是否都是 255,如果是,則將它們全部刪除,然後重複。

但是,我找不到與此類似的任何內容,因此提出了這個問題。有沒有一種標準化的、被接受的方式?

位填充是執行此操作的一種方法。還有一些填充方案使用特殊的長度編碼進行填充。這可以更有效,因為您不必解析所有字節。但總的來說,位填充就足夠了。

位填充首先(並且總是)向明文添加一個值為 1 的位。然後它將值為零的位添加到右側,直到您需要的長度。它在內部廣泛用於雜湊算法,但有時也用於塊密碼。取消填充包括從右側刪除所有零位,然後將一位設置為 1。這種填充方案是完全確定的;它根本不依賴於明文。

以字節為單位,您將獲得以下值:

6F 77 6C 73 74 65 61 64 - 80 00 00 00 00 00 00 00

用於填充值

6F 77 6C 73 74 65 61 64

最多 16 個字節(塊大小)。

這意味著一位設置為 1(字節 7,通常是最高位),7 個零位以構成一個完整字節,然後是任意數量的零值字節。

很容易看出,您可以將它用於任何大小的輸入和任何大小的填充。


該方案的一種變體是簡單地填充作為明文最後一位的補碼的位。然後您可以刪除與最後一位相同的位。然而,該方案依賴於明文,這使得它更加麻煩。

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