パディングとは
パディング(Padding)は、ブロック暗号において平文をブロックサイズの倍数に調整するための埋め草(パッド)です。AESのブロックサイズは128ビット(16バイト)であり、平文が16バイトの倍数でない場合、パディングを追加して調整します。
パディングが必要な場面:
- ブロック暗号のCBCモード:平文をブロック単位で処理
- RSA暗号:固定長のブロック処理
- デジタル署名:ハッシュ値の調整
主なパディング方式
PKCS#7(PKCS#5)パディング
最も一般的なパディング方式です。不足バイト数の値でパディングします。
ブロックサイズ: 16バイト
平文: "Hello" (5バイト)
パディング: 11 11 11 11 11 11 11 11 11 11 11 (11個の0x0B)
結果: "Hello" + 11個の0x0B = 16バイト
平文が16バイトぴったりの場合:
追加: 16個の0x10 (完全な1ブロック分のパディング)
# Pythonでのパディング実装
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
def add_pkcs7_padding(data: bytes, block_size: int = 128) -> bytes:
"""PKCS#7パディングを追加"""
padder = padding.PKCS7(block_size).padder()
return padder.update(data) + padder.finalize()
def remove_pkcs7_padding(padded_data: bytes, block_size: int = 128) -> bytes:
"""PKCS#7パディングを除去"""
unpadder = padding.PKCS7(block_size).unpadder()
return unpadder.update(padded_data) + unpadder.finalize()
# 使用例
plaintext = b"Hello, World!"
padded = add_pkcs7_padding(plaintext)
print(f"Padded length: {len(padded)}") # 16
OAEPパディング(RSA用)
RSA暗号に推奨されるパディング方式です。ランダム性を導入してセキュリティを強化します。
from cryptography.hazmat.primitives.asymmetric import padding as asym_padding
from cryptography.hazmat.primitives import hashes
# RSA暗号化でOAEPを使用
ciphertext = public_key.encrypt(
plaintext,
asym_padding.OAEP(
mgf=asym_padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
AIエンジニアとしての実体験
AIモデルの暗号化システムを実装する際、AES-GCMモードを選択することで、パディングの問題を回避しました。GCMモードはストリーム暗号として動作するため、パディングが不要です。
# AES-GCMはパディング不要
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
key = os.urandom(32)
nonce = os.urandom(12)
aesgcm = AESGCM(key)
# 任意の長さの平文を暗号化可能
plaintext = b"Any length data"
ciphertext = aesgcm.encrypt(nonce, plaintext, None)
自社サーバー運用への応用
パディングの選択ガイドライン
- AES-GCM/ChaCha20-Poly1305:パディング不要(推奨)
- AES-CBC:PKCS#7パディングを使用
- RSA:OAEPパディングを使用(PKCS#1 v1.5は非推奨)
関連ブログ記事
📝 関連記事
最新動向(2026年)
AEADモードの普及
AES-GCM、ChaCha20-Poly1305などのAEAD(認証付き暗号)モードが標準となり、パディング問題が減少しています。TLS 1.3ではCBCモードが廃止されました。
パディングオラクル攻撃への認識向上
POODLE、Lucky Thirteen、Bleichenbacher攻撃などの事例を受け、パディングエラーの扱いに対する認識が向上しています。
トラブル事例と対策
🚨 パディングオラクル攻撃
問題:復号時のパディングエラーを外部に漏らすと、攻撃者が平文を復元可能
対策:AEADモード(GCM)を使用。CBCを使う場合はEncrypt-then-MACを採用
⚠️ RSA PKCS#1 v1.5パディング
問題:Bleichenbacher攻撃により復号が可能になる場合がある
対策:RSAにはOAEPパディングを使用
権威あるリソース
- RFC 8018 - PKCS #5/PKCS #7
- RFC 8017 - PKCS #1 (RSA Cryptography)
- The Padding Oracle Attack (BEAST, POODLE)
