PKCS#7 Padding
PKCS#7パディングは、平文の末尾に値nのバイトをn個(1 ≤ n ≤ ブロックサイズ)付加する。可逆かつ自己検証可能であり、CBCモードの事実上の標準パディングである。
目的
可逆で検証可能なパディングを提供し、復号側が真の平文長を判定してパディングエラーを検出できるようにする。
メカニズム
平文長がブロックサイズの倍数のときも、可逆性を保つため値がブロックサイズのパディングブロック1つ分を付加する。復号時は末尾バイトの値nを読み、末尾nバイトがすべてnと等しいことを確認してから除去する。検証失敗は暗号文の破損または改ざんを示す。
ユースケース
- AES-CBCのデフォルトパディング
- CMS/PKCS#7のメッセージ形式
- JavaのPKCS5Padding(PKCS7と同等)
- OpenSSLのデフォルトパディング
例
- 入力
block=16, data=13 bytesOutputappends 03 03 03Pads with three 0x03 bytes
よくあるエラー
- Non-constant-time padding verification falls to Padding Oracle attacks
- Use AEAD, or compare padding in constant time
関連用語
Padding
パディングは、平文をブロック境界まで伸長する仕組みである。代表的な方式はPKCS#7、ゼロパディング、ISO 10126で、AEADモードでは不要である。 用語集
CBC (Cipher Block Chaining)
CBC モードは、暗号化前に直前の暗号文ブロックと現在の平文ブロックを XOR するため、同一の平文ブロックも異なる暗号文になる。ランダムな IV が必要である一方、完全性の認証は提供しない。 用語集
Block Cipher
ブロック暗号は固定長のブロック(例: 128 ビット)を暗号化・復号する対称暗号であり、任意長のデータを扱うには運用モードが必要である。 用語集