Encryption
暗号化 (Encryption)は、平文 を暗号文 に変換 するプロセスで、鍵 がなければ復元 できません。
Block Cipher ブロック暗号
ブロック暗号 は、データを固定 サイズのブロック(AESは16 bytes)に分割 し、ブロックごとに暗号化 します。
暗号化モード比較
Mode of Operations: ECB / CBC / CFB / OFB / CTR / GCM
| AES Mode | Padding必要 | 暗号化後の長さ特性 | 復号時Unpad必要 | IV必要 | AAD対応 | 暗号化後の出力構成 | 備考 |
|---|---|---|---|---|---|---|---|
| ECB | ✅ 必要 | Block Sizeの倍数(16n) | ✅ 必要 | ❌ 不要 | ❌ 非対応 | Ciphertext | 各ブロック独立 → 同じ平文は同じ暗号文、パターン分析攻撃に脆弱、非推奨 |
| CBC | ✅ 必要 | Block Sizeの倍数(16n) | ✅ 必要 | ✅ 必要 | ❌ 非対応 | IV + Ciphertext | 初期IVはランダム生成、復号時に必要、ECBより安全 |
| CFB | ❌ 不要 | 平文と同じ長さ(n) | ❌ 不要 | ✅ 必要 | ❌ 非対応 | IV + Ciphertext | バイト単位のストリーム暗号化に適合、前の暗号文ブロックを入力として使用 |
| OFB | ❌ 不要 | 平文と同じ長さ(n) | ❌ 不要 | ✅ 必要 | ❌ 非対応 | IV + Ciphertext | CFBに類似、暗号化後のIVを次の入力として使用、安定性が高い |
| CTR | ❌ 不要 | 平文と同じ長さ(n) | ❌ 不要 | ✅ 必要(Counter) | ❌ 非対応 | Nonce + Counter + Ciphertext | ブロック暗号をストリーム暗号としてシミュレート、非同期暗号化/復号化に対応 |
| GCM | ❌ 不要 | 平文 + 16 bytes Tag | ❌ 不要 | ✅ 必要 | ✅ 対応 | IV + Ciphertext + Tag | 暗号化と認証(AEAD)、AAD対応、API / JWT / HTTPSなど安全な転送に最適 |
用語説明
| 用語 | 説明 |
|---|---|
| IV(Initialization Vector) | 初期化ベクトル、同じ平文でも毎回異なる暗号化結果を保証、通常ランダム生成 |
| Padding | 16 bytesに揃えるため、PKCS#7 / ZeroPaddingなどの方式で埋める |
| Tag(認証タグ) | GCMモードで暗号文とAADの改ざんを検証、復号時に検証失敗するとエラー |
| AAD(Additional Authenticated Data) | 追加認証データ、暗号化されないが署名で検証される(APIヘッダー、ユーザーIDなど) |
| Nonce / Counter | CTR / GCMモードのカウンター(またはランダム値)、IVと同様の役割、予測可能で増加可能 |
モード選択の推奨
| 使用シーン | 推奨モード |
|---|---|
| 静的データ暗号化(頻繁に変更しない) | CBC + PKCS7 padding(IV管理が必要) |
| 動的転送(API / Websocket) | ✅ GCM(認証Tag付き、高セキュリティ) |
| 非同期暗号化/復号化(マルチスレッド / キャッシュ) | ✅ CTR / GCM |
| ハードウェアアクセラレーション対応 | ✅ GCM(ほぼすべての現代ハードウェア/SDKが対応) |
| 機密性が必要だが暗号文の重複を気にしない | CFB / OFBを使用可能 |
暗号化モード図解
ECB(Electronic CodeBook Mode)
Plain Block 1 Plain Block 2 Plain Block 3
| | |
v v v
+----------+ +----------+ +----------+
| Encrypt | | Encrypt | | Encrypt |
+----------+ +----------+ +----------+
| | |
v v v
Cipher Block 1 Cipher Block 2 Cipher Block 3各 ブロックは独立 して暗号化 され、同 じ平文 は同 じ暗号文 を生成 するため、分析 されやすい。
CBC(Cipher Block Chaining Mode)
IV -----> XOR <---- Plain Block 1
|
v
+----------+
| Encrypt |
+----------+
|
v
Cipher Block 1 -----> XOR <---- Plain Block 2
|
v
+----------+
| Encrypt |
+----------+
|
v
Cipher Block 2 -----> XOR <---- Plain Block 3
|
v
+----------+
| Encrypt |
+----------+
|
v
Cipher Block 3各 ブロックの暗号化 は前 の暗号文 ブロックに依存 し、初期化 にIVが必要 。
Stream Cipher ストリーム暗号
ストリーム暗号 は、ビット単位 またはバイト単位 でデータを処理 し、リアルタイム暗号化 シーンに適 しています。CTRモードはブロック暗号 をストリーム暗号 としてシミュレートできます。
MAC(Message Authentication Code)
メッセージ認証 コードは、メッセージの完全性 と送信元 の真正性 を確認 するために使用 されます。
- HMAC:ハッシュ関数 を使用 (HMAC-SHA256など)
- CMAC:ブロック暗号 を使用 (AES-CMACなど)
GCMモードには内蔵 のMAC機能 があり、AEAD(Authenticated Encryption with Associated Data)を提供 します。
E2EE(End-to-End Encryption)
エンドツーエンド暗号化 は、通信 する両者 のみがメッセージ内容 を読 めることを保証 し、中間 のサーバーは復号 できません。
一般的 な用途 :
- インスタントメッセージング(Signal、WhatsApp)
- セキュアメール(ProtonMail)
- ビデオ会議 (Zoom E2EE)