分組密碼算法的填充模式

分組密碼中,需要將明文按指定大小進行分組,由于明文并非分組加密算法塊大小的整數(shù)倍,因此在明文的最后一個分組需要將其填充至加密算法所要求的分組大小后進行加密。

在解密時,按照同樣的填充模式將填充的數(shù)據(jù)去除。

需要注意的是,如果使用了填充算法,即使明文正好是分組加密算法的整數(shù)倍時,也需要進行填充。填充后的字節(jié)數(shù)為:

\begin{cases} p + n & \text{if } p \equiv 0 \pmod {n} \\\\ \Big \lceil \cfrac {p} {n} \Big \rceil \times n & \text{if } p \not\equiv 0 \pmod {n} \end{cases}

以上 n 為分組的塊大小。

斜體表示 SunJCE 支持,非斜體為 BouncyCastle 支持

NoPadding

不填充,在此填充下原始數(shù)據(jù)必須是分組大小的整數(shù)倍,非整數(shù)倍時無法使用該模式。比如采用 GCM 加密模式時,由于 GCM 加密模式不需要進行填充,因此需要使用該填充算法。

PKCS5Padding / PKCS7Padding

填充至符合塊大小的整數(shù)倍,填充值為填充數(shù)量數(shù)

  • 原始:FF FF FF FF FF FF FF FF FF
  • 填充:FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

PKCS5Padding 的塊大小應(yīng)為 8 個字節(jié),而 PKCS7Padding 的塊大小可以在 1~255 的范圍內(nèi)。但 SunJCE 的 Provider 實現(xiàn)中 PKCS5Padding 也按 PKCS7Padding 來進行處理了。

ISO10126Padding

填充至符合塊大小的整數(shù)倍,填充值最后一個字節(jié)為填充的數(shù)量數(shù),其他字節(jié)隨機處理

  • 原始:FF FF FF FF FF FF FF FF FF
  • 填充:FF FF FF FF FF FF FF FF FF 3F 7A B4 09 14 36 07

ISO7816-4Padding

填充至符合塊大小的整數(shù)倍,填充值第一個字節(jié)為 0x80,其他字節(jié)填 0

  • 原始:FF FF FF FF FF FF FF FF FF
  • 填充:FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00 00

ZeroBytePadding

填充至符合塊大小的整數(shù)倍,填充值為 0

  • 原始:FF FF FF FF FF FF FF FF FF
  • 填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00

X923Padding

填充至符合塊大小的整數(shù)倍,填充值最后一個字節(jié)為填充的數(shù)量數(shù),其他字節(jié)填 0

  • 原始:FF FF FF FF FF FF FF FF FF
  • 填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07

TBCPadding(Trailing-Bit-Compliment)

填充至符合塊大小的整數(shù)倍,原文最后一位為“1”時填充 0x00,最后一位為“0”時填充“0xFF”

  • 原始:FF FF FF FF FF FF FF FF FF
  • 填充:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00
  • 原始:FF FF FF FF FF FF FF FF F0
  • 填充:FF FF FF FF FF FF FF FF F0 FF FF FF FF FF FF FF

PKCS1Padding

該填充模式是 RSA 加密中使用的,即 PKCS#1 1.5 版本,詳見 RFC 2313。RSA 加密時,需要將原文填充至密鑰大小,填充的格式為:

00 + BT + PS + 00 + D

  • 00 為固定字節(jié)
  • BT 為處理模式。公鑰操作時為 02,私鑰操作為 0001
  • PS 為填充字節(jié),填充數(shù)量為 k - 3 - Dk 表示密鑰長度,D 表示原文長度。PS 的最小長度為 8 個字節(jié)。填充的值根據(jù) BT 值不同而不同:
    • BT = 00 時,填充全 00
    • BT = 01 時,填充全 FF
    • BT = 02 時,隨機填充,但不能為 00

OAEP

該填充模式是 RSA 加密中使用的,即 PKCS#1 2.2 版本,詳見 RFC 8017。OAEP 填充算法較為復(fù)雜,在 Java 中使用 RSA 公鑰加密推薦使用 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 算法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容