暗号の基礎(Cryptography)
暗号の目的
暗号は CIAトライアド の実現手段として機能する。
| 暗号の機能 | 実現するCIA目標 | 代表的な技術 |
|---|---|---|
| 機密性の確保 | Confidentiality | AES, RSA, ECDH |
| 完全性の検証 | Integrity | HMAC, デジタル署名 |
| 否認防止 | Integrity | デジタル署名 |
| 認証 | Confidentiality + Integrity | TLS, PKI |
対称暗号(Symmetric Encryption)
同じ鍵で暗号化・復号する方式。
平文 ──[共有鍵で暗号化]──▶ 暗号文 ──[同じ共有鍵で復号]──▶ 平文
特徴
- 高速(非対称暗号の1000倍以上)
- 鍵配送問題:通信前に安全に鍵を共有する方法が必要
- 用途:大量データの暗号化(ファイル、ディスク、通信コンテンツ)
代表的アルゴリズム
| アルゴリズム | 鍵長 | 状態 |
|---|---|---|
| AES-128/256 | 128/256 bit | 推奨(NIST標準) |
| ChaCha20 | 256 bit | 推奨(TLS 1.3でも使用) |
| 3DES | 168 bit | 非推奨(2023年にNISTが廃止) |
| DES | 56 bit | 禁止(56bitは総当たり可能) |
暗号利用モード
同じ平文ブロックを同じ暗号文にしてしまう ECB モードは危険。
【ECBモードの危険性】
同じブロック → 同じ暗号文ブロック → パターンが漏洩する
(Linuxペンギン画像の例が有名: ECB暗号化してもペンギンの輪郭が見える)
【推奨モード】
AES-GCM : 機密性 + 完全性(認証付き暗号)→ TLS 1.3 で使用
AES-CBC : IVが必要、パディングオラクル攻撃に注意
ChaCha20-Poly1305: AES-GCMの代替、サイドチャネル攻撃に強い
非対称暗号(Asymmetric Encryption)
公開鍵と秘密鍵のペアを使う方式。鍵配送問題を解決する。
【暗号化】 送信者が受信者の公開鍵で暗号化 → 受信者が秘密鍵で復号
【署名】 送信者が自分の秘密鍵で署名 → 受信者が送信者の公開鍵で検証
代表的アルゴリズム
| アルゴリズム | 用途 | 状態 |
|---|---|---|
| RSA-2048/4096 | 暗号化・署名 | 推奨(2048bit以上) |
| ECDSA(P-256, P-384) | 署名 | 推奨(RSAより短い鍵で同等安全性) |
| Ed25519 | 署名 | 推奨(高速・安全・実装しやすい) |
| ECDH / X25519 | 鍵交換 | 推奨(TLS 1.3 で使用) |
| RSA-1024 | - | 禁止(解読可能) |
なぜ非対称暗号だけで通信しないのか
非対称暗号は低速なため、実際の通信ではハイブリッド暗号を使う。
1. 非対称暗号(ECDH)で「セッション鍵(共有鍵)」を安全に交換する
2. 以降の通信は高速な対称暗号(AES-GCM)でセッション鍵を使って暗号化する
これが TLS の基本的な仕組みでもある。
ハッシュ関数(Hash Function)
任意長のデータを固定長のダイジェストに変換する一方向関数。
入力 ──[ハッシュ関数]──▶ ダイジェスト(固定長)
"hello" → 2cf24dba... (256bit)
"Hello" → 185f8db3... (256bit) ←1文字違うだけで全く異なる値(雪崩効果)
安全なハッシュ関数の要件
| 要件 | 説明 |
|---|---|
| 一方向性 | ダイジェストから入力を復元できない |
| 衝突耐性 | 異なる入力から同じダイジェストが生成されない |
| 雪崩効果 | 入力の小さな変化がダイジェスト全体に影響する |
代表的アルゴリズム
| アルゴリズム | ダイジェスト長 | 状態 |
|---|---|---|
| SHA-256 / SHA-3 | 256 bit | 推奨(NIST標準) |
| SHA-512 | 512 bit | 推奨(長いダイジェストが必要な場合) |
| BLAKE3 | 可変 | 推奨(非常に高速) |
| SHA-1 | 160 bit | 禁止(2017年にGoogleがCRC衝突攻撃を実証) |
| MD5 | 128 bit | 禁止(衝突攻撃が実用的に可能) |
ハッシュの用途
【パスワード保存】
NG: SHA-256(password) → 高速なため総当たりに弱い
OK: bcrypt / Argon2id(password) → 意図的に低速 + ソルトで虹の表を無効化
【HMAC(改ざん検知)】
HMAC = Hash(秘密鍵 + メッセージ)
受信者が同じ計算をして一致確認 → データの完全性と発信元を証明
【チェックサム】
ダウンロードファイルの改ざん検知(SHA-256ハッシュを公開し照合)
デジタル署名
秘密鍵で「署名」し、公開鍵で「検証」することで、否認防止と完全性を実現する。
送信者:
① メッセージのハッシュを計算
② ハッシュを秘密鍵で暗号化 → 署名
受信者:
① 受け取ったメッセージのハッシュを計算
② 署名を送信者の公開鍵で復号 → ハッシュを取得
③ ①と②のハッシュが一致すれば「改ざんなし + 本人確認OK」
PKI(Public Key Infrastructure)
公開鍵の正当性を保証する仕組み。「この公開鍵は本当にGoogleのものか」を証明する。
証明書の仕組み
CA(認証局) ──[自分の秘密鍵で署名]──▶ サーバー証明書
サーバー証明書には:
- サーバーのドメイン名
- サーバーの公開鍵
- CAの署名(改ざん検証用)
- 有効期限
ブラウザ:
① CAの公開鍵でCAの署名を検証(CAはOSやブラウザに組み込まれている)
② 署名が正しければ「この公開鍵は確かにそのドメインのもの」と信頼する
信頼チェーン(Chain of Trust)
Root CA(自己署名・OS/ブラウザに組み込み)
└── Intermediate CA(Root CAが署名)
└── End-Entity Certificate(Intermediate CAが署名)= サーバー証明書
Root CAを直接使わず中間CAを挟む理由:Root CAの秘密鍵をオフラインで保護するため。
TLS(Transport Layer Security)
インターネット通信の事実上の標準暗号化プロトコル。
ハイブリッド暗号・PKI・ハッシュ・デジタル署名をすべて組み合わせて使う。
TLS 1.3 ハンドシェイク(簡略版)
Client Server
│──[1. ClientHello]──────────▶│ 対応暗号スイート・乱数を提示
│◀──[2. ServerHello]──────────│ 暗号スイート決定・証明書送付
│◀──[3. Certificate]──────────│
│ (証明書検証) │
│──[4. Finished]──────────────▶│ 鍵交換完了
│═══════════[暗号化通信開始]═══│
TLS 1.3 の改善点(TLS 1.2比):
- 廃止されたアルゴリズム(RSA鍵交換、SHA-1)を一掃
- ハンドシェイクが1 RTT → 0 RTT(接続再開時)
- Forward Secrecy(過去の通信の保護)をデフォルト化
mTLS(Mutual TLS)
通常のTLSはサーバーの証明書だけを検証するが、
mTLSはクライアントも証明書を提示してサーバーが検証する(相互認証)。
マイクロサービス間通信やゼロトラストネットワークで使われる。
乱数とエントロピー
暗号の安全性は予測不可能な乱数に依存する。
アプリで乱数が必要な場合は必ず暗号論的に安全な疑似乱数生成器(CSPRNG)を使う。
# 危険: 予測可能
import random
token = random.token_hex(16)
# 安全: CSPRNG(OSのエントロピーソースを使用)
import secrets
token = secrets.token_hex(16)
ポスト量子暗号(Post-Quantum Cryptography)
量子コンピュータは現在の RSA・楕円曲線暗号を理論上破れる(Shorのアルゴリズム)。
NISTは2024年に量子耐性アルゴリズムを標準化した。
| アルゴリズム | 用途 | 規格 |
|---|---|---|
| ML-KEM(Kyber) | 鍵交換・暗号化 | NIST FIPS 203(2024) |
| ML-DSA(Dilithium) | デジタル署名 | NIST FIPS 204(2024) |
| SLH-DSA(SPHINCS+) | デジタル署名 | NIST FIPS 205(2024) |
大規模システムでは「Harvest Now, Decrypt Later(今収集して後で復号)」攻撃を見越し、
移行計画を今から立てることが推奨されている。
参考文献
- Jean-Philippe Aumasson『Serious Cryptography』(No Starch Press, 2017)— 数学的厳密さと実用性を両立した現代暗号の入門書
- William Stallings『Cryptography and Network Security』(Pearson, 2022)— 大学教科書レベルの体系的解説
- RFC 8446 — TLS 1.3 の公式仕様
- NIST FIPS 197 — AES の公式標準
- NIST FIPS 203/204/205(2024)— ポスト量子暗号の標準アルゴリズム
- Dan Boneh & Victor Shoup『A Graduate Course in Applied Cryptography』(スタンフォード大学、無料公開)— 応用暗号の理論的バックグラウンド
- 1. 🔒セキュリティ概要・学習ロードマップ
- 2. 🎯脅威モデリング(Threat Modeling)
- 3. 🏛️セキュリティ設計原則
- 4. 🕳️OWASP Top 10
- 5. 🔑認証・認可(Authentication & Authorization)
- 6. 🔐暗号の基礎(Cryptography)
- 7. 🌐ネットワークセキュリティ
- 8. ☁️クラウドセキュリティ
- 9. 🔄DevSecOps / Shift Left
- 10. 🚨インシデントレスポンス(Incident Response)
出典: Serious Cryptography(Jean-Philippe Aumasson, 2017)/ Cryptography and Network Security(William Stallings, 2022)/ RFC 8446(TLS 1.3)/ NIST FIPS 197(AES)